单片机/MCU论坛
直播中

廖观旺

9年用户 14经验值
擅长:嵌入式技术
私信 关注
[问答]

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

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

代码:
/*
例4.1.1数码管的前两位显示一个十进制数P82
*/
#include
#define uchar unsigned char
#define uint unsigned int                 
***it dula=P2^0;        //段选的引脚是p^0  ,申明U1锁存器的锁存端
***it wela=P2^1;
//独立键盘
***it key1=P3^2;
***it key2=P3^3;
***it key3=P3^4;
***it 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
已退回3积分

回帖(7)

ggxxff

2015-11-23 20:08:31
头文件最起码是#include<52.h>
举报

廖观旺

2015-11-24 10:17:28
引用: ggxxff 发表于 2015-11-23 20:08
头文件最起码是#include

这款单片机的头文件是
举报

he4966

2015-11-27 21:38:49
显示那块你说一次只显示1位 (说明扫描的不够快(说明里面有等待  有延时的意思 )  )    按键没左右估计就是你前面扫描的慢 还没到键盘那里去  不然按键代码你就换成标志的那种判断来进入
举报

廖观旺

2015-12-4 14:22:54
引用: he4966 发表于 2015-11-27 21:38
显示那块你说一次只显示1位 (说明扫描的不够快(说明里面有等待  有延时的意思 )  )    按键没左右估计就是你前面扫描的慢 还没到键盘那里去  不然按键代码你就换成标志的那种判断来进入

问题解决了,是delay函数哪里i写成i++了,应该是i--
举报

h1654155920.4618

2015-12-18 22:02:53
举报

李永飞

2016-11-13 21:53:24
请问你这个解决了么?  我也是郭天祥的书也是这个样
举报

李永飞

2016-11-13 21:55:34
引用: Qianyes 发表于 2015-12-4 14:22
问题解决了,是delay函数哪里i写成i++了,应该是i--

我的是i--  可是我按时是第二个数码管亮第一个不亮  松手就亮
举报

更多回帖

发帖
×
20
完善资料,
赚取积分