74HC595是一個8位移位寄存器的數字芯片,并具有輸出鎖存和三態輸出。
既然可以驅動了那么多的數碼管,驅動大屏點陣還是夢?絕對不是夢?
引腳功能:
第8腳GND,電源地。
第16腳VCC,電源正極
第14腳DATA,串行數據輸入口,顯示數據由此進入,必須有時鐘信號的配合才能移入。
第13腳EN,使能口,當該引腳上為“1”時QA~QH口全部為“1”,為“0”時QA~QH的輸出由輸入的數據控制。
第12腳STB,鎖存口,當輸入的數據在傳入寄存器后,只有供給一個鎖存信號才能將移入的數據送QA~QH口輸出。
第11腳CLK,時鐘口,每一個時鐘信號將移入一位數據到寄存器。
第10腳SCLR,復位口,只要有復位信號,寄存器內移入的數據將清空,顯示屏不用該腳,一般接VCC。
第9腳DOUT,串行數據輸出端,將數據傳到下一個。
第15、1~7腳,并行輸出口也就是驅動輸出口,驅動LED。
附上仿真圖:
驅動程序也很簡單: #include<reg51.h> #include<intrins.h> #define uchar unsigned char uchar code display[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar buf[5]; sbit SH=P2^0; sbit SDA=P2^1; sbit ST=P2^2; uchar count,sec,min; void delay(unsigned char i) { unsigned char j=220; while(i--) while(j--); } void write_595(uchar p) { uchar i,temp; temp=p; for(i=0;i<8;i++) { if(temp&0x80) SDA=1; else SDA=0; SH=0; _nop_(); _nop_(); SH=1; temp<<=1; } } void init_T() //中斷和定時器初始化 { IE=0x82; //打開總中斷,定時器T1和T0中斷 TMOD=0x01; //設定T1,T0位工作方式1 TH0=0x9e; TL0=0x58; //T0裝初值 TR0=1; //開始時鐘開始工作 } void main() { uchar scan,i; init_T(); while(1) { buf[0]=sec%10; buf[1]=sec/10; // buf[2]=; buf[3]=min%10; buf[4]=min/10; scan=0x01; for(i=0;i<5;i++) { ST=0; ST=1; write_595(~display[buf[i]]); write_595(~display[sec%10]); write_595(~display[sec/10]); write_595(~display[min%10]); delay(1); P1=~scan; scan<<=1; } } } void time_T0() interrupt 1 //定時器0,工作方式1,時鐘中斷 { TH0=0x9e; TL0=0x58; //T0裝初值 count++; if(count==40) { count=0; sec++; if(sec==60) { sec=0; min++; if(min==60) min=0; } } }