数码管前三位显示一个跑表

2019-07-15 23:11发布

题目是这样的。数码管前三位显示一个跑表,从000999之间以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秒多。这个情况,大大降低了跑表的实用性。求大神帮看看程序,怎么解决这个问题?十分感谢,万分感激!


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。