MAX7219共阴极LED驱动器程序

合集下载

MAX7219中文资料-附有程序

MAX7219中文资料-附有程序

MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。

该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。

它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。

此外它还支持多片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)

点阵屏驱动程序(MAX7219)
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;
{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);

串行LED显示驱动器MAX7219及其应用

串行LED显示驱动器MAX7219及其应用

串行L ED显示驱动器M AX7219及其应用胡奕明(空军工程大学工程学院研究生大队 西安 710038)摘 要 阐述了新型显示驱动芯片M A X7219的基本工作原理和软件设计方法。

该芯片功能强大、编程简单、控显可靠,可广泛用于工业控制器等方面的数码显示驱动。

关键词 显示驱动器 串行发送 M A X72191 概 述M A X7219是美国M A X I M公司生产的串行输入 输出共阴极显示驱动器。

该芯片可直接驱动最多8位7段数字L ED显示器,或64个L ED和条形图显示器。

它与微处理器的接口非常简单,仅用3个引脚与微处理器相应端连接即可实现最高10M H z 串行接口。

M A X7219的位选方式独具特色,它允许用户选择多种译码方式译码选位,而且,每个显示位都能个别寻址和刷新,而不需要重写其他的显示位,这使得软件编程十分简单且灵活。

另外,它具有数字和模拟亮度控制以及与M O TOROLA SP I, Q SP I及M A T I ONAL M I CROW I R E串行口相兼容等特点。

2 引脚说明该芯片采用24脚D IP和SO封装,工作电压410~515V,最大功耗111W。

引脚说明见表1。

3 基本工作原理及使用方法M A X7219与8031单片机连接采用三线串行接口,典型应用电路如图1。

对于M A X7219,串行数据是以16位数据包的形式从D in脚串行输入,在CL K的每一个上升沿一位一位地送入芯片内部16位移位寄存器,而不管L out脚的状态如何。

L oad脚必须在第16个CL K上升沿出现的同时或之后,但在下一个CL K上升沿之前变为高电平,否则移入的数据将丢失。

表1 引脚说明引脚号名称功能说明1D in串行数据输入端。

在CL K的上升沿数据被锁入芯片内部16位移位寄存器2,3,5~8,10,11D IG0~D IG78位L ED位选线,从共阴极L ED中吸入电流4,9GND地线(两个GND必须接在一起)12L oad锁入输入的数据。

基于MAX7219芯片的大尺寸LED数码显示驱动电路设计

基于MAX7219芯片的大尺寸LED数码显示驱动电路设计

收稿日期:2010-11-05稿件编号:201011019作者简介:李长安(1954—),男,河南南阳人,教授。

研究方向:电子技术应用及智能控制。

Maxim 公司的MAX7219芯片用于动态扫描显示驱动,芯片内有可存储显示信息的8×8静态RAM 、动态扫描电路以及段、位驱动器。

它与通用微处理器有3根串行线相连,最多可驱动8个共阴数码管或64个发光二极管。

采用MAX7219芯片实现LED 数码显示,具有电路紧凑、可节省CPU 的I/O 接口、芯片功能强大、编程简单等优点,得到了广大电路设计者认可。

然而MAX7219的工作电压为5V ,共阴极LED 显示驱动,只适用于3.5V 以下电压驱动的LED 数码管,限制了其使用范围。

本文提出一种基于MAX7219芯片,具有扩展驱动能力的LED 数码显示电路。

主要应用在大尺寸、高亮度LED 数码管的显示电路。

1电路器件功能简介1.1MAX7219功能简介MAX7219为24引脚芯片,如图1所示。

有+5V 电源和2个GND 引脚;DIG 0~DIG 7引脚为8位数字驱动线,输出位选信号;SEG A ~SEG G 和SEG DP 引脚为LED 7段驱动线和小数点线,供给显示器驱动电流;SET 引脚外接电阻调整LED 显示亮度;DIN (数据输入端)、CLK (时钟输入端)、LOAD(锁存信号)引脚,构成与通用微处理器3线串行线相连,接收的数据和命令格式为16位数据包;DOUT 引脚是串行数据输出端口,用于多片MAX7219级联扩展显示[1-2]。

