微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 按钮计数用数码管显示为何不为0?

按钮计数用数码管显示为何不为0?

时间:10-02 整理:3721RD 点击:
本人是新手,编了一个按钮计数用数码管显示。百思不得其解,计数到30,应该为0,但显示20,再从20开始计数到30,显示10.困扰了我好几天,麻烦各位高手解答。(用4094驱动LED,把24位数发送后,开启数码管)
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit  DATA= P1^1;
sbit   CLK= P1^2;
sbit   STR= P1^0;
sbit  key_input =P3^5 ;
uchar code DSY_CODE[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
uchar ge,shi,bai,qian,data1;    //定义输入的整型变量的个,十,百, 数值
uchar key_return;
#define key_state_0  0
#define key_state_1  1
#define key_state_2  2
char read_key(void)   //按键扫描
{
         static char key_state = 0;
         uchar key_press, key_return = 0;
         
         key_press = key_input;     // 读按键 I/O 电平
         switch (key_state)
        {
                  case key_state_0:     // 按键初始态
           if (!key_press) key_state = key_state_1;  // 键被按下,状态转换到键确认态
   break;
                  case key_state_1:     // 按键确认态
           if (!key_press)
                {
                    key_return = 1;    // 按键仍按下,按键确认输出为"1" (1)
                    key_state = key_state_2;  // 状态转换到键释放态
                }
                else
            key_state = key_state_0;  // 按键已抬起,转换到按键初始态
   break;
                  case key_state_2:
            if (key_press) key_state = key_state_0;  //按键已释放,转换到按键初始态
   break;
        }
return key_return;
}
//将一个短整型数,个,十,百,千位分别填入一个4位数组,用于数码管显示
void deal_value(unsigned short input   )//数据处理函数
{
          if(input<10)     //如果输入值为0-9      
         {
            ge=input;
         }   
         else if((input>=10)&&(input<100))    //如果输入值为10-99
        {
            shi=input/10;
            ge=input%10;
    }
        else if((input>=100)&&(input<1000))    //如果输入值为100-999
        {
                   bai=input/100;       //百位值
            input=input%100;   
                 shi=input/10;        //十位值
                 ge=input%10;         //个位值
         }
        else if((input>=1000)&&(input<10000))   //如果输入值为1000-9999
        {
            qian=input/1000;            //千位值
            input=input%1000;           
                 bai=input/100;              //百位值
                 input=input%100;
                 shi=input/10;               //十位值
                ge=input%10;                //个位值
        }
        else     //如果输入值大于9999 ,显示"FFFF" ,表示显示超范围
        {
            qian=0;            //千位值
                    bai=0;              //百位值
                   shi=0;               //十位值
                 ge=0;
        }   
}
void Out_4094(uchar data1) //写CD4094子函数;
{
   uchar i;       //定义子函数;
   for(i=0;i<8;i++)     //写八位数据进CD4094;
          {
           if(data1&0x01)     //判断并发串行数据;
            {
           DATA=1;      //发高电平;
                 }
                         else
                         {
                   DATA=0;      //发低电平;
                         }
    CLK=0;       //形成上升延脉冲;
           _nop_();
         _nop_();      //延时;
          _nop_();
          CLK=1;
    data1>>=1;      //数据移位,送下一位数据;
   }
}

void delay(uint ms)
{
        uint a,b;                  //约1ms
        for(a= ms;a<100;a++);
        for(b=0;b<100;b++);
}

void main()
{        
    unsigned short kk=0;    //声明一个短整型变量,作为数码管显示的数
      while(1)
      {
                   if(!key_input)  //每10ms调用按键
                 {        
                         delay(10);
                        read_key();
                    }
                        if(read_key())   //确认键按下
            kk++;            
            if(kk==30)
                    kk=0;
                                
                         deal_value(kk);    //将kk值分解为个位,十位,百位,千位,装入缓冲区
             STR = 0;       //保持然来的状态不变;
                     data1 = DSY_CODE [ ge ];
                     Out_4094(data1);
               
                      data1 = DSY_CODE [ shi ];
                      Out_4094(data1);
               
                      data1 = DSY_CODE [ bai ];
                      Out_4094(data1);
               
                      STR = 1;          //数据送完;更新显示;
                          
      }
}

联调图


联调图。



你把if(kk==30)
                    kk=0; 这个改为if(kk>=30)
                    kk=0; 看一下什么现象

mark以下。回头来看

谢谢你的解答,我改了但结果还是一样。我用P口显示数值时是正常的,可以为0.是否数码管显示有问题,但+1数码管显示是正常的,百思不得其解,麻烦各位高手赐教。

如果哪位师傅有4094驱动三位数码管的程序,麻烦上传,谢谢

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

网站地图

Top