单片机矩阵键盘抖动问题

刚学习stc89c52,做到矩阵键盘那里,检测按键是否按下时没有写消除抖动的代码,结果烧录进去运行以后,按8号键,显示屏上有时显示是8,有时显示是4。所以我想问一下单片机矩阵键盘一个键的抖动会导致其他键的抖动吗

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7717872
  • 你也可以参考下这篇文章:STC89C52_51单片机_例程1_简易加法计算器_计算器_诗一首《追》
  • 除此之外, 这篇博客: STC89C52定时器的简介中的 先来分析一下,他为什么叫做定时器? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    本质上来说:他就是存储数据的寄存器,每过一个机器周期,存储的数据值加1。因此你想要定时具体的时间,有两个控制因素:一个是机器周期的大小,一个是你设置寄存器的初始值。那么什么是机器周期?

    因为周期时频率的倒数,所以下面的内容我都以频率来讲解。

  • 以下回答来自chatgpt:

    问题回答:

    对于单片机矩阵键盘中按键的抖动现象,可能会影响其他键的正常操作。当一个键存在抖动现象时,可能会导致矩阵键盘检测到多个按键同时按下的情况,从而导致其他键的信号被误触发。

    为解决这个问题,可以采取以下步骤:

    1. 在单片机中添加消抖算法。消抖算法的主要思路是,检测到按键按下后,延时一段时间,然后再次检测按键状态。如果延时后再次检测到按键依然是按下状态,才判定为有效按键。这样可以过滤掉短时间内的抖动信号。

    下面是一个简单的消抖算法的示例代码:

    #define DEBOUNCE_TIME 10 // 设置延时时间为10ms
    
    int debouncedRead(int pin) {
      int currentState = digitalRead(pin); // 读取当前按键状态
      delay(DEBOUNCE_TIME);
      int nextState = digitalRead(pin); // 再次读取按键状态,判断是否仍然按下
      if (currentState == nextState) {
        return nextState; // 返回最终的按键状态
      }
      return LOW; // 返回无效按键
    }
    
    1. 在键盘矩阵电路中添加滤波电容。滤波电容可以通过连接到按键的并联电容的方式,对按键的抖动信号进行滤波,使得检测到的信号更为稳定。

    下面是一个简单的连接示意图:

                        --+-- 1K 拉电阻 -- MCU端口
                           |
                           /
                           \  按钮
                           /
                           \
                           |
                          --+-- 安装在按键上的滤波电容
    
    1. 优化按键的硬件布局。合理的安排键盘矩阵的布局,可以减少按键之间的电磁干扰,并降低抖动现象的发生率。例如,可以将按键之间的距离加大,采取平衡布线等措施。

    请注意,以上提到的解决方案都只能部分减少按键的抖动现象,但无法完全消除。因此,在设计和使用单片机矩阵键盘时,要合理选择适合的按键和兼容的软件算法,以提高按键的可靠性和稳定性。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^