16位数据采用串行移位接收方式,即单片机将16位二进制数逐位发送到DIN 端。

在CLK 上升沿到来前准备就绪,CLK 的每个上升沿将一位数据移入MAX7219内移位寄存图1MAX7219的引脚分布Fig.1Pinouts of MAX7219电子设计工程Electronic Design Engineering第19卷Vol.19第5期No.52011年3月Mar.2011-190-李长安,等基于MAX7219芯片的大尺寸LED数码显示驱动电路设计图380011B各字段的组成Fig.3Composition of80011B information fields-191-《电子设计工程》2011年第5期图58位共阳LED 数码显示电路Fig.5Display circuit of 8-bit positiveLED74LS273锁存的数据,由ULN2803驱动数码管显示。

MAX7219基本驱动程序

MAX7219基本驱动程序

MAX7219基本驱动程序2015.07.26Q群:沈阳理工大学电子爱好者Note:仅仅是基本驱动程序,那你可以根据自己的需要去修改本程序验证单片机型号:STC15W系列单片机编译软件:Keil3编程语言:C程序组成文件:STC15W.H MAX7219.H MAX7219.CSTC15W.H:把宏晶STC官网烧录软件的15系列头文件更名为STC15WMAX7219.H:/***************************************************文件名称:MAX7219.H功能:MAX7219的驱动四位数码管的函数修改时间:2015.06.28***************************************************/#ifndef_MAX7219_H_#define_MAX7219_H_#include"STC15W.H"#include"intrins.h"//这里的有关单片机的头文件用户可以改成自己的名字#define MAX7219_DIN P10//数据输入,CLK上升沿时数据读入#define MAX7219_CLK P11//时钟信号输入端#define MAX7219_LOAD P12//锁定最近的16位数据为有效数据并载入//用户可以根据自己的需求改变引脚//一条指令的传输:LOAD低-数据-CLK上升沿-数据-CLK上升沿。

