微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 独立键盘控制数码管显示 出现问题?求大神帮忙分析下

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

时间:10-02 整理:3721RD 点击:

单片机型号:HJ-C52


代码:
/*
例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;
        }
}


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



头文件最起码是#include<52.h>

这款单片机的头文件是<reg52.h>

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

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

请问你这个解决了么?  我也是郭天祥的书也是这个样

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top