#include<reg51.h>
unsigned table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char i=0,h=0,m=13,s=0;
#define uchar unsigned char
sbit a =P1^0 ;
sbit led=P3^7;
sbit lad=P3^6;
void delayms(unsigned int x)
{
unsigned char a=160;
while(x--)
{
while(a--);
a=160;
}
}
void DelayM(int x)
{
uchar j;
for(j=0;j<(x*20);j++)
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
while(!TF1);
TF1=0;
}
}
void main()
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TMOD=0x11;
TR0=0;
ET0=1;
EA=1;
led=0;
lad=1;
while(1)
{
P0=table[h/10];
P2=~32;
delayms(1);
P2=0xff;
P0=table[h%10];
P2=~16;
delayms(1);
P2=0xff;
P0=table[m/10];
P2=~8;
delayms(1);
P2=0xff;
P0=table[m%10];
P2=~4;
delayms(1);
P2=0xff;
P0=table[s/10];
P2=~2;
delayms(1);
P2=0xff;
P0=table[s%10];
P2=~1;
delayms(1);
P2=0xff;
if(a==0)
{
delayms(200);
TR0=1;
led=1;
DelayM(5);
led=0;
}
}
}
void t0()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i>=20)
{
i=0;
s--;
if(s>59)
{
s=59;
m--;
if(m>59)
{
m=59;
h--;
if(h>23)
{
h=0;
m=0;
s=0;
TR0=0;
}
}
}
}
}
我想实现的功能是本来一灭一亮的两个led灯在按下a按键后变成都亮持续5秒,再恢复原样。同时6位数码管显示都亮的倒计时。但是这个程序仿真出来是按下a按键后数码管没显示数字,但LED亮了持续5秒,恢复原样后数码管才显示数字,时间是走了5秒后的。这是怎么回事?
|