LOAD上升沿数据载入#define LOW0#define HIGH1/**************/static void MAX7219_WOnebyte(unsigned char x,unsigned char y); //向MAX7219的X地址写入参数Yvoid MAX7219_Init(unsigned char seg_limit);//MAX7219功能初始化void MAX7219_WData(unsigned long seg_data);//向MAX7219写入需要显示的数据#endifMAX7219.H:/***************************************************文件名称:MAX7219.C功能:MAX7219的驱动四位数码管的函数修改时间:2015.06.28***************************************************/#include"MAX7219.H"unsigned char max7219_segnum=0;//这个参数用来表示当前数码管一共显示几位(1~8)enum MAX7219_ADD{MAX7219_ADD_Nop=0x50,MAX7219_ADD_Digit0,MAX7219_ADD_Digit1,MAX7219_ADD_Digit2,MAX7219_ADD_Digit3,MAX7219_ADD_Digit4,MAX7219_ADD_Digit5,MAX7219_ADD_Digit6,MAX7219_ADD_Digit7,MAX7219_ADD_Mode,MAX7219_ADD_Intensity,MAX7219_ADD_ScanLimit,MAX7219_ADD_ShutDown,MAX7219_ADD_Nouse1,MAX7219_ADD_Nouse2,MAX7219_ADD_DisplayTest,};//这个枚举类型MAX7219_ADD表示MAX7219的寄存器地址/***************************************************函数名称:MAX7219_WOnebyte功能:向MAX7219的X地址写入参数Y输入:X:地址Y:数据输出:无作用范围:局部MAX7219.C***************************************************/ static void MAX7219_WOnebyte(unsigned char x,unsigned char y) {unsigned char i,z=0;for(i=0;i<8;i++){z=(x<<i);if(z&0x80)MAX7219_DIN=HIGH;else MAX7219_DIN=LOW;_nop_();_nop_();MAX7219_CLK=HIGH;_nop_();_nop_();MAX7219_CLK=LOW;}for(i=0;i<8;i++){z=(y<<i);if(z&0x80)MAX7219_DIN=HIGH;else MAX7219_DIN=LOW;_nop_();_nop_();MAX7219_CLK=HIGH;_nop_();_nop_();MAX7219_CLK=LOW;}_nop_();_nop_();MAX7219_LOAD=HIGH;_nop_();_nop_();MAX7219_LOAD=LOW;}/***************************************************函数名称:MAX7219_Init功能:MAX7219功能初始化输入:seg_limit表示显示数码管的位数输出:无作用范围:全局***************************************************/ void MAX7219_Init(unsigned char seg_limit){max7219_segnum=seg_limit;//将设置的显示数码管个数保存MAX7219_LOAD=LOW;_nop_();_nop_();MAX7219_LOAD=HIGH;_nop_();_nop_();MAX7219_LOAD=LOW;MAX7219_WOnebyte(MAX7219_ADD_Mode,0xFF);//MAX7219为译码模式MAX7219_WOnebyte(MAX7219_ADD_Intensity,0x02);//MAX7219的显示亮度为最亮MAX7219_WOnebyte(MAX7219_ADD_ScanLimit,seg_limit);//MAX7219的显示4个数码光(0,1,2,3)MAX7219_WOnebyte(MAX7219_ADD_DisplayTest,0X00);//MAX7219正常工作模式,非测试MAX7219_WOnebyte(MAX7219_ADD_ShutDown,0X01);//MAX7219正常工作模式,非掉电MAX7219_DIN=LOW;MAX7219_CLK=LOW;MAX7219_LOAD=LOW;}/***************************************************函数名称:MAX7219_WData功能:向MAX7219写入需要显示的数据输入:seg_data表示数码管将要显示的数据输出:无作用范围:全局***************************************************/ void MAX7219_WData(unsigned long seg_data){unsigned char x0,x1,x2,x3,x4,x5,x6,x7,a=max7219_segnum;if(seg_data<99999999){x7=(seg_data/10000000);x6=(seg_data/1000000)%10;x5=(seg_data/100000)%10;x4=(seg_data/10000)%10;x3=(seg_data/1000)%10;x2=(seg_data/100)%10;x1=(seg_data/10)%10;x0=(seg_data%10);//将要显示的数据分位MAX7219_WOnebyte(MAX7219_ADD_Digit0,x0);if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit1,x1);a--;}if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit2,x2);a--;}if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit3,x3);a--;}if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit4,x4);a--;}if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit5,x5);a--;}if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit6,x6);a--;}if(a){MAX7219_WOnebyte(MAX7219_ADD_Digit7,x7);}}}验证电路:以上程序本人亲测可用,原版!!更多资讯请加入扣扣群:沈阳理工大学电子爱好者。

max7219驱动程序。doc

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单片以及级联驱动程序

MAX7219单片以及级联驱动程序

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工作原理简介

MAX7219工作原理简介

MAX7219工作原理简介MAX7219是一个采用3线串行接口的8位共阴极7段LED显示驱动器。

本文分析了MAX7219各个寄存器的功能,并结合MAX7219的工作时序,给出了MAX7219在Motorola MC68HC908单片机系统中的一个应用实例。

关键词: MCU;MAX7219;LED Motorola MC68HC908MAX7219工作时序及其寄存器MAX7219是一个高性能的多位LED显示驱动器,可同时驱动8位共阴极LED或64个独立的LED。

其内部结构框图如图1所示,主要包括移位寄存器、控制寄存器、译码器、数位与段驱动器以及亮度调节和多路扫描电路等。

MAX7219 采用串行接口方式,只需LOAD、DIN、CLK三个管脚便可实现数据传送。

DIN管脚上的16位串行数据包不受LOAD状态的影响,在每个CLK的上升沿被移入到内部16位移位寄存器中。

然后,在LOAD的上升沿数据被锁存到数字或控制寄存器中。

LOAD必须在第16个时钟上降沿或之后,但在下一个时钟上升沿之前变高,否则数据将会丢失。

DIN端的数据通过移位寄存器传送,并在16.5个时钟周期后出现在DOUT端,随CLK 的下降沿输出。

MAX7219的操作时序如图2所示。

MAX7219的串行数据标记为D15~D0,其中低8位表示显示数据本身,最高的4位D15~D12未使用,寻址内部寄存器的地址位占用D11~D8,选择14个内部寄存器,见表1。

