利用74HC573芯片
74HC573的八个锁存器都是透明的D型锁存器,当使能(G)为高时,Q输出将随数据(D)输入而变。当使能为低时,输出将锁存在已建立的数据电平上。输出控制不影响锁存器的内部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总线,而不需要外接口。特别适用于缓冲寄存器,I/O通道,双向总线驱动器和工作寄存器。
仿真图如下:
利用网络标号连接各个器件。
#include<reg51.h>
unsigned char seven_seg[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char sec = 30,min = 20,hour = 12;
unsigned char cp,cp1,cp2,flash;
sbit LE = P1^0;
void timer0_isr(void) interrupt 1
{
TH0 = (65536 - 2000) /256;
TL0 = (65536 - 2000) %256;
P0 = 0xff;
P0 = 0x01;LE = 0;LE = 1;LE = 0;P0 = seg[0];
P0 = 0x02;LE = 0;LE = 1;LE = 0;P0 = seg[1];
P0 = 0x04;LE = 0;LE = 1;LE = 0;P0 = seg[2];
P0 = 0x08;LE = 0;LE = 1;LE = 0;P0 = seg[3];
P0 = 0x10;LE = 0;LE = 1;LE = 0;P0 = seg[4];
P0 = 0x20;LE = 0;LE = 1;LE = 0;P0 = seg[5];
P0 = 0x40;LE = 0;LE = 1;LE = 0;P0 = seg[6];
P0 = 0x80;LE = 0;LE = 1;LE = 0;P0 = seg[7];
cp++;
if(cp >= 8)cp = 0;
cp1++;
if(cp1 >= 250){cp1 = 0;cp2++;flash = ~flash;}
if(cp2 >= 2){cp2 = 0;sec++;}
if(sec >= 60){sec = 0;min++;}
if(min >= 60){min = 0;hour++;}
if(hour >= 24)hour = 0;
}
void timer0_init(void)
{
TMOD = 0x01;
TH0 = (65536 - 2000) /256;
TL0 = (65536 - 2000) %256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
timer0_init();
while(1)
{seg[0] = seven_seg[sec % 10];
seg[1] = seven_seg[sec / 10];
seg[2] = 0xbf | flash;
seg[3] = seven_seg[min % 10];
seg[4] = seven_seg[min / 10];
seg[5] = 0xbf | flash;
seg[6] = seven_seg[hour % 10];
seg[7] = seven_seg[hour / 10];}
}
由于程序重复,可以简化为数组。
以上程序可以化简:
#include<reg51.h>
unsigned char seven_seg[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char bit_scan[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char seg[8],sec = 30,min = 20,hour = 12;
unsigned char cp,cp1,cp2,flash;
sbit LE = P1^0;
void timer0_isr(void) interrupt 1
{
TH0 = (65536 - 2000) /256;
TL0 = (65536 - 2000) %256;
P0 = 0xff;
P0 = bit_scan[cp];LE = 0;LE = 1;LE = 0;P0 = seg[cp];
cp++;
if(cp >= 8)cp = 0;
cp1++;
if(cp1 >= 250){cp1 = 0;cp2++;flash = ~flash;}
if(cp2 >= 2){cp2 = 0;sec++;}
if(sec >= 60){sec = 0;min++;}
if(min >= 60){min = 0;hour++;}
if(hour >= 24)hour = 0;
}
void timer0_init(void)
{
TMOD = 0x01;
TH0 = (65536 - 2000) /256;
TL0 = (65536 - 2000) %256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
timer0_init();
while(1)
{seg[0] = seven_seg[sec % 10];
seg[1] = seven_seg[sec / 10];
seg[2] = 0xbf | flash;
seg[3] = seven_seg[min % 10];
seg[4] = seven_seg[min / 10];
seg[5] = 0xbf | flash;
seg[6] = seven_seg[hour % 10];
seg[7] = seven_seg[hour / 10];}
}
运行程序: