关于独立键盘程序的问题

2019-07-15 07:39发布

题目是这样的:

数码管前三位显示一个跑表,从000到999之间以1秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)。用另外三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始。

错误:
大体功能我实现了,但是有些细节没搞明白,也没解决,恳请各位老哥帮我看一下,看看问题出在哪里不胜感激。就是我按下key2和key3是数码管会灭两个,但是功能正常,而且最后一个数码管会格外的亮。后面我会附上两张图,请各位大哥看一下,下面我把我的程序贴上去。
程序:

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
uchar bai,shi,ge,tt;
uint num;

void keyscan();
void init();
void delay(uint z);
void display(uchar bai,uchar shi,uchar ge);
void main()
{
        init();
        while(1)
        {
                bai=num/100;        //给百十个位定义
                shi=num%100/10;
                ge=num%10;
                keyscan();
                display(bai,shi,ge);        //调用显示子程序
        }
}
//-----------------------------
void init()                //初始化函数
{
        num=0;
        tt=0;               
        TMOD=0x01;        //定时方式1
        EA=1;                //总中断打开
        ET0=1;                //定时T0允许中断
        TR0=1;                //打开定时T0中断
        TH0=(65536-50000)/256;                //给定时器T0附初值
        TL0=(65536-50000)%256;
}
//--------------------------------
void exter() interrupt 1                //T0工作方式1
{
        TH0=(65536-50000)/256;                //给定时器T0附初值
        TL0=(65536-50000)%256;
        tt++;               
}
//-------------------------------
void delay(uint z)
{
        uint x,y;                //延时程序延时一毫秒
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);               
}
//--------------------------------
void display(uchar bai,uchar shi,uchar ge)                //3位显示程序
{
        dula=1;
        P0=table[bai];
        dula=0;                //对百位赋值
        P0=0xff;        //防止数据进入位选造成错乱
        wela=1;
        P0=0xfe;
        wela=0;
        delay(1);        //打开数码管第一个即百位

        dula=1;
        P0=table[shi];
        dula=0;                //对十位赋值
        P0=0xff;        //防止数据进入位选造成错乱
        wela=1;
        P0=0xfd;
        wela=0;
        delay(1);        //打开数码管第二个即十位        

        dula=1;
        P0=table[ge];
        dula=0;                //对个位赋值
        P0=0xff;        //防止数据进入位选造成错乱
        wela=1;
        P0=0xfb;
        wela=0;
        delay(1);        //打开数码管第三个即个位        
}
//---------------------------------------
void keyscan()                        //键盘扫描程序
{
                if(key1==0)                //判断key1是否按下
                {
                        delay(5);        //防抖
                        if(key1==0)
                        {
                                TR0=0;                //关闭定时器
                                dula=1;                //关闭数码管
                                P0=0xff;
                                dula=0;
                                delay(1);
                                wela=1;
                                P0=0xff;
                                wela=0;
                        }
                        while(!key1);        //判断key1是否松开
                        delay(5);                //防抖
                        while(!key1);
                        TR0=1;                //打开定时器
                }
                else                        //key1断开
                {
                                if(tt==20)        //判断是否一秒
                                {
                                        tt=0;                //一秒一数
                                        num++;                //数字累加
                                                if(num==999)        //判断NUM是否为999
                                                {
                                                num=0;                        //num归0
                                                }
                                }        
                }
//-------------------------------
                if(key2==0)                //判断key2是否按下
                {
                        delay(5);        //消抖
                        if(key2==0)
                        {               
                                TR0=0;        //关闭定时器
                        }
                                while(!key2);        //抬起检测
                                delay(5);
                                while(!key2);

                }
//--------------------------------
                if(key3==0)
                {
                        delay(5);
                        if(key3==0)
                        {
                                TR0=0;        //关闭定时器
                        }
                                while(!key3);        //抬起检测
                                delay(5);
                                while(!key3);
                                TR0=1;        //开启定时器
                }
//----------------------------------
                if(key4==0)
                {
                        delay(5);
                        if(key4==0)
                        {        
                                num=0;        
                                if(tt==20)        //判断是否一秒
                                {        
                                        tt=0;                //一秒一数
                                        num++;                //数字累加
                                                if(num==999)        //判断NUM是否为999
                                                {
                                                num=0;                        //num归0
                                                }
                                }
                        }        
                }
}



</div>


正常情况下 正常情况下
按下key2的情况下 按下key2的情况下
0条回答

一周热门 更多>