图1 MAX7219内部结构框图图2 MAX7219的数据传送时序MAX7219 内部具有14个可寻址数字和控制寄存器。

其中的8个数字寄存器由一个片内8×8双端口SRAM实现。

它们可直接寻址,因此可对单个数进行更新并且通常只要 V+超过2V数据就可保留下去。

除8个数位寄存器之外,还有无操作、译码方式、亮度调整、扫描位数、睡眠模式和显示器测试6个控制寄存器。

无操作寄存器用于多片MAX7219级联,在不改变显示或不影响任意控制寄存器条件下,它允许数据从DIN传送到DOUT。

max7219数码管驱动程序库函数

max7219数码管驱动程序库函数
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驱动数码管程序(51单片机+STM32 MAX7219数码管程序案例)

max7219驱动数码管程序(51单片机+STM32 MAX7219数码管程序案例)
SPI1_InitStructure.SPI_Mode=SPI_Mode_Master;//设置SPI工作模式;设置为主SPI
SPI1_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //高位MSB在先
SPI1_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态,时钟悬空高
*功能:STM32_SPI1硬件配置初始化
*入口参数:无
*出口参数:无
*说明:STM32_SPI1硬件配置初始化,使用3V3
****************************************************************************/
void SPI1_Init(void)
SPI1_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//数据捕获于第二个时钟沿
SPI1_InitStructure.SPI_NSS = SPI_NSS_Soft;CPolynomial = 7;//CRC值计算的多项式
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//SPI1相关引脚

max7219程序

