#include <reg52.h> #include <intrins.h> sbit DIN_7219=P0^5; //7219串行数据输入端 sbit LOAD_7219=P0^6; //7219数据锁存端 sbit CLK_7219=P0^7; //7219时钟输入端 #define uchar unsigned char uchar code LEDcode[]= {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00 /*0,1,2,3,4,5,6,7,8,9,全灭*/ /*0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff,*/ }; /*A,B,C,D,E,F,P,U,全亮*/ void write_7219_byte (uchar dat) { uchar i,temp; for (i=0;i<8;i++) { temp=dat&0x80; dat=dat<<1; if(temp) DIN_7219=1; else DIN_7219=0; CLK_7219=0; _nop_(); CLK_7219=1; //时钟上升沿把数据送入寄存器锁定 } } void write_7219 (uchar addr,uchar dat) { LOAD_7219=0; //寄存器打开,等待数据的送入 _nop_(); write_7219_byte (addr); //选择寄存器地址 _nop_(); write_7219_byte (dat); //选择让芯片执行什么命令 _nop_(); LOAD_7219=1; //第16个上升沿之后,第17个上升沿之前必须把pinCLK置高,否则数据丢失 } void init_7219 (void) { write_7219 (0x0c,0x01); /* 设置电源工作模式 */ write_7219 (0x0a,0x02); /* 设置亮度(19/32,根据需要增减)*/ write_7219 (0x0b,0x03); /* 设置扫描界限(根据需要增减) */ write_7219 (0x09,0x00); /* 设置译码模式(00不译,FF译) */ write_7219 (0x0f,0x00); /* 显示测试(00为正常工作状态) */ } void clear_7219(void) { uchar i; //变量i,用来选择数码管位选 for(i=8;i>0;i--) //i自减,选择完所有的8位 { write_7219(i,0x00); //对应位选的段全部清除显示 } } void main(void) { init_7219 (); //MAX7219初始化 clear_7219(); //MAX7219清除显示,免去干扰 while(1) { write_7219(0x01,LEDcode[5]); //扫描第一位(LSB),并送段码显示 write_7219(0x02,LEDcode[5]|0x80); //扫描第二位,并送段码显示,同时加显小数点2| 0x80 如果不加小数点就去掉|0x80 write_7219(0x03,LEDcode[5]); //扫描第三位,并送段码显示 write_7219(0x04,LEDcode[5]); //扫描第四位,并送段码显示 // write_7219(0x05,LEDcode[5]); //扫描第五位,并送段码显示 // write_7219(0x06,LEDcode[6]); //扫描第六位,并送段码显示 // write_7219(0x07,LEDcode[7]); //扫描第七位,并送段码显示 // write_7219(0x08,LEDcode[8]); //扫描第八位(MSB),并送段码显示 } } |