独立键盘控制数码管显示 出现问题?求大神帮忙分析下

2019-07-15 15:34发布

D]MLO}(~D{RYXV%R0LOZ9(Q.png 单片机型号:HJ-C52
8LA2TQ`2UKQFP`S1J`4QBLG.png

代码:
/*
例4.1.1数码管的前两位显示一个十进制数P82
*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int                 
sbit dula=P2^0;        //段选的引脚是p^0  ,申明U1锁存器的锁存端
sbit wela=P2^1;
//独立键盘
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^4;
sbit key4=P3^5;


uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delayms(uint);
uchar numt0,num;

void display(uchar numdis)
{
        uchar shi,ge;
        shi=numdis/10;         //分离两个分别要显示的数
        ge=numdis%10;

        dula=1;                  
        P0=table[shi];         //送十位段选数据
        dula=0;
        P0=0xff;         //送位选数据前关闭所有显示,防止打开位选锁存  
        wela=1;
        P0=0xfe;        //1111 1110
        wela=0;
        delayms(5);         //延时

        dula=1;
        P0=table[ge];         //送十位段选数据
        dula=0;
        P0=0xff;         //送位选数据前关闭所有显示,防止打开位选锁存是
        wela=1;
        P0=0xfd;    // 1111 1101
        wela=0;
        delayms(5);         //延时
}

void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i++)        //i=xms即延时约xms毫秒
                for(j=110;j>0;j--);
}

void init() //初始化函数
{
        TMOD=0x01;         //设置定时器0为工作方式1(0000 0001)
        TH0=(65536-45872)/256; //装初值50ms一次中断
        TL0=(65536-45872)%256;
        EA=1;                                         //开总中断
        ET0=1;                                           //开定时器0中断

}


void keyscan()
{
        if(key1==0)
        {
                delayms(10);
                if(key1==0)
                {
                        num++;
                        if(num==60)         //当到60时重新归0
                                num=0;
                        while(!key1); //等待按键释放
                }
        }
        if(key2==0)
        {
                delayms(10);
                if(key2==0)
                {
                        if(num==0)         //当到0时重新归60
                                num=60;
                        num--;
                        while(!key2);               
                }
        }
        if(key3==0)
        {
                delayms(10);
                if(key3==0)
                {
                        num=0;                   //清0
                        while(!key3);
                }
        }
        if(key4==0)
        {
                delayms(10);
                if(key4==0)
                {
                        while(!key4);
                        TR0=~TR0;          //启动或停止定时器0
                }
        }
}

void main()
{
        init();                         //初始化函数
        while(1)
        {       
      

                keyscan();
                display(num);
        }
}

void T0_time() interrupt 1
{

        TH0=(65536-45872)/256;        //重装初值
        TL0=(65536-45872)%256;
        numt0++;
        if(numt0==20)                   //如果到了20次,说明1秒时间到
        {
                numt0=0;                   //然后把numt清0重新再计20次
                num++;
                if(num==60)
                        num=0;
        }
}





问题:
数码管只显示十位,然后过一会显示个位,同时十位灭,如此重复。按独立键盘没反应。

结果图:
3904307E1D746C6809731F4E4BCCC8CD.jpg


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
ggxxff
1楼-- · 2019-07-15 17:58
头文件最起码是#include<52.h>
Qianyes
2楼-- · 2019-07-15 19:29
ggxxff 发表于 2015-11-23 20:08
头文件最起码是#include

这款单片机的头文件是<reg52.h>
he4966
3楼-- · 2019-07-15 21:58
 精彩回答 2  元偷偷看……
Qianyes
4楼-- · 2019-07-16 00:15
he4966 发表于 2015-11-27 21:38
显示那块你说一次只显示1位 (说明扫描的不够快(说明里面有等待  有延时的意思 )  )    按键没左右估计就是你前面扫描的慢 还没到键盘那里去  不然按键代码你就换成标志的那种判断来进入

问题解决了,是delay函数哪里i写成i++了,应该是i--
wangweijie2016
5楼-- · 2019-07-16 03:35
momolee
6楼-- · 2019-07-16 05:57
请问你这个解决了么?  我也是郭天祥的书也是这个样

一周热门 更多>