找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1623|回复: 5
打印 上一主题 下一主题
收起左侧

MCU检测按键,实现数码管数字加一函数,我多加了一个减一就不行了

[复制链接]
跳转到指定楼层
楼主
ID:883891 发表于 2021-2-10 18:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个是用定时器实现动态数码管显示,如果有按键按下,数码管数字加一。现在我在readkey()函数多加了一个if语句,如果另一个按键按下会数字减一。但是,放进去后,只能加一次1,或者减一次1了。

下面是整个程序,请大家指点!感激不尽!
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. sbit key = P3^2;  //P3为按键接口
  4. sbit key1 = P3^3;  //P3为按键接口

  5. int display_case=0;
  6. unsigned char n=0,n1=0;
  7.         float digital=12.26;  //定义数字为12.26
  8.         int a,b,c,d,e,f,g;

  9.   unsigned char table[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X7F};//共阳数码管显示
  10.         unsigned char table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯0-7
  11.          
  12. void readkey(void)   //按键按下判断函数

  13. {
  14.                 void Delay100ms(int t);
  15.         
  16.     if(key==1)  
  17.                         {
  18.       Delay100ms(2);  //消抖0.2秒
  19.       if(key==1)  
  20.        while(key);  //等待按键释放
  21.                         digital--;      //数字+1
  22.                  }               

  23.     if(key1==1)  
  24.                         {
  25.       Delay100ms(2);  //消抖0.2秒
  26.       if(key1==1)  
  27.        while(key1);  //等待按键释放
  28.                         digital++;       //数字-1
  29.             }                                          
  30. }




  31. void yima()   //获得数字各个位数
  32. {
  33. a=digital*100;
  34. b=a/1000;     //千位
  35. c=a-b*1000;   //获得,百、十、个位
  36. d=c/100;      //取出百位
  37. e=c-d*100;    //获得,十、个位
  38. f=e/10;       //取出十位
  39. g=e-f*10;     //取出个位
  40. }




  41. void display()    //数码管显示函数
  42. {
  43.         yima();         //获得数字各个位数
  44.         
  45.         
  46.         display_case++;  //轮流显示四位数字
  47. if(display_case>4)
  48.         display_case=0;


  49.         switch (display_case)//轮流显示四位数字
  50.                 {
  51.                 case (0):
  52.   P2=0xfe;        //显示千位
  53.         P0=table[b];
  54.                         break;

  55.                 case(1):
  56.         P2=0xfd;        //显示百位
  57.         P0=table[d];
  58.       break;
  59.                         
  60.                 case(2):
  61.         P2=0xfd;        //显示小数点
  62.         P0=table[10];
  63.       break;
  64.                         
  65.                 case(3):
  66.         P2=0xfb;        //显示十位
  67.         P0=table[f];
  68.       break;
  69.         
  70.                 case(4):
  71.         P2=0xf7;        //显示个位
  72.         P0=table[g];
  73.       break;
  74. }
  75.                 }


  76. void timer_init()
  77.         {
  78.     TMOD |= 0x01;  //定时器工作方式1,启用T0定时器, GATE位为0,用TCON的TR0控制T0定时器的启动

  79.     //设置定时器的初始计数值
  80.     //计算方法
  81.     //假设定时器为1ms,一个机器周期为 1/单片机的晶振频率  即: 1/12M = 1us
  82.     //而1个机器周期 = 12个时钟周期 所以: n x 机器周期 = 1ms ===> n x 1us = 1ms
  83.     //所以n = 1000,也就是经过1000个机器周期,定时器要溢出(从0开始计数)
  84.     //所以定时器的初始值为65535 - 1000 + 1 = 64536 ===> 0xFC18
  85.     TH0 = 0xFC;
  86.     TL0 = 0x18;

  87.     EA = 1;  //总中断开关
  88.     ET0 = 1; //T0中断

  89.     TR0 = 1;//启动T0定时器
  90. }


  91. void trigger_timer0() interrupt 1
  92.         {
  93.     TH0 = 0xFC;
  94.     TL0 = 0x18;
  95. //if(ii>10)
  96. //{   ii=0;
  97.                 display();  //动态显示数字
  98. }               
  99. //}


  100. void main (void)
  101. {
  102. timer_init();// 定时器初始化
  103.         while(1)
  104.         {  
  105.                 readkey();  //按键按下判断函数
  106.         
  107.         }
  108. }
