74HC595 24位数码管 移位寄存器  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;   }  } }分享到: 
 
  |