如何通过微处理器/微控制器同时检测两个或多个按键(GPIO)?

正如问题所述,我想知道控制器是否可以同时检测到两个按钮按下。

我是控制器编程的新手,从基础开始 – 闪烁LED,然后移动到按钮,现在尝试按下按钮。 当两个按钮被按在一起时,我想设置一些标志

但据我所知,在这种情况下只会调用一个ISR,从而检测到一次按下。 我们怎样才能做到这一点……

(在某些电子设备中,当我们按下某些按钮时它具有特定的function,例如当同时按下3个适当的按钮时重置电话)

梅西

单个ISR触发不足以检测单个按钮按下。 由于您从所有按钮获得的机电信号反弹,您需要某种去抖动算法。

此外,您需要程序不受EMI影响,以便在有大量来自按钮的脉冲时,多个中断不会在堆栈上造成严重破坏。

例如:

  1. 如果按钮连接到提供不同中断的不同端口,则每个按钮创建一个中断。 如果它们连接到同一端口,它们通常可以触发相同的中断(取决于MCU)。

  2. 每当您从按钮获得任何信号边沿(上升或下降) 的中断时 ,在ISR中禁用中断并启动通常为5-10ms的硬件定时器,具体取决于按钮。 定时器应该优选地触发定时器中断。

    必须禁用中断,以滤除由弹跳和潜在的EMI故障引起的虚假中断。

    去抖动需要计时器。 如果在按钮数据表中找不到确切的信号反弹时间(通常不会),则只需使用示波器进行测量即可。

  3. 计时器结束后,读取端口并将结果存储在变量中。 再次启用按钮中断。

  4. 该变量需要在文件范围内声明为static volatile 。 静态用于私有封装,这是良好程序设计所必需的。 易失性,以防止常见的编译器优化器错误,编译器没有意识到变量已被ISR修改。

  5. 为第一个按钮实现相同的function。 您将有两个不同的变量来告诉按钮的当前状态。 只需将这两个变量相互比较,即可判断是否同时按下了两个按钮。