复制代码


数码管显示.zip

1.38 KB, 下载次数: 2

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883891 发表于 2021-2-10 18:47 | 只看该作者
补充:
1.我用的是c51
2.readkey()函数如果只是下面这样是没有问题的
void readkey(void)   //按键按下判断函数

{
                void Delay100ms(int t);
      
    if(key==1)  
                        {
      Delay100ms(2);  //消抖0.2秒
      if(key==1)  
       while(key);  //等待按键释放
                        digital--;      //数字+1
                 }        

   

但是再加一个if语句判断另一个按键就有问题了就有问题了
回复

使用道具 举报

板凳
ID:213173 发表于 2021-2-11 07:47 | 只看该作者
大Q熊 发表于 2021-2-10 18:47
补充:
1.我用的是c51
2.readkey()函数如果只是下面这样是没有问题的

楼主的程序问题不少,改这样试试。
#include <reg51.h>
#include <intrins.h>
sbit key = P3^2;  //P3为按键接口
sbit key1 = P3^3;  //P3为按键接口

unsigned char display_case=0;
//unsigned char n=0,n1=0;
unsigned int digital=1226;  //定义数字为12.26
//unsigned char  a,b,c,d,e,f,g;

unsigned char table[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X7F};//共阳数码管显示
unsigned char table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯0-7

void Delay1ms(unsigned int t)
{
        unsigned int i,j;
        for(i=t;i>0;i--)
                        for(j=125;j>0;j--);
}

void readkey(void)   //按键按下判断函数
{
        if(key==0) //低电平有效
        {
                Delay1ms(20);  //消抖0.02秒
                if(key==0)  
                {
                        digital++;      //数字+1
                        while(!key);  //等待按键释放
                }
        }               
        if(key1==0) //低电平有效   
        {
                Delay1ms(20);  //消抖0.02秒
                if(key1==0)  
                {
                        digital--;       //数字-1
                        while(!key1);  //等待按键释放
                }
        }                                          
}
/*
void yima()   //获得数字各个位数
{
a=digital*100;
b=a/1000;     //千位
c=a-b*1000;   //获得,百、十、个位
d=c/100;      //取出百位
e=c-d*100;    //获得,十、个位
f=e/10;       //取出十位
g=e-f*10;     //取出个位
}*/

void display()    //数码管显示函数
{
//        yima();         //获得数字各个位数
        display_case++;  //轮流显示四位数字
        if(display_case>4)
                display_case=0;
        P0=0xff;//消隐
        switch (display_case)//轮流显示四位数字
        {
                case(0):P2=0xfe;P0=table[digital/1000%10];break;//显示千位
                case(1):P2=0xfd;P0=table[digital/100%10]&0x7f;break;//显示百位+小数点
                case(2):P2=0xfb;P0=table[digital/10%10];break;//显示十位
                case(3):P2=0xf7;P0=table[digital%10];break;//显示个位
        }
}

void timer_init()
{
        TMOD |= 0x01;
        TH0 = 0xFC;
        TL0 = 0x18;
        EA = 1;  //总中断开关
        ET0 = 1; //T0中断
        TR0 = 1;//启动T0定时器
}

void trigger_timer0() interrupt 1
{
        TH0 = 0xFC;
        TL0 = 0x18;
        display();  //动态显示数字
}

void main (void)
{
        timer_init();// 定时器初始化
        while(1)
        {  
                readkey();  //按键按下判断函数
        }
}

回复

使用道具 举报

地板
ID:373388 发表于 2021-2-11 12:33 | 只看该作者
1 ,float 数据类型最高位是符号位,  0 -1 就等于 -1 了, 你的译码函数没有判断符号位;显示会有问题
2, 检查硬件电路,按下去和抬起按键电平是否正确
回复

使用道具 举报

5#
ID:883891 发表于 2021-2-11 15:21 | 只看该作者
wulin 发表于 2021-2-11 07:47
楼主的程序问题不少,改这样试试。
#include
#include

可以啦,太感谢了!!!!
回复

使用道具 举报

6#
ID:883891 发表于 2021-2-11 15:22 | 只看该作者
xhaity 发表于 2021-2-11 12:33
1 ,float 数据类型最高位是符号位,  0 -1 就等于 -1 了, 你的译码函数没有判断符号位;显示会有问题
2 ...

没有,我在正数区间就出现问题了,还没有到0以下,硬件是没有问题的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表