max7219程序
r2^=0x0080
[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 使用方法

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驱动数码管应用

MAX7219驱动数码管应用MAX7219的PROTEUS仿真MAX7219是美国MAXIM(美信)公司生产的串行输入/输出共阴极显示驱动器。

它采用了3线串行接口,传送速率达10M数据,能驱动8位七段数字型LED或条形显示器或64只独立的LED。

MAX7219内置BCD码译码器、多路扫描电路、段和数字驱动器和存储每一位的8*8静态RAM。

能方便的用模拟或数字方法控制段电流的大小,改变显示器的数量;能进入低功耗的关断模式(仅消耗150uA电流,数据保留);能方便地进行级联。

可广泛用于条形图显示、七段显示、工业控制、仪器仪表面板等领域。

而且其最重要的一点是,每个显示位都能个别寻址和刷新,而不需要重写其他的显示位,这使得软件编程十分简单且灵活。

MAX719后缀表示其封装方式和工作温度,如表所示:后缀封装工作温度 CNG 窄24脚 0----70? CWG SO24脚 0----70? ENG 窄24脚 -40---85? EWG SO24脚 -40---85? 一. MAX7219的结构和功能1(引脚说明MAX7219的引脚排列如图所示,各引脚功能叙述如下:(1)脚:DIN,串行数据输入。

在CLK的上升沿到来时,数据被移入到内部的16位移位寄存器中。

(2)、(3)、(5)~(8)、(10)、(11)脚:DIG0—DIG7,输入。

8位数字位位选线,从共阴极显示器吸收电流。

(4)、(9)脚:GND,地。

两个引脚必须连接在一起。

(12)脚:LOAD,数据装载输入端。

在LOAD上升沿,移位寄存器接受的数据被锁存。

(13)脚:CLK,时钟输入端,最高时钟频率10MHz。

在CLK的上升沿,数据被移入到内部的16位移位寄存器中。

在CLK的下降沿,数据从DOUT脚输出。

(14)~(15)、(20)~(23)脚:输出。

七段驱动器和小数点驱动器。

它供给显示器电流。

(18)脚:ISET,电流调节端。

通过一个电阻和VCC相连,来调节最大段电流。

串行接口8位LED显示驱动器MAX7219

串行接口8位LED显示驱动器MAX7219

表 2 串行数据格式( 16 位)
D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
X XXX
地址
数据
寄存器
空操作 位0 位1 位2 位3 位4 位5 位6 位7
译码模式 强度 限扫 关闭
显示测试
D15~ D12
表 3 寄存器地 址控制字
地址
D11
达。串行输入数据通过移位寄存器传输, 在以 D15( 如表 2 所列) , D8~ D11 为移位寄存器地
址, D0~ D7 为数据, D12~ D15 是无 关 位。第一位接收到的位 是最高位
D15。D7 为数据最高有效位, D0 为数 据最低有效位。
2. M AX 7219 控制字
图 2 M A X 7219 的功能框图
显示检测寄存器有两种操作模式: 一般测 试和显示测试。显示测试模式时所有的 L ED 点亮, 方法是将所有控制字寄存器( 包括关闭寄 存器) 置成无效。在显示测试模式下扫描 8 位的
表 5 软件译码数字对应的段笔划
寄存器数据 D7 D6 D5 D4 D3 D2 D1 D0 对应的段笔划 DP A B C D E F G
串行接口 8 位 LED 显示驱动器 MAX7219
- 29-
新特器件应用
串行接口 8 位 L ED 显示驱动器 M AX7219
山西省医疗器械研究所 张志清
摘要: M AX7219 是一种高集成化的串行输入/ 输出共阴极显示驱动器, 具有软件译码、硬 件译码功能, 单一位数据能被寻址更新, 可广泛应用于工业控制、仪器仪表的柱状图、7 段 码 L ED 矩阵显示。本文介绍了该驱动器的引脚功能、工作原理, 并给出了应用实例。 关键词: 串行数据 控制字 译码器 驱动器 L ED 显示

MAX7219在串行LED显示驱动器上的应用

MAX7219在串行LED显示驱动器上的应用

率高( 700- 800m2/m2) , 但价格贵一倍。各 个 换 热 站 采 用 钠 离 子 交 换 器 进行水处理, 所以换热站采用压差控 制 , 现 已 运 行 1000 万 m2; 已 投 入 运行两年, 没有发现任何问题。
6.结论 通过上面的分析, 对于二级热网, 更好地利用?城镇直埋供热管道 工程技术规程?指导工程设计, 对于满足规程验算条件的直管段, 完全
CLR ES DISP1: CLR P1.0
MOV R0, 20H
DISP2: MOV SBUF, @R0 JNB T1 INC R0 DJNZ R1, DISP2 SETB P1.0 NOP NOP CLR T1 RET
四 、结 束 语 : MAX7219 能 够 驱 动 8 个 LED, 可 方 便 地 对 每 位 LED 进行单独控制、刷新, 不需重写整个显示器寄存器, 通信方式采用 串行数据方式, 可与任何一种单片机方便接口。MCU8031 与 MAX7219 构成的显示系统可应用在条状图形显示器、7 段数 码 管 显 示 器 、工 业 控制器显示模板、面板表与 LED 矩阵显示器等众多场合。科
两 T 构的合拢段施工时, 将任一侧的桁架挂篮拆除, 另一侧的桁 架接长后 支 撑 在 第 10# 块 箱 梁 上 , 将 挂 篮 拖 至 适 当 位 置 , 即 可 进 行 合 拢段施工, 如简图 3- 3 所示。桁架挂篮应保持其中心线与箱梁中心线 一致, 如有偏移, 应使用千斤顶逐渐纠正。
五 、挂 篮 的 提 升 及 拆 除 箱梁由根部至端部为二次抛物线形, 因此每浇筑一个梁段均需将 底模提高一次。为此, 我们再吊带上精确制作了几个销钉孔, 根据销钉 位置不同来实现底模升高。当提高不多时, 可采取支垫底模的方法。经 过几次提高后, 高差变大时, 需用提升挂篮的方法将底模升高, 挂篮的 提升方法如简图 4 所示, 用链滑车将各吊带同时提高, 然后用炮弹销 穿入所需销钉孔。

MAX7219共阴极LED驱动器程序

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 的电阻。

MAX7219多级联驱动程序

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)

点阵屏驱动程序(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的字符驱动程序编写

树莓派上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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MAX7219共阴极LED数码管显示驱动
(一)、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的VCC端之间串一只去高频的电感。

而在电源方面,最好使用变压器供电,而不要用开关电源供电。

加在DIN引脚上的串行数据必须在LOAD脚为低电平时,以每2字节一次,在SCK脚信号的每个上升沿移入1位数据,且高位在前低位在后,然后在LOAD信号的上升沿MAX7219所存数据。

LED数码管引脚图如下:
显示段码表如下:
D7D6D5D4D3D2D1D0十六
进制值显示内容
dp a b c d e f g
011111100x7e0 001100000x301
011011010x6d2

010011110x4f E
010001110x47F
需要显示的段应为“1”,不显示的则为“0”
原理图如下:
C源程序如下:
#include<>
sbit CLK=P1^7; //MAX7219时钟信号线
sbit LD=P1^6; //数据加载线
sbit DIN=P1^5; //数据输入线
unsigned char code disp_table[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,
0x77,0x1f,0x4e,0x3d,0x01,0x00}; //非译码方式时的共阴数码管显示编码,0~9,E,o,r,d,-,息灭
void w_max7219(unsigned char addr,unsigned char wdata); //向MAX7219写数据函数声明
void init_max7219(); //MAX7219初始化函数声明
void timer_ms(unsigned char tim); //毫秒级延时函数声明
/******************************************************************************************
函数名称:main
函数说明:主函数
入口参数:
出口参数:
其它:
******************************************************************************************/ main()
{
init_max7219(); //MAX7219初始化函数
w_max7219(0x01,disp_table[1]); //向MAX7219第一位寄存器写显示数据1
w_max7219(0x02,disp_table[2]); //向MAX7219第二位寄存器写显示数据2
w_max7219(0x03,disp_table[3]); //向MAX7219第三位寄存器写显示数据3
w_max7219(0x04,disp_table[4]); //向MAX7219第四位寄存器写显示数据4
w_max7219(0x05,disp_table[5]); //向MAX7219第五位寄存器写显示数据5
w_max7219(0x06,disp_table[6]); //向MAX7219第六位寄存器写显示数据6
w_max7219(0x07,disp_table[7]); //向MAX7219第七位寄存器写显示数据7
w_max7219(0x08,disp_table[8]); //向MAX7219第八位寄存器写显示数据8
while(1);
}
/**********************************************************************************************
函数名称:init_max7219
函数功能:MAX7219初始化
入口参数:
出口参数:
其它:
**********************************************************************************************/ void init_max7219()
{
w_max7219(0x0a,0x07); //显示亮度,取值范围0~f
w_max7219(0x0b,0x07); //8位扫描显示,取值范围0x01~0x07
w_max7219(0x09,0x00); //译码方式,0x00为不译码,0xff为译码
w_max7219(0x0c,0x01); //操作方式,0x00为低功耗模式,0x01为正常操作模式
w_max7219(0x0f,0x00); //显示状态,0x00为正常显示,0x01为显示测试
timer_ms(2);
}
/*********************************************************************************************函数名称:w_max7219
函数功能:向MAX7219写入数据
入口参数:addr MAX7219内部寄存器地址,wdata 写入内部寄存器的操作数值
出口参数:
其它:
*********************************************************************************************/ void w_max7219(unsigned char addr,unsigned char wdata)
{
unsigned char temp,i=1,j,k;
LD=0;
while(i<16)
{
if(i<8) temp=addr; //先写入MAX7219内部寄存器地址,再向内部寄存器写入操作数值else temp=wdata;
for(j=0;j<8;j++)
{
CLK=0;
if((temp&0x80)==0x80) DIN=1; //先发送数据的最高位
else DIN=0;
for(k=5;k>0;k--); //时钟频率高的单片机需曾加延时时间,此处为12MHz
CLK=1;
for(k=5;k>0;k--);
temp<<=1;
}
i+=8;
}
LD=1;
}
/*-------------------------------------------------------------------------------------------函数名称: timer_ms
函数说明: 1ms延时子程序
入口参数: tim为接收主调传来需延时的毫秒数,取值范围1~256,定时时间1~256ms
出口参数:
其它:
------------------------------------------------------------------------------------------*/
void timer_ms(unsigned char tim)
{
unsigned char i;
while(tim--)
{
for(i=0;i<200;i++); //延时1ms }
}。

相关文档
最新文档