MAX7219单片以及级联驱动程序
点阵屏驱动程序(MAX7219)
Write_Max7219_byte(0);
Write_Max7219_byte(0);
Max7219_pinCS=1;
Write_Max7219(0,0); //清除缓冲区数据,消除显示误差
}
}
void Display_4(uchar dat)
{
uchar i;
{0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70},//C16
};
//--------------------------------------------
//功能:向MAX7219(U3)写入字节
//入口参数:DATA
//出口参数:无
//说明:
void Write_Max7219_byte(uchar DATA)
Write_Max7219_byte(0);
Write_Max7219_byte(0);
Write_Max7219_byte(0);
Write_Max7219_byte(0);
Write_Max7219_byte(0);
Max7219_pinCS=1;
Write_Max7219(0,0); //清除缓冲区数据,消除显示误差
Write_Max7219(7,0);//清除缓冲区数据,消除显示误差
Write_Max7219(8,0);//清除缓冲区数据,消除显示误差
}
/***************************************************/
void Display_1(uchar dat)
{
Write_Max7219_byte(0);
MAX7219
多功能LED译码显示驱动IC PS7219 1 引言PS7219是由力源公司自行研制、开发的一款新型多功能8位LED显示驱动IC。
接口采用三线SPI方式,用户只需简单修改内部相关的控制或数字RAM,便可很容易地实现多位LED显示。
在性能上PS7219与MAXIM 公司的MAX7219完全兼容,并增加了位闪等功能。
PS7219具有多个级联特性,为大屏幕LED显示提供了方便。
在理论上,只需三根用户I/O口控制线,便可以实现无穷多的LED级联显示。
在实际应用中,已实现了149片PS7219级联,可以控制1192位LED 显示。
2 PS7219特点与引脚说明PS7219的特点:★ 串行接口(16位控制字);★ 8位共阴级LED显示驱动;★ 显示位数1~8,可数字调节;★ 按位进行BCD译码/不译码数字制;★ 16级亮度数字控制;★ 上电LED全熄;★ 提供位闪功能;★ 多个PS7219级联可实现任意多的LED显示;★ 宽24脚双列直插模块封装。
PS7219引脚图如图1所示。
引脚功能说明见表1。
3 PS7219内部结构如图2 所示,PS7219由六部分组成。
图2 PS7219内部组成框图图1 PS7219引脚排列3.1 串行输入缓冲部分主要功能是与外部控制信号接口,将控制命令串行读入,并进行串并转换,供控制器读取。
3.2 控制器是整个IC的核心部分。
它先将输入缓冲部分的控制字读入处理,根据其地址值送到相应的控制RAM或数字RAM,同时将数据送入串行同步输出部分,以便在下一个控制字输入周期,将其串行输出。
3.3 控制RAM数据RAM这两部分一起控制LED译码显示部分,实现不同功能及字符的显示。
控制RAM包括:空操作寄存器,译码模式控制寄存器,亮度控制寄存器,掉电控制寄存器,闪烁控制寄存器,测试控制寄存器和扫描界线寄存器。
数据RAM包括:数据1—8寄存器。
3.4 LED译码显示根据控制RAM和数据RAM的不同值,来实现相应的显示功能。
MAX7219中文资料-附有程序
MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。
该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。
它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX721 9的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。
此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。
MAX7219的外部引脚分配如图1所示及内部结构如图2所示。
图1 MAX7219的外部引脚分配图2 MAX7219的内部引脚分配各引脚的功能为:DIN:串行数据输入端DOUT:串行数据输出端,用于级连扩展LOAD:装载数据输入CLK:串行时钟输入DIG0~DIG7:8位LED位选线,从共阴极LED中吸入电流SEG A~SEG G DP 7段驱动和小数点驱动ISET:通过一个10k电阻和Vcc相连,设置段电流MAX7219有下列几组寄存器:(如图3)MAX7219内部的寄存器如图3,主要有:译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。
编程时只有正确操作这些寄存器,MAX7219才可工作。
图 3 MAX7219内部的相关寄存器分别介绍如下:(1)译码控制寄存器(X9H)如图4所示,MAX7219有两种译码方式:B译码方式和不译码方式。
当选择不译码时,8个数据为分别一一对应7个段和小数点位;B译码方式是BCD译码,直接送数据就可以显示。
实际应用中可以按位设置选择B译码或是不译码方式。
图4 MAX7219的译码控制寄存器(2)扫描界限寄存器(XBH)如图5所示,此寄存器用于设置显示的LED的个数(1~8),比如当设置为0xX4时,LED 0~5显示。
max7219驱动程序。doc
MAX7219驱动程序2007-04-27 10:21/***************************************************************** * 常用符号定义******************************************************************/#define uchar unsigned char/****************************************************************** * 定义MAX7219寄存器*******************************************************************/ #define REG_NO_OP 0x00 // 定义空操作 register #define DIG_1 0x01 // 定义数码管1 register #define DIG_2 0x02 // 定义数码管2 register #define DIG_3 0x03 // 定义数码管3 register #define DIG_4 0x04 // 定义数码管4 register #define DIG_5 0x05 // 定义数码管5 register #define DIG_6 0x06 // 定义数码管6 register #define DIG_7 0x07 // 定义数码管7 register#define DIG_8 0x08 // 定义数码管8 register #define REG_DECODE 0x09 // 定义解码控制 register #define REG_INTENSITY 0x0a // 定义显示亮度register #define REG_SCAN_LIMIT 0x0b // 定义扫描限制 register #define REG_SHUTDOWN 0x0c // 定义"shutdown"模式 register #defineREG_DISPLAY_TEST 0x0f // 定义"display test"模式 register #define INTENSITY_MIN 0x00 // 定义最低显示亮度 #define INTENSITY_MAX 0x0f // 定义最高显示亮度/******************************************************************** * * 定义硬件引脚连接********************************************************************* */ #define DATA P2^3; //定义P3_5连接MAX7219 DATA引脚 #define CLK P2^5; //定义P3_4连接MAX7219 CLK 引脚 #define CS P2^4; //定义P3_3连接MAX7219 CS 引脚(实际按7221设)/******************************************************************** *** * 共阴极七段数码管显示对应段查询表(数字0-9分别对应code_table[0]-[9])********************************************************************* **/ uchar code code_table[10]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; /*采用数组*//******************************************************************** *** * MAX7219_SendByte() * * 描述: 向MAX7219传送一字节数据 * Arguments : dataout = data to send * Returns : none********************************************************************* ****/ void MAX7219_SendByte (uchar dataout) { char i; for (i=8; i>0; i--) { uchar mask = 1 << (i - 1); // 设置掩码 CLK=0; // CLK 置低 if (dataout & mask) // 判断并输出一位 DATA=1; // 输出"1" else // 或 DATA=0; // "0" CLK=1; // CLK 置高 } }/******************************************************************** *** * MAX7219_Write() * * 描述: 向 MAX7219 写命令 * Arguments :reg_number = register to write to * dataout = data to write to MAX7219* Returns : none********************************************************************* ****** */ void MAX7219_Write (uchar reg_number, uchar dataout) { CS=0; // CS置低选通 MAX7219 MAX7219_SendByte(reg_number); // 写 register number 到 MAX7219 MAX7219_SendByte(dataout); // 写 data 到 MAX7219 CS=1; // 利用CS上升沿锁存以上移位进输入的16位数据 }/******************************************************************** ****** * MAX7219_DisplayChar() * * 描述: 使某一位显示一个数字 * Arguments : digit = digit number (0-7) * character = character to display (0-9, A-Z) * Returns : none********************************************************************* *****/ void MAX7219_DisplayChar (char digit, char character){ MAX7219_Write(digit, character); }/******************************************************************** ****** * MAX7219_Clear() * * 描述: 清除所有位的显示 * Arguments : none * Returns : none********************************************************************* ******/ void MAX7219_Clear (void) { uchar i; for (i=0; i < 8; i++) MAX7219_Write(i, 0x00); // 清除所有位的显示 }/******************************************************************** ****** * MAX7219_SetBrightness() * * 描述: 设置数码管显示亮度 * Arguments : brightness (0-15) * Returns : none********************************************************************* ******/ void MAX7219_SetBrightness (char brightness) { brightness &= 0x0f; // 屏蔽高位字节 MAX7219_Write(REG_INTENSITY, brightness); // 设置数码管显示亮度 }/******************************************************************** ****** * MAX7219_DisplayTestStart() * * 描述: 进入 test 模式 * Arguments : none * Returns : none********************************************************************* ******/ void MAX7219_DisplayTestStart (void){ MAX7219_Write(REG_DISPLAY_TEST, 1); // 置 MAX7219 为 test 模式 }/******************************************************************** ****** * MAX7219_DisplayTestStop() * * 描述: 退出 test 模式 * Arguments : none * Returns : none********************************************************************* ******/ void MAX7219_DisplayTestStop (void){ MAX7219_Write(REG_DISPLAY_TEST, 0); // 置 MAX7219 为正常显示模式 } /******************************************************************** ****** * MAX7219_ShutdownStart() * * 描述: 进入 shutdown 模式 * Arguments : none * Returns : none********************************************************************* ******/ void MAX7219_ShutdownStart (void) { MAX7219_Write(REG_SHUTDOWN, 0); // 置 MAX7219 为 shutdown 模式 }/******************************************************************** ****** * MAX7219_ShutdownStop() * * 描述: 退出 shutdown 模式 * Arguments : none * Returns : none********************************************************************* ******/ void MAX7219_ShutdownStop (void) { MAX7219_Write(REG_SHUTDOWN, 1); // 置 MAX7219 为正常显示模式 }/******************************************************************** ****** * MAX7219_Init() * * Des cription: MAX7219初始化模块; 应该先于其他MAX7219函数而被调用 * Arguments : none * Returns : none********************************************************************* ******/ void MAX7219_Init (void) { DATA=1; // 置DATA为1 CLK=1; // 置CLK 为1 CS=1; // 置CS 为1 MAX7219_Write(REG_SCAN_LIMIT, 7); // 设置为全显示 MAX7219_Write(REG_DECODE, 0x00); // 所有位设置为非解码方式MAX7219_ShutdownStop(); // 置 MAX7219 为正常显示模式 (非shutdown模式) MAX7219_DisplayTestStop(); // 置 MAX7219 为正常显示模式 (非test模式) MAX7219_Clear(); // 清除所有位的显示MAX7219_SetBrightness(INTENSITY_MAX); // 置最大亮度 }。
MAX7219驱动单个8X8点阵LED模块
MAX7219驱动单个88点阵LED模块模块介绍MAX7219 是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。
其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。
只有一个外部寄存器用来设置各个LED的段电流。
一个方便的四线串行接口可以联接通用的微处理器。
每个数据可以寻址在更新时不需要改写所有的显示。
MAX7219同样允许用户对每一个数据选择编码或者不编码。
整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。
只需要3个IO口即可驱动1个点阵!点阵显示时无闪烁!支持级联!模块参数:1.单个模块可以驱动一个8*8共阴点阵2.模块工作电压:5V3.模块尺寸:长3.2厘米X宽3.2厘米X高1.3厘米4.带4个固定螺丝孔,孔径3mm5.模块带输入输出接口,支持多个模块级联接线说明:1.模块左边为输入端口,右边为输出端口。
2.控制单个模块时,只需要将输入端口接到CPU3.多个模块级联时,第1个模块的输入端接CPU,输出端接第2个模块的输入端,第2个模块的输出端接第3个模块的输入端,以此类推...器件列表◆Keywish Arduino Uno R3 主板*1◆USB 接口线*2◆MAX7219显示驱动器*1◆8位数字的7段数字LED显示*1◆跳线*4接线Arduino MAX7219显示驱动器VCC VCCGND GND5 CLK6 CS7 DIN程序#include "LedControl.h"int DIN =7;int CS =6;int CLK =5;byte e[8]={0x7C,0x7C,0x60,0x7C,0x7C,0x60,0x7C,0x7C};byte d[8]={0x78,0x7C,0x66,0x66,0x66,0x66,0x7C,0x78};byte u[8]={0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x7E};byte c[8]={0x7E,0x7E,0x60,0x60,0x60,0x60,0x7E,0x7E};byte eight[8]={0x7E,0x7E,0x66,0x7E,0x7E,0x66,0x7E,0x7E};byte s[8]={0x7E,0x7C,0x60,0x7C,0x3E,0x06,0x3E,0x7E};byte dot[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18};byte o[8]={0x7E,0x7E,0x66,0x66,0x66,0x66,0x7E,0x7E};byte m[8]={0xE7,0xFF,0xFF,0xDB,0xDB,0xDB,0xC3,0xC3};LedControl lc=LedControl(DIN,CLK,CS,0);void setup(){lc.shutdown(0,false);//The MAX72XX is in power-saving mode on startup lc.setIntensity(0,15);// Set the brightness to maximum valuelc.clearDisplay(0);// and clear the display}void loop(){byte smile[8]={0x3C,0x42,0xA5,0x81,0xA5,0x99,0x42,0x3C};byte neutral[8]={0x3C,0x42,0xA5,0x81,0xBD,0x81,0x42,0x3C};byte frown[8]={0x3C,0x42,0xA5,0x81,0x99,0xA5,0x42,0x3C};printByte(smile);delay(1000);printByte(neutral);delay(1000);printByte(frown);delay(1000);printEduc8s();lc.clearDisplay(0);delay(1000);}void printEduc8s(){printByte(e);delay(1000);printByte(d);delay(1000);printByte(u);delay(1000);printByte(c);delay(1000);printByte(eight);delay(1000);printByte(s);delay(1000);printByte(dot);delay(1000);printByte(c);delay(1000);printByte(o);delay(1000);printByte(m);delay(1000);}void printByte(byte character []) {int i =0;for(i=0;i<8;i++){lc.setRow(0,i,character[i]); }}实验结果。
max7219数码管驱动程序库函数
函数说明:初始化MAX7219芯片,MAX7219芯片按照顺序级联,
测试模式显示寄存器没有配置,若希望配置,应在max7219.h中将MAX7219_TestModeDisp_EN预定义为1,
并注意配置测试模式显示的时间,
若时间太短,将较难看到显示效果。
输入参数:n-----初始化芯片个数(n>=1,注意:第1个为第0号芯片,显示函数中有具体描述;
for(i=0;i<8;i++);//短延时
MAX7219_LOAD=0;
for(i=0;i<n;i++)//初始化几个MAX7219芯片,做几次设置操作
MAX7219_WriteAddrData (0x09,MAX7219_InitStructure.DecodeMode);//设置译码模式
MAX7219_LOAD=1;//LOAD上升沿锁存数据
*/
//#define DecodeMode0x09 //译码模式寄存器
//#define Intensity0x0a //亮度寄存器
//#define ScanLimit0x0b //扫描位数寄存器
//#define ShutDown0x0c //关机模式寄存器
//#define DisplayTest0x0f //显示测试寄存器
sbit MAX7219_DIN= P0^3; //串行数据输入
sbit MAX7219_CLK= P0^4; //串行时钟
sbit MAX7219_LOAD= P0^5; //显示数据锁存控制
/*****************************************************************
max7219程序
[P_IOB_Data]=r2 //load值0,选中7219
retf
.endp
.public _display8
_display8:.proc
r1=0x08
[P_SIO_Data]=r1 //
call _busy
r1=[_data]
[P_SIO_Data]=r1
void InitIO_7219()
{
*P_IOB_DIR|=SCK_HEX;
*P_IOB_ATTRIB|=SCK_HEX;
*P_IOB_DATA|=SCK_HEX;
*P_IOB_DIR|=SDA_HEX;
*P_IOB_ATTRIB|=SDA_HEX;
*P_IOB_DATA|=SDA_HEX;
r2^=0x0080
[P_IOB_Data]=r2 //load值0,选中7219
retf
.endp
.public _display4
_display4:.proc
r1=0x04
[P_SIO_Data]=r1 //
call busy
r1=[_data]
[P_SIO_Data]=r1
.external _data
.external _bitdata
.ram
.code
.public _intint7219
_intint7219: .proc
r1=0xffff
[P_IOB_Dir]=r1
[P_IOB_Attrib]=r1
r1=0x0000
[P_IOB_Data]=r1
retf
max7129 使用方法
(一)、MAX7219 MAX7219是一种串入、并出的共阴极LED数码管显示驱动器,每片可驱动8位LED数码管显示,与单片机的接口只需3根线,内带BCD译码器,及显示测试、移位、锁存器等,输出电流达40mA,外围只需一只亮度调整电阻。
MAX7219引脚图1、引脚功能说明DIN:串行数据输入端,CLK的上升沿时数据被载入内部16位移位寄存器中CLK:串行时钟输入端,最高工作频率可达10MHz LOAD:片选端,低电平接收DIN端的数据,高电平时数据被所存DIG0~7:LED的位控制端A~DP:LED 的端控制端DOUT:串行数据输出端,用于芯片的级联ISET:硬件亮度调整端,在该引脚与VCC之间跨接一个电阻,LED的亮度即可通过该电阻来调节,流过LED的段驱动平均电流为流过此电阻电流的100倍,此电阻值范围为:10~80K之间。
2、内部寄存器说明A、译码方式选择寄存器地址:09H 赋值:FFH 表示使用MAX7219内部的BCD译码器00H 表示不使用MAX7219内部的BCD译码器B、亮度调节寄存器地址:0AH 赋值:00H~0FH 可改变MAX7219所驱动的LED的亮度,其变化范围在1/32~31/32之间C、扫描位数设定寄存器地址:0BH 赋值:00H 所有位不显示01H~07H 依次对应于1~8位及前面位全部显示(即需显示的位应为“1”)D、待机模式开关寄存器地址:0CH 赋值:00H LED全灭01H LED正常显示E、显示器测试寄存器地址:0FH 赋值:00H LED为正常显示状态01H LED测试状态,即LED全亮F、8位LED显示数据寄存器地址:01H~08H 对这些寄存器赋值(即需显示的内容),就会在对应的1~8位LED数码管上显示出来3、使用注意事项由于电源中杂波或附近的电磁等干扰信号,使MAX7219在上电后不显示或乱显示;为了消除这种现象应在MAX7219的VCC端与地之间接一只104pf的瓷片电容,在LOAD端于地之间接一只10K的电阻。
max7219使用详解
Max7219驱动程序一般的MCU因IO脚驱动能力不够,再加之MCU IO口资源有限,产品开发中通常是通过专门的驱动IC来驱动数码管。
7.1 学会看DatasheetMAX7219就是一款可以同时驱动8个数码管的IC。
下图是其引脚图及典型应用电路:我们的CPU只须三根线就可以控制MAX7219,这三根线是:DIN(第一脚),CS(第12脚),CLK(第13脚)。
DIN是数据输入脚,我们要显示的数据就是通过这根线发送到MAX7219的;CS是片选脚,MCU通过把该脚电平拉低来选中MAX7219,或者说MAX7219通过判断该引脚是否为低电平来使能该芯片。
CLK是时钟引脚,该时钟频率是MCU给到MAX7219的,MCU与7219之间的通信频率就根据该信号做基准。
7.2 MAX7219数据格式我们要让8个数码管显示"12345678",这个过程是怎么实现的呢?首先,要搞清楚MAX7219的数据格式,看图:MAX7219是以16位数据接收和发送的,也就是MCU传给MAX7219的数据必须是16位。
下面分析这16位数据格式:D15~D12为X:表示可以为任意值,因为这四位MAX7219目前还用不到。
D11~D8为ADDRESS:表示MAX7219的地址。
D7~D0为DATA,并且位7为高位(最先发送),位0位低位(最后发送)。
也就是当MCU向MAX7219发送一个16位数据时,其中的D11~D8表示选择MAX7219哪个地址,即数据D7~D0是送到该地址的。
7.3 地址译码MAX7219可以挂8个数码管,MCU是怎么把数据显示到指定的数码管的呢?这就要理解MAX7219的地址译码原理。
下图为MAX7219的地址映射图:D15~12以X表示,代表可为0,也可为1。
Digit0~7对应到8个数码管的地址。
Decode Mode:解码模式寄存器,其地址用16进制表示为0x09;Intensity:亮度调节寄存器,其地址用16进制表示为0x0A;Scan Limit:扫描范围寄存器,其地址用16进制表示为0x0B;Shutdown:省电模式,其地址用16进制表示为0x0C;Display Test:测试寄存器,其地址用16进制表示为0x0F;如果,我们要让第一个数码管显示,那么我们这里送到MAX7219的16位数据中的D11~8应该为0001。
8位串行接口数码显示驱动器MAX7219及其应用
8位串行接口数码显示驱动器MAX7219及其应用潍坊高等专科学校 王瑞兰LED数码管的应用已十分广泛,用于数码管显示的驱动电路种类较多,但大致可分为静态显示驱动和动态扫描显示驱动两大类别。
本文所要介绍的MAX7219芯片就是 用于动态扫描显示驱动的芯片。
该芯片的特点是利用一块芯片就能完成8位字数据和8位线数据的驱动,使得电路紧凑。
多芯片级联时,采用串行输入输出,可节省CPU的口线和接口芯片。
与数码管联接时无需限流电阻,8位显示的电流可通过一个外部电阻进行调节。
显示亮度也可通过程序进行控制。
片内具有,可以对输入的数据先进行译码再驱动输出,也可以将输入的数据直接驱动。
一、管脚功能MAX7219采用24管脚DIP和SO两种封装形式,管脚排列如图1所示,各引脚功能见表1。
二、MAX7219内部结构MAX7219的内部功能框图如图2所示。
16位移位寄存器所存数据为D0~D15,见表2。
D8~D11为寄存器地址,D0-D7为数据,D12-D15为不关心位。
片内有14个寄存器,其中8个数据寄存器,寄存着与DIG 0-DIG 7对应的显示数据,地址依次为×1H-8H;6个控制寄存器,即译码控制寄存器(Decode Mode)、显示亮度控制寄存器(Intensity)、扫描频率限制寄存器(Scan Limit)、消隐控制寄存器(Shutdown)、显示测试寄存器Display Test)及无操作寄存器(No-Op),其地址依次为×9H-CH、×FH、×0H。
数据寄存器为8×8双指针SRAM。
因为各寄存器可直接寻址,所以寄存器的数据可分别进行修改。
寄存器的数据可以保存到电源电压降低到2V。
三、控制寄存器1. Shutdown 寄存器Shutdown 寄存器写入×××××××0B数据时,将呈现消隐状态。
MAX7219点阵屏驱动程序(ching2221详细解说)
{
Max7219_pinCLK=0; //时钟开
Max7219_pinDIN=DATA&0x80; //取出DATA的最高位(实参数据位与0X80即10000000相与)
}
}
}
//程序编制:ching2221@
{
for(i=t;i<t+9;i++)
{
Write_Max7219(j,disp1[i]);
j++;
if(j==9) j=0;
Delay_xms(35);
}
if(t==15) t=0;
void Delay_xms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<112;j++);
}
void Write_Max7219_byte(uchar DATA)
{
Write_Max7219(0x0b, 0x07); //0X0b为扫描界限寄存器地址 //0x07为八位模式数据
Write_Max7219(0x0c, 0x01); //0X0C为关断模式寄存器地址 //0x01为正常工作模式数据
Write_Max7219(0x0f, 0x00); //0X0F为显示模式寄存器地址 //0x00为正常工作模式数据
}
void Init_MAX7219(void)
{
Write_Max7219(0x09, 0x00); //0X09为译码控制寄存器地址 //0x00为不译码模式数据//01为译码模式
MAX7219点阵数码管介绍
MAX7219(MAX7221)LED驱动器介绍MAX7219(MAX7221)LED驱动器简介MAX7219(MAX7221)是一种多位LED显示驱动器,它采用3线串行接口传送数据,可直接与微处理器接口连接,用户可以方便修改其内部参数以实现多位LED 显示。
MAX7219(MAX7221)内部含硬件动态扫描电路、BCD译码器、段驱动器和位驱动器。
此外,MAX7219(MAX7221)内部还含有8X8 位静态RAM,用于存放8个数字的显示数据。
MAX7219(MAX7221)可直接驱动64 段LED点阵数码管。
当多片MAX7219(MAX7221)级联时,可控制更多的LED 点阵数码管。
MAX7219实物图 MAX7221实物图MAX7219(MAX7221)LED驱动器应用领域1、条线图显示应用领域。
2、仪表面板应用领域。
3、工业控制应用领域。
4、LED矩阵显示应用领域。
MAX7219(MAX7221)LED驱动器特点1、10MHz连续串行口。
2、独立的LED段控制。
3、数字的译码与非译码选择。
4、150μA的低功耗关闭模式。
5、亮度的数字和模拟控制。
6、高电压中断显示。
7、共阴极LED显示驱动。
8、限制回转电流的段驱动来减少EMI(MAX7221)。
9、SPI, QSPI, MICROWIRE串行接口(MAX7221)。
10、24脚的 DIP和 SO 封装。
MAX7219(MAX7221)LED驱动器管脚说明MAX7219(MAX7221)LED驱动器管脚内部分配MAX7219(MAX7221)LED驱动器寄存器下表列出了MAX7219(MAX7221)LED驱动器的14 个可寻址的数据寄存器和控制寄存器。
数据寄存器由一个在片上的8×8 的双向SRAM 来实现,它们可以直接寻址,所以只要在电压大于2V 的情况下每个数据都可以独立的修改或保存。
控制寄存器包括译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。
MAX7219驱动数码管显示程序
}
/*-------------------------------------------------
主函数
-------------------------------------------------*/
#define DisplayTest 0x0f /*显示测试*/
#define ShutdownMode 0x00 /*掉电方式工作*/
#define NormalOperation 0x01 /*正常操作方式*/
#define DecodeDigit 0xff /*译码位数设置*/
#define IntensityGrade 0x01 /*显示亮度级别设置*/ //0-10
#define ScanDigit 0x07 /*扫描位数设置*/
#define TestMode 0x01 /*显示测试方式*/
#define TextEnd 0x00 /*显示测试结束,正常工作*/
void InitDis (void)
{
WriteWord (ScanLimit,ScanDigit); /*设置扫描界限*/
WriteWord (DecodeMode,DecodeDigit); /*设置译码模式*/
WriteWord (Intensity,IntensityGrade); /*设置亮度*/
void WriteWord (unsigned char addr,unsigned char num)
{
dis_LOAD=0;
_nop_();
MAX7219共阴极LED驱动器程序
MAX7219共阴极 LED数码管显示驱动(一)、 MAX7219MAX7219是一种串入、并出的共阴极LED数码管显示驱动器,每片可驱动8 位 LED数码管显示,与单片机的接口只要 3 根线,内带BCD译码器,及显示测试、移位、锁存器等,输出电流达40mA,外头只要一只亮度调整电阻。
MAX7219引脚图1、引脚功能说明DIN:串行数据输入端,CLK的上涨沿时数据被载入内部16 位移位存放器中CLK:串行时钟输入端,最高工作频次可达10MHzLOAD:片选端,低电平接收DIN 端的数据,高电平常数据被所存DIG0~7: LED的位控制端A~DP:LED的端控制端DOUT:串行数据输出端,用于芯片的级联ISET:硬件亮度调整端,在该引脚与VCC之间跨接一个电阻,LED的亮度即可经过该电阻来调理,流过LED的段驱动均匀电流为流过此电阻电流的100 倍, 此电阻值范围为:10~80K 之间。
2、内部存放器说明A、译码方式选择存放器地点:09H赋值: FFH表示使用MAX7219内部的BCD译码器00H表示不使用MAX7219内部的 BCD译码器B、亮度调理存放器地点:0AH赋值:00H~0FH 可改变MAX7219所驱动的LED的亮度,其变化范围在1/32~31/32之间C、扫描位数设定存放器地点:0BH赋值: 00H所有位不显示01H~07H挨次对应于1~8 位及前方位所有显示(即需显示的位应为“1”)D、待机模式开关存放器地点:0CH赋值: 00H LED全灭01H LED正常显示E、显示器测试存放器地点: 0FH赋值: 00H LED为正常显示状态01H LED测试状态,即LED全亮F、8 位LED显示数据存放器地点: 01H~08H对这些存放器赋值(即需显示的内容),就会在对应的1~8 位LED数码管上显示出来3、使用注意事项因为电源中杂波或邻近的电磁等扰乱信号,使MAX7219在上电后不显示或乱显示;为了除去这类现象应在 MAX7219的 VCC端与地之间接一只104pf 的瓷片电容,在LOAD端于地之间接一只10K 的电阻。
多功能串行LED显示驱动器MAX7219
多功能串行LED显示驱动器MAX7219MAX7219是美国MAXIM(美信)公司推出的多位LED显示驱动器,采用3线串行接口传送数据,可直接与单片机接口,用户能方便修改其内部参数,以实现多位LED显示。
它内含硬件动态扫描显示控制,每枚芯片可驱动8个LED数码管。
显然,它可直接驱动64段LED条形图显示器。
当多片MAX7219级联时,可控制更多的LED。
显示的数据通过单片机数据处理后,送给MAX7219显示。
当然,也完全可以将MAX7219的一部分用于条形图显示,一部分用于其他显示(如数字和字母等)。
1.内部逻辑结构它主要由8个数位寄存器和6个控制寄存器组成:1)数位寄存器7~0:它决定该位LED显示内容。
2)译码方式寄存器:它决定数位寄存器的译码方式,它的每一位对应一个数位。
其中,1代表B码方式;0表示不译方式。
若用于驱动LED数码管,应将数位寄存器设置为B码方式;当用于驱动条形图显示器时,应设置为不译码方式。
3)扫描位数寄存器:设置显示数据位的个数。
该寄存器的D2~D0(低三位)指定要扫描的位数,支持0~7位,各数位均以1.3kHz的扫描频率被分路驱动。
4)亮度控制寄存器:该寄存器通常用于数字控制方式,利用其D3~D0位控制内部脉冲宽度调制DAC的占空比来控制LED段电流的平均值,实现LED的亮度控制。
D3~D0取值可从0000~1111,对应电流占空比则从1/32变化到31/32,共16级,D3~D0的值越大,LED显示越亮。
而亮度控制寄存器中的其他各位未使用,可置任意值。
5)显示测试寄存器:它用来检测外挂LED数码管各段的好坏。
当D0置为1时,LED处于显示测试状态,所有8位LED的段被扫描点亮,电流占空比为31/32;若D0为0,则处于正常工作状态。
D7~D1位未使用,可任意取值。
6)关断寄存器:用于关断所有显示器。
当D0为0时,关断所有显示器,但不会消除各寄存器中保持的数据;当D0设置为1时,正常工作。
MAX7219多级联驱动程序
MAX7219多级联驱动程序在使用多个7219级联时,只要在写入最后一片7219时作一特殊处理就可以了。
/*----------------显示模块----------------------*///级连的四个7219模块,以引出线在右边为准,自左至右为位3,2,1,0。
每一个7219模块,自上至下,为a,b,..g,h段// 字符表的排列为CharMap_X[a , b, c, d,e, f,g,h],//模板的排列model_xxxx[char3[a , b, c, d,e, f,g,h],char2[a , b, c, d,e, f,g,h],char1[a , b, c, d,e, f,g,h],char0[a , b, c, d,e, f,g,h]]//段数据的排列Seg_data的排列与模板的排列相同。
//7219控制寄存器#define ScanLimit 0x0b //扫描界限地址#define ScanDigit 7 //0-7,7全扫#define DecodeMode 0x09 //译码模式地址#define DecodeDigit 0x00 //0x00 不译码0x01 只译字0 0x0f 译字0-3 0xff 全译码#define Intensity 0x0a // 亮度地址#define IntensityGrade 0x00 //0-f 16个档次#define ShutDown 0x0c //电源工作模式地址#define NormalOperation 1 //1 正常0 掉电#define DisplayTest 0x0f //测试模式地址#define TestMode 1 //0 正常 1 测试#define TestEnd 0 //0 正常 1 测试#define No_op 0 //无操作寄存器#define num_7219 4延时子程序***********************************************************////////////////// 延时=6.6*x +9.6 usvoid delay(unsigned int x) //22.1184Mhz x=1时16.2us ,x=2 23us, x=3 29.6usx=150 ~~=1ms{uint i;for(i=0;i<x;i++);}///////////延迟Xmsvoid delay_xms(uchar x) //22Mhz xms{int i,set;set=0;for(i=0;i<x;i++){delay(150); //150}}void InitMain (void){TMOD=0x20;TH0=0xff;TL0=0xf4;EA=1;ES=1;TR1=1;}//max7219的驱动LED显示/************************** ******************************** */ /*-------------------------------------------------向MAX7219写入字节(8位)--------------------------------------------------*/void SendChar7219 (uchar ch){uchar i,temp;nop;for (i=0;i<8;i++){ps7219_pin_CLK=0;temp=ch&0x80;ch=ch<<1;if(temp){ps7219_pin_DIN=1;}else{ps7219_pin_DIN=0;}ps7219_pin_CLK=1;_nop_();}}////////////向MAX7219写入字(16位)void WriteWord7219 (uchar addr,uchar num){ps7219_pin_LOAD=0;_nop_();SendChar7219 (addr);_nop_();SendChar7219 (num);_nop_();}/*-------------------------------------------------写一行(4个字节到4个7219芯片的同一地址)/*-------------------------------------------------*/void WriteLine7219(uchar Addr) //, uchar Seg_data{char i,j;for (i=1;i<=3;i++) //写第一、二、三片7219{j=(i+1)*8-Addr;WriteWord7219 (Addr,Seg_data[j]);ps7219_pin_LOAD=1; //锁存操作}//写第四片7219ps7219_pin_LOAD=0; //封锁第一片锁存操作WriteWord7219 (Addr,Seg_data[8-Addr]); //写第四片ps7219_pin_CLK=1;WriteWord7219 (No_op,0); //跳过第一、二、三片7219WriteWord7219 (No_op,0);WriteWord7219 (No_op,0);ps7219_pin_LOAD=1; // 锁存操作}/*-------------------------------------------------写一屏/*-------------------------------------------------*/void WriteOneScreen7219( ){char i;for (i=7;i>=0;i--){WriteLine7219 (i+1);}}/*-------------------------------------------------MAX7219初始化-------------------------------------------------*/void InitDis7219 (void){char i;for (i=num_7219; i>=0; i--){WriteWord7219(ShutDown,NormalOperation); /*设置电源工作模式*/ps7219_pin_LOAD=1; //锁存操作WriteWord7219(ScanLimit,ScanDigit); /*设置扫描界限*/ps7219_pin_LOAD=1; //锁存操作WriteWord7219(DecodeMode,DecodeDigit); /*设置译码模式*/ps7219_pin_LOAD=1; //锁存操作WriteWord7219(Intensity,IntensityGrade); /*设置亮度*/ps7219_pin_LOAD=1; //锁存操作delay_xms(10); //延迟10msWriteWord7219 (DisplayTest,TestEnd); //正常工作ps7219_pin_LOAD=1; //锁存操作}}void main(){InitDis7219 ();delay_xms(50);}(略)。
点阵屏驱动程序(MAX7219)
点阵屏驱动程序(MAX7219)//自己做项目写的2*4点阵屏驱动,分享给大家,基于STC15单片机点阵屏如上图所示#include "stc15w4k32s4.h"#define uchar unsigned char#define uint unsigned int//定义Max7219端口sbit Max7219_pinCLK = P1^7;sbit Max7219_pinCS = P1^6;sbit Max7219_pinDIN = P1^5;void Write_Max7219_byte(uchar DATA); //向MAX7219(U3)写入字节void Write_Max7219(uchar address,uchar dat); //向MAX7219写入数据void Init_MAX7219(void); //初使化函数void Display_1(uchar dat); //1号屏显示数字void Display_2(uchar dat); //2号屏显示数字void Display_3(uchar dat); //3号屏显示数字void Display_4(uchar dat); //4号屏显示数字void Display_5(uchar dat); //5号屏显示数字void Display_6(uchar dat); //6号屏显示数字void Display_7(uchar dat); //7号屏显示数字void Display_8(uchar dat); //8号屏显示数字、/* 8个点阵驱动程序 */uchar code disp1[38][8] ={{0x00,0x30,0x48,0x48,0x48,0x48,0x48,0x30}, //0{0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38}, //1{0x00,0x78,0x08,0x08,0x78,0x40,0x40,0x78}, //2{0x00,0x78,0x08,0x08,0x78,0x08,0x08,0x78}, //3{0x00,0x10,0x30,0x50,0x78,0x10,0x10,0x10}, //4{0x00,0x78,0x40,0x40,0x78,0x08,0x08,0x78}, //5{0x00,0x78,0x40,0x40,0x78,0x48,0x48,0x78}, //6{0x00,0x7C,0x04,0x08,0x10,0x10,0x10,0x10}, //7{0x00,0x78,0x48,0x48,0x78,0x48,0x48,0x78}, //8{0x00,0x78,0x48,0x48,0x78,0x08,0x08,0x78}, //9{0}, //显示空白10 {0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00}, //显示负数符号11 {0x00,0x7C,0x40,0x40,0x7C,0x40,0x40,0x7C}, //E 12 {0x00,0x78,0x44,0x44,0x7C,0x48,0x48,0x44}, //R 13 {0x10,0x28,0x44,0x44,0x44,0x7C,0x44,0x44}, //A 14 {0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x78}, //L 15 {0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70}, //C 16 };//--------------------------------------------//功能:向MAX7219(U3)写入字节//入口参数:DATA//出口参数:无//说明:void Write_Max7219_byte(uchar DATA){uchar i;Max7219_pinCS=0;for(i=8;i>=1;i--){Max7219_pinCLK=0;Max7219_pinDIN=DATA&0x80;DATA=DATA<<1;Max7219_pinCLK=1;}}//-------------------------------------------//功能:向MAX7219写入数据//入口参数:address、dat//出口参数:无//说明:void Write_Max7219(uchar address,uchar dat){uchar i;Max7219_pinCS=0;for(i=1;i<9;i++){Write_Max7219_byte(address); //写入地址,即数码管编号Write_Max7219_byte(dat); //写入数据,即数码管显示数字}Max7219_pinCS=1;}void Init_MAX7219(void) //初使化7219{Write_Max7219(0x09, 0x00); //译码方式:1;BCD码,0;非BCD模式Write_Max7219(0x0a, 0x0a); //亮度0-f (0-16) Write_Max7219(0x0b, 0x07); //扫描界限;8个数码管显示Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0Write_Max7219(1,0); //清除缓冲区数据,消除显示误差Write_Max7219(2,0); //清除缓冲区数据,消除显示误差Write_Max7219(3,0); //清除缓冲区数据,消除显示误差Write_Max7219(4,0); //清除缓冲区数据,消除显示误差Write_Max7219(5,0); //清除缓冲区数据,消除显示误差Write_Max7219(6,0); //清除缓冲区数据,消除显示误差Write_Max7219(7,0); //清除缓冲区数据,消除显示误差Write_Max7219(8,0); //清除缓冲区数据,消除显示误差}/***************************************************/void Display_1(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}}void Display_2(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}}void Display_3(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}}void Display_4(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}}void Display_5(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}void Display_6(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}}void Display_7(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Write_Max7219_byte(0);Write_Max7219_byte(0);Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}void Display_8(uchar dat){uchar i;for(i=1;i<9;i++){Max7219_pinCS=0;Write_Max7219_byte(i); //写入地址,即数码管编号Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字Max7219_pinCS=1;Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}}void main(void){Init_MAX7219();Display_1(0); //1号屏显示数字0Display_2(1); //2号屏显示数字1Display_3(2); //3号屏显示数字2Display_4(3); //4号屏显示数字3Display_5(4); //5号屏显示数字4Display_6(5); //6号屏显示数字5Display_7(6); //7号屏显示数字6Display_8(7); //8号屏显示数字7while(1);}。
MAX7219级联教程
河南工业大学爬山虎工作室
DIN=1; else DIN=0; Dat <<= 1; CLK = 1; _nop_(); _nop_(); CLK = 0; } for(i=0;i<Num_Addr;i++) { for(j=0;j<16;j++) { CLK = 0; DIN = 0; CLK = 1; _nop_(); _nop_(); CLK = 0; } } LOAD = 1; } void Initialise7219()//初始化 { //第 0 个 7219 初始化 Write(0x00,0x09,0xff); //编码模式 Write(0x00,0x0b,0x07); //全部扫描 Write(0x00,0x0c,0x01); //正常模式:1,掉电模式:0 Write(0x00,0x0a,0x07); //消隐时间设为 T/2 //第 1 个 7219 初始化 Write(0x01,0x09,0xff); //编码模式 Write(0x01,0x0b,0x07); //全部扫描 Write(0x01,0x0c,0x01); //正常模式 Write(0x01,0x0a,0x07); //消隐时间设为 T/2 } void main() { u8 i; Initialise7219(); DelayMS(1); for(i=0;i<8;i++) {
河南工业大学爬山虎工作室
MAX7219 级联教程,附驱动源码
一、电路原理图
河南工业大学爬山虎工作室
二、 级联程序
#include <reg52.h> #include <intrins.h> #define u8 unsigned char #define uint unsigned int sbit DIN = P2^0; sbit LOAD = P2^1; sbit CLK = P2^2; u8 Disp_Buffer[8]={2,0,0,9,10,8,10,9}; //软件延时函数,延时 xms void DelayMS(uint x) { u8 t; while(x--) { for(t=120;t>0;t--); } } //向第 Num_Addr 片 7219 的 Addr 寄存器写入一个 Dat 数据 //Num_Addr:7219 地址(0~255) //Addr:7219 数显寄存器地址(1~8) //Dat:要显示的数据(0~15)(含字母) void Write(u8 Num_Addr,u8 Addr,u8 Dat) { u8 i,j; LOAD = 0; for(i=0;i<8;i++) { CLK = 0; if(Addr&0x80) DIN=1; else DIN=0; Addr <<= 1; CLK = 1; _nop_(); _nop_(); CLK = 0; } for(i=0;i<8;i++) { CLK = 0; if(Dat&0x80)
树莓派上MAX7219的字符驱动程序编写
树莓派上MAX7219的字符驱动程序编写1.认识MAX7219拿到MAX7219驱动的LED矩阵,第一件事是先连接并尝试显示图案。
使用MAX7219除了需要提供GND以及VCC外,只需要再提供三根引脚即可点亮矩阵。
其中,DIN引脚输入数据,CS(LOAD)引脚控制数据输入,CLK引脚用于区分每个bit。
MAX的整个写入流程为,首先CS引脚置0,表示允许写入。
而后从高位顺序写入16个bit。
每个bit的写入方式为首先DIN置为要写入的bit值,而后CLK产生一个下降沿(图中为上升沿,不知道为何有差别)即被读入。
最后CS引脚置1表示写入结束。
时序图如下:在运行之前,需要进行一次初始化,其行为是向某几个特定的地址写入特定的值。
至少需要写入两个地址,第一个是0x0b,写入0x07表示扫描显示所有行。
第二个是0x0c,写入1表示进入工作模式。
而后点阵上每一行都有其地址,如第一行是0x01到第八行是0x08,每次向固定行的地址写入一个8位二进制数即可在指定行上显示图案。
2. 树莓派对GPIO的访问虚拟文件系统访问Linux可以通过访问sys/class/gpio下的一些文件,通过对这些文件的读写来实现对于GPIO的访问。
!/bin/bash# DIN,CS,CLK的GPIO口位置DIN=4CS=3CLK=2# 一些文件路径GPIO_BASE=/sys/class/gpioGPIO_EXPORT=${GPIO_BASE}/exportGPIO_UNEXPORT=${GPIO_BASE}/unexportBIN=(00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000)# 生成指定GPIO引脚的文件夹位置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MAX7219单片以及级联驱动程序2011-03-20 09:40说明一下:这个word版式是从百度上下载的,在原版中,作者只是写了驱动一片MAX7219的程序。
本人作为菜鸟,第一次使用MAX7219就用了两片级联来驱动15个数码管,按照原版程序驱动一片MAX7219是没有问题的,但是,驱动两片MAX7219就不行了。
自己先认真看了MAX7219的DataSsheet,因为英语是个二把刀,看的迷迷糊糊,似懂非懂(可见英语还是很重要的),又在网上搜索也没发现有正确的程序(都是有点儿问题,上网贴出来请教各位大虾的),没办法只能自力更生了,终于调出来了。
将原版增删修改,传上来共享,希望对以后某位菜鸟第一次使用MAX7219时有所帮助啦,嘿嘿!/**************************************************************** *常用符号定义******************************************************************/#define uchar unsigned char/**************************************************************** *定义MAX7219寄存器******************************************************************/#define REG_NO_OP 0x00 //定义空操作register#define DIG_1 0x01 // 定义数码管1 register#define DIG_2 0x02 // 定义数码管2 register#define DIG_3 0x03 // 定义数码管3 register#define DIG_4 0x04 // 定义数码管4 register#define DIG_5 0x05 // 定义数码管5 register#define DIG_6 0x06 // 定义数码管6 register#define DIG_7 0x07 // 定义数码管7 register#define DIG_8 0x08 // 定义数码管8 register#define REG_DECODE 0x09 // 定义解码控制register#define REG_INTENSITY 0x0a // 定义显示亮度register#define REG_SCAN_LIMIT 0x0b // 定义扫描限制register#define REG_SHUTDOWN 0x0c // 定义"shutdown"模式register#define REG_DISPLAY_TEST 0x0f // 定义"display test"模式register#define INTENSITY_MIN 0x00 // 定义最低显示亮度#define INTENSITY_MAX 0x0f // 定义最高显示亮度/****************************************************************** * 定义硬件引脚连接******************************************************************/#define DATA P2^3; //定义P3_5连接MAX7219 DATA引脚#define CLK P2^5; //定义P3_4连接MAX7219 CLK 引脚#define CS P2^4; //定义P3_3连接MAX7219 CS 引脚/***************************************************************** * 共阴极七段数码管显示对应段查询表(数字0-9分别对应code_table[0]-[9])***********************************************************/uchar code code_table[10]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; /*采用数组*//****************************************************************** * MAX7219_Send()描述: 向MAX7219传送一字节数据Arguments : dataout = data to sendReturns : none******************************************************************/ void send (uchar datain){char I,temp;for (i=8; i>0; i--){CLK=0; // CLK 置低temp=datain&0x80;if (temp==0x80) // 判断并输出一位DATA=1; // 输出"1"else // 或DATA=0; // 输出"0"datain<<=1; //datain左移位,以便再次与0x80按位与CLK=1; // CLK 置高}}/**************************************************************** * MAX7219_Write()/MAX7219_Write_1()描述: 向 MAX7219 写命令Arguments : reg_number = register to write todataout = data to write to MAX7219Returns : none************************************************************** */ void MAX7219_Write (uchar add1, uchar dat1) //向第一片MAX7219写数据{CS=0; // CS置低选通MAX7219send(add1); // 写register number 到MAX7219send(dat1); // 写data 到MAX7219CS=1; // 利用CS上升沿锁存以上移位进输入的16位数据}void MAX7219_Write_1(uchar add2,uchar dat2) //向第二片MAX7219写数据{CS=0;sent(add2);sent(dat2);CLK=1; // 第16.5个时钟周期,数据从第一片MAX7219的DOUT端开始输出sent(REG_NO_OP); //对第一片MAX7219进行空操作,sent(0x00);CS=1;}/******************************************************************** MAX7219_DisplayChar()描述: 使某一位显示一个数字Arguments : digit = digit number (0-7)character = character to display (0-9, A-Z)Returns : none****************************************************************/void MAX7219_DisplayChar (char digit, char character){MAX7219_Write(digit, character);}PS:这个函数可以不要,直接调用写数据函数就可以了(原版)/******************************************************************** MAX7219_Clear()/MAX7219_clear_1()描述: 清除所有位的显示Arguments : noneReturns : none*****************************************************************/ void MAX7219_Clear (){uchar i;for (i=0; i < 8; i++)MAX7219_Write(i, 0x00); // 清除第一片MAX7219所有位的显示}void MAX7219_Clear_1(){uchar i;for(i=1;i<=8;i++)MAX7219_Write_1(i,0x00); //清除第二片MAX7219所有位的显示}PS:可以两片一起清楚数据,但建议分开较好。
/******************************************************************** MAX7219_SetBrightness()描述: 设置数码管显示亮度Arguments : brightness (0-15)Returns : none*****************************************************************/ void MAX7219_SetBrightness (char brightness){brightness &= 0x0f; //屏蔽高位字节MAX7219_Write(REG_INTENSITY, brightness); // 设置数码管显示亮度MAX7219_Write_1(REG_INTENSITY, brightness); //第二片MAX7219}/******************************************************************** MAX7219_DisplayTestStart()描述: 进入 test 模式Arguments : noneReturns : none****************************************************************/ void MAX7219_DisplayTestStart (){MAX7219_Write(REG_DISPLAY_TEST, 1); //置MAX7219为test 模式MAX7219_Write_1(REG_DISPLAY_TEST, 1); //第二片MAX7219}/******************************************************************** MAX7219_DisplayTestStop()描述: 退出 test 模式Arguments : noneReturns : none***************************************************************/ void MAX7219_DisplayTestStop (){MAX7219_Write(REG_DISPLAY_TEST, 0); //置MAX7219为正常显示模式MAX7219_Write_1(REG_DISPLAY_TEST, 0); //第二片MAX7219}/******************************************************************** MAX7219_ShutdownStart()描述: 进入 shutdown 模式Arguments : noneReturns : none************************************************************/void MAX7219_ShutdownStart (){MAX7219_Write(REG_SHUTDOWN, 0); //置MAX7219为shutdown 模式MAX7219_Write_1(REG_SHUTDOWN, 0); //第二片MAX7219}/******************************************************************** MAX7219_ShutdownStop()描述: 退出 shutdown 模式Arguments : noneReturns : none****************************************************************/ void MAX7219_ShutdownStop (){MAX7219_Write(REG_SHUTDOWN, 1); //置MAX7219为正常显示模式MAX7219_Write_1(REG_SHUTDOWN, 1); //第二片MAX7219}/******************************************************************** MAX7219_Init() 描述: MAX7219初始化模块,应该先于其他MAX7219函数而被调用Arguments : noneReturns : none*****************************************************************/ void MAX7219_Init (){DATA=1; // 置DATA为1CLK=1; // 置CLK 为1CS=1; // 置CS 为1MAX7219_Write(REG_SCAN_LIMIT, 7); // 设置为全显示MAX7219_Write_1(REG_SCAN_LIMIT, 7); //第二片MAX7219MAX7219_Write(REG_DECODE, 0x00); // 所有位设置为非解码方式MAX7219_Write_1(REG_DECODE, 0x00); //第二片MAX7219MAX7219_ShutdownStop(); //置MAX7219为正常显示模式(非shutdown模式) MAX7219_DisplayTestStop(); // 置MAX7219为正常显示模式(非test模式) MAX7219_Clear(); // 清除所有位的显示MAX7219_Clear_1(); //第二片MAX7219MAX7219_SetBrightness(INTENSITY_MAX); // 置最大亮度}PS:如果只需驱动一片MAX7219,将关于驱动第二片MAX7219的函数去除就可以。