题目是这样的。数码管前三位显示一个跑表,从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秒多。这个情况,大大降低了跑表的实用性。求大神帮看看程序,怎么解决这个问题?十分感谢,万分感激!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
之前写的参考一下吧
用独立按键的
#include <reg52.h>
/*以1/10秒的速度从000到999,然后再重新开始计时。
按下开关1--暂停计时
按下开关2--开始计时
按下开关3--重新开始*/
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^1;
sbit wela=P2^0;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
uint temp;
uchar bai,shi,ge,num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(uchar bai,uchar shi,uchar ge);
void delay(uint);
void init();
void main()
{
init();
while(1)
{
if(key1==0)
TR0=0;
if(key2==0)
TR0=1;
if(key3==0)
{
temp=0;
if(TR0!=1)
TR0=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256;
}
display(bai,shi,ge);
}
}
void init()
{
temp=0;
num=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==2)
{
num=0;
temp++;
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
if(temp==999)
{
temp=0;
}
}
}
void display(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[bai];
dula=0;
wela=1;
P0=0xdf;
wela=0;
delay(1);
dula=1;
P0=0x00;
dula=0;
dula=1;
P0=table[shi];
dula=0;
wela=1;
P0=0xbf;
wela=0;
delay(1);
dula=1;
P0=0x00;
dula=0;
dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=0x7f;
wela=0;
delay(1);
dula=1;
P0=0x00;
dula=0;
}
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}
一周热门 更多>