#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),并送段碼顯示 } } |