做了一个10S的秒表程序,用三个数码管显示。显示精度是1%秒。自动运行时,三个数三管显示正常。按下暂停开关时,只有第三个数码管亮,松开开关时,三个数码管正常,都能显示。请高手帮忙分析一下,按下开关时,三个数码管应该都能显示当前的数字。
程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit key2=P3^4;
uint temp;
uchar t0,bai,shi,ge;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void display(uchar bai,uchar shi,uchar ge);
void main()
{
P3=0xff;
TMOD=0X01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
ET0=1;
EA=1;
TR0=1;
while(1)
{
if(t0==1)//1ms定时到时,进入程序内部.
{
t0=0;
temp++;
if(temp==1000)
temp=0;
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
}
display(bai,shi,ge);//数码管显示程序
if(key2==0)//开关按下时,定时器0停止工作,
{
delay(5);
if(key2==0)
TR0=0;
while(!key2);//开关松开时,定时器0工作,
delay(5);
while(!key2);
TR0=1;
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void time0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
t0++;
}
void display(uchar bai,uchar shi,uchar ge)
{
wela=1;
P0=0xfe;
wela=0;//打开第一个数码管
dula=1;
P0=table[bai];
dula=0;
delay(1);//显示
wela=1;
P0=0xfd;
wela=0;//打开第二个数码
dula=1;
P0=table[shi];
dula=0;
delay(1);//显示2
wela=1;
P0=0xfb;
wela=0;//打开第三个数码管
dula=1;
P0=table[ge];
dula=0;
delay(1);//显示3
} |