题目是这样的。数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下个独立键盘时跑表停止,按下第二个时计时开始,按下第三个时计数值清零从头开始。
本人编写的程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e};
uchar num,bai,shi,ge,aa;
uint temp;
void delay(uint z);
void display(uchar bai,uchar shi,uchar ge);
void init();
void keyscan();
void main()
{
init();//初始化子程序
while(1)
{
keyscan();
if(aa==1)//用中断一秒钟计时
{
aa=0;
temp++;
}
display(bai,shi,ge);//显示数字
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar bai,char shi,uchar ge)
{
if(temp==999)
{
temp=0;
}
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
P2=0x7f;
P0=table[ge];
delay(1);
P2=0xbf;
P0=table[shi];
delay(1);
P2=0xdf;
P0=table[bai];
delay(1);
}
void init()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
count=1;
}
void timer0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
aa++;
}
void keyscan()
{
uchar getkey;
P1=0xfe;//扫描第一行
getkey=P1;
getkey=getkey&0xf0;//判断是否有按键按下
while(getkey!=0xf0)//有按键按下进入循环,并消抖
{
/*count++;
if(count%2!=0)
TR0=0;
if(count%2==0)
TR0=1;*/
delay(5);
getkey=P1;
getkey=getkey&0xf0;
while(getkey!=0xf0)
{
getkey=P1;
switch(getkey)
{
case 0xee:TR0=1;
break;
case 0xde:TR0=0;
break;
case 0xbe:temp=0;
break;
}
while(getkey!=0xf0)//松手监测,松手后程序直接跳出三层循环进入while(1)循环,继续执行程序
{
getkey=P1;
getkey=getkey&0xf0;
}
}
}
}
程序设定第一个键为开始键,但是发现在程序最开始和跑表暂停后开始,按键到跑表开始显示有很长的延时,大概1秒多。这个情况,大大降低了跑表的实用性。求大神帮看看程序,怎么解决这个问题?十分感谢,万分感激!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
按键最好还是用中断方式查询,这样响应快速
一周热门 更多>