dreamed_star 2023-11-08 17:51 采纳率: 33.3%
浏览 135
已结题

51单片机按键按一下加1功能

这串代码实现按1加1功能,为什么快速按按键是可以实现加1,慢点按它就会跳呢?


#include<reg52.h>

unsigned char code Tab[]=     //共阴数码管段码表0-F
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

sbit key =P3^1; 
void Delay1ms(unsigned int xms)  //延时1ms函数
{
   unsigned char i,j;
   while(xms)
   {
     i = 2 ;
     j = 239 ;
     do
     {
        while (--j);
      }
     while (--i);
     xms--;
   }
}

void main ()    //主函数
{
        unsigned char n    = 0 ;   //局部变量计位数n是段码表的位置
        P0= 0x3f;    //定义初始值显示0
        while(1)
        {

            if(key == 0)        //判断按键是否按下
            {
                Delay1ms(10);    //消抖
                
                if(key==0)   //再次判断
                {
                    P0=Tab[n];  //把第n个段码赋值给P0口
                    Delay1ms(50);  //延时50ms
                    
                    while(key==1) //判断按键是否松开
                    {
                        Delay1ms(100);
                        n++;
                    }
                }
                
                if(n>=16)  //控制加的位数别超出段码表了
                {
                    n = 0 ;   //如果超出就让他回0去
                }
                
            }
                        
         }
}

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-08 20:39
    关注

    【以下回答由 GPT 生成】

    这个问题的原因是按键会产生抖动现象,即当按键按下和松开时,会出现多次开关状态的切换。由于程序中只判断按键是否按下,而没有判断按键松开的状态,因此在按下按键的短时间内会反复执行加1的操作,导致显示出现跳数的情况。

    解决这个问题的方法是在按键按下后添加一个延时,来进行消除按键抖动,然后再进行判断按键是否松开的操作。

    以下是修改后的代码:

    #include <reg52.h>
    
    unsigned char code Tab[];     //共阴数码管段码表0-F
    
    sbit key = P3^1; 
    void Delay1ms(unsigned int xms)  //延时1ms函数
    {
       unsigned char i,j;
       while(xms)
       {
         i = 2 ;
         j = 239 ;
         do
         {
            while (--j);
          }
         while (--i);
         xms--;
       }
    }
    
    void main()    //主函数
    {
            unsigned char n = 0;   //局部变量计位数n是段码表的位置
            P0= 0x3f;    //定义初始值显示0
            while(1)
            {
    
                if(key == 0)        //判断按键是否按下
                {
                    Delay1ms(10);    //消抖
    
                    if(key == 0)   //再次判断
                    {
                        P0=Tab[n];  //把第n个段码赋值给P0口
                        Delay1ms(50);  //延时50ms
    
                        while(key == 1) //判断按键是否松开
                        {
                            Delay1ms(100); // 延时等待按键松开
                            if(key == 0)   // 再次判断按键是否按下
                            {
                                break;     // 如果按键再次按下,则退出按键松开的判断操作
                            }
                            n++;
                        }
                    }
    
                    if(n >= 16)  //控制加的位数别超出段码表了
                    {
                        n = 0;   //如果超出就让他回0去
                    }
    
                }
    
    
            }
    }
    

    在原有代码的基础上,添加了一个if语句来判断是否再次按下按键,如果再次按下,则跳出按键松开的判断操作,从而避免了快速按键时的跳数问题。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月19日
  • 已采纳回答 11月11日
  • 创建了问题 11月8日

悬赏问题

  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了
  • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
  • ¥15 C++ 句柄后台鼠标拖动如何实现
  • ¥15 有人会SIRIUS 5.8.0这个软件吗