每秒显示的数字加1,并在数码管上显示出来。
程序要求:
定时器定时,数码管显示时间,并且数码管数字显示每1s数字加1,显示0-9999。
使用74LS373控制I/O口,可以节省I/O口。
74LS373简介:
74LS373是三态输出的八D锁存器,共有54S373和74LS373两种线路。373 的输出端 Q0~Q7 可直接与总线相连。当锁存允许端LE为高电平时,Q 随数据D而变,当LE为低电平时,D 被锁存在已建立的数据电平。
真值表:
电路原理图:
程序代码:
#include<reg52.h>
sbit duan=P2^6;
sbit wei=P2^7;
#define uchar unsigned char
#define uint unsigned int
uint num,count;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//数码管对应 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
uchar smwei[] = {0,0,0,0};
void delay(uint i)
{
while(i--); //i=1时,大约延时10us
}
void DigDisplay()
{
uint i;
for(i=0;i<4;i++)
{
smwei[0] = num%1000%100%10;
smwei[1] = num%1000%100/10;
smwei[2] = num%1000/100;
smwei[3] = num/1000;
switch(i) //位选,选择点亮的数码管,
{
case(0):
wei=1;P0=0xfe;wei=0; break;//显示第0位
case(1):
wei=1;P0=0xfd;wei=0; break;//显示第1位
case(2):
wei=1;P0=0xfb;wei=0; break;//显示第2位
case(3):
wei=1;P0=0x07;wei=0; break;//显示第3位
}
duan=1;
P0=table[smwei[i]];//发送段码
duan=0;
delay(1000); //间隔一段时间扫描
//P0=0x00;//消隐
}
}
void main()
{ ET1=1;
EA=1;
TMOD=0x10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
while(1)
{
if(count==20)
{
count=0;
num++;
if(num==10000)
{
num=0;
}
}
DigDisplay();
}
}
void time1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
}