Max7219驱动led时钟代码(包含初始化
- 格式:docx
- 大小:13.62 KB
- 文档页数:2
Arduino驱动MAX7219四位数码管显示时间Arduino驱动MAX7219四位数码管显示时间默认使用Pin 2为MOSI(数据发送)引脚,Pin 3为CS(片选)引脚,Pin 4为SCLK(时钟)引脚,如有需要请修改代码前三行的define。
#define MO 2#define CS 3#define CLK 4static int time_h = 21, time_m =25, time_s = 30; //此刻时间:时,分,秒int alarm_clock_h = 8, alarm_clock_m = 00; //闹钟时间unsigned long time = 0;unsigned char buffer_led[5] = { 0x00,};//缓存void SPI_init(void) //初始化SPI引脚{pinMode(CLK, OUTPUT);pinMode(MO, OUTPUT);pinMode(CS, OUTPUT);digitalWrite(CS, HIGH);digitalWrite(CLK, LOW);digitalWrite(MO, HIGH);}void SPI_send(unsigned char reg, unsigned char data) //spi 单向16位数据发送{int x;/*Serial.print("reg = ");Serial.print(reg, HEX);Serial.print(" data = ");Serial.println(data, HEX);*/digitalWrite(CS, LOW);for (x = 0; x < 8; x++){digitalWrite(MO, 0x80 & (reg << x)); //高位在前digitalWrite(CLK, HIGH);digitalWrite(CLK, LOW);}for (x = 0; x < 8; x++){digitalWrite(MO, 0x80 & (data << x)); //高位在前digitalWrite(CLK, HIGH);digitalWrite(CLK, LOW);}digitalWrite(CS, HIGH);}void lcd_init(void)//初始化Max7219配置{SPI_send(0x0b, 0x07); //scan-limitSPI_send(0x09, 0xff); //decode mode allSPI_send(0x0c, 0x01); //shutdown offSPI_send(0x0f, 0x00); //off display testSPI_send(0x0a, 0x04); //intensitydelay(100);}void clear(void)//清除显示{for (int i = 1; i <= 8; i++){SPI_send(i, 0x0F);}}void led_display(void)//显示时间{char cache = 0x00;if ((time_h / 10) == 0)buffer_led[0] = 0x00;else buffer_led[0] = time_h / 10;buffer_led[1] = time_h % 10 | 0x01;buffer_led[2] = time_m / 10;buffer_led[3] = time_m % 10;SPI_send(8, buffer_led[0]);SPI_send(7, buffer_led[1]);SPI_send(6, 0x0a);SPI_send(5, buffer_led[2]);SPI_send(4, buffer_led[3]);SPI_send(3, 0x0a);SPI_send(2, time_s / 10);SPI_send(1, time_s % 10);}void get_time()//获取时间并更新显示{static char ss = 1;static unsigned long time_cc = 0;if ((millis() - time_cc) > 1000 | millis() < 150)//秒{if (millis() <= 200) //若系统计时器溢出时时间,time_cc重计{time_cc = millis();time_s ++;delay(150);}else if (millis() > 200)//秒{time_s += (millis() - time_cc) / 1000;// time_cc = millis()-990; //时间快进time_cc = millis();buffer_led[4] = (0x01 & ss) << 5;ss = ~ss;}if (time_s > 59) //分{if (time_s - 60 > 1)//如果有延时间隔导致秒钟大于60秒,进行分钟缺失补偿 {time_m += time_s / 60;if (time_s % 60 == 0)time_m--;time_s = time_s - (time_s / 60) * 60;}else time_s = 0;time_m++;buffer_led[4] = 0x80;if (time_m > 59)//时{time_h++;time_m = (time_m - 60);buffer_led[4] = 0xf0;}if (time_h > 23){time_h = 0;time_s += 5; //时间误差补偿}}// Serial.print("millis="); // Serial.print(time_cc);// Serial.print(" time="); // Serial.print(time_h);// Serial.print(":");// Serial.print(time_m);// Serial.print(":");// Serial.println(time_s); led_display();//刷新数码管显示}}void setup(){Serial.begin(9600);SPI_init();lcd_init();clear();}void loop(){get_time();}。
串行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是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基本驱动程序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驱动程序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驱动数码管#include#define uchar unsigned char#define uint unsigned intsbit DIN=P0^1; //"显示串行数据输入端"sbit LOAD=P0^2; //"显示数据锁存端"sbit CLK=P0^3; //"显示时钟输入端"#define DecodeMode 0x09 //"译码模式"#define Intensity 0x0a //"亮度"#define ScanLimit 0x0b //"扫描界限"#define ShutDown 0x0c //"掉电模式"#define DisplayTest 0x0f //"显示测试"uchar code seg_data[]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B}; //"0,1,2,3,4,5,6,7,8,9" uchar disp_buf[5];uchar code bit_tab[]={0x01,0x02,0x03,0x04};uchar hour=12,min=0,sec=0,count=0;bit flag;void delay (uint a) //" 毫秒延时函数"{uint i;while( --a != 0){for(i = 0; i < 110; i++);}}void write_max7219_byte(uchar temp){uchar i;for(i=0;i<8;i++){CLK=0;DIN=(bit)(temp&0x80);temp<<=1;CLK=1;}}void write_max7219(uchar address,uint dat){LOAD=0;write_max7219_byte(address);write_max7219_byte(dat);LOAD=1;}void Init_max7219 (void){write_max7219(ScanLimit,0x07); //*"设置扫描界限"*/write_max7219(DecodeMode,0xff); //*"设置译码模式"*/ write_max7219(Intensity,0x04); //*"设置亮度"*/write_max7219(ShutDown,0x01); //*"设置电源工作模式"*/ write_max7219(DisplayTest,0x01);delay(5);write_max7219(DisplayTest,0x00);}void conv(uchar in1,in2){disp_buf[0]=in1/10;disp_buf[1]=in1%10;disp_buf[2]=in2/10;if(flag==0)disp_buf[3]=(in2%10)|0x80;elsedisp_buf[3]=in2%10;}void display( ){write_max7219(bit_tab[0],disp_buf[0]); write_max7219(bit_tab[1],disp_buf[1]); write_max7219(bit_tab[2],disp_buf[2]); write_max7219(bit_tab[3],disp_buf[3]); }void init(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==20){count=0;flag=~flag;sec++;if(sec==60) {sec=0;min++;if(min==60) {min=0;hour++;if(hour==24) {hour=0;min=0;sec=0;}}}}}void main() {init();Init_max7219 ( ); while(1){conv(hour,min); display( );}}。
max7221led驱动c语言程序详解#include#define uint unsigned int#define uchar unsigned charsbit din=P2^0; //数据输入口sbit cs=P2^1; //写保护控制sbit sclk=P2^2; //时钟控制uint shu;uchar code table[]={0,1,2,3,4,5,6,7,8,9, //无小数点的0~90x80,0x81,0x82,0x83,0x84,0x85,0x86,0x89}; //有小数点的0~9 void delay(uint x){uint j;while(x--)for(j=110;j>0;j--);}void write(uchar address,uchar date){uchar i;cs=0; //允许数据输入for(i=0;i<8;i++){sclk=0;delay(0);address<<=1; //这个地方为什么从最高位开始转送看看maxim 公司的中文资料寄存器就明白了din=CY; //移位后的数据被存储到CY寄存器中sclk=1;delay(0); //上升沿将数据送入寄存器}for(i=0;i<8;i++)sclk=0;delay(0);date<<=1;din=CY;sclk=1;delay(0);}cs=1;}void display(){write(0x01,table[(shu/100)+10]); //第一位带小数点delay(5);write(0x02,table[shu%100/10]);delay(5);write(0x04,table[shu%10]);delay(5);write(0x00,0x00);}void init(){write(0x09,0xff); //编码模式为b(cd)码形式贮存write(0x0a,0x07); //数码管亮度控制write(0x0b,0x02); //扫描数码管的位数write(0x0c,0x01); //工作模式shu=210;}void main(){init();while(1)display(); }}。