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

时间:2014-05-09 06:25:23

标签: c embedded microcontroller gpio microprocessors

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

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

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

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

的问候, 梅西

1 个答案:

答案 0 :(得分:5)

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

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

例如:

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

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

    禁用中断对于滤除由弹跳和潜在EMI故障引起的虚假中断是必要的。

    计时器是去抖动所必需的。如果您无法在按钮数据表中找到确切的信号反弹时间(您通常不会这样做),那么只需使用示波器进行测量即可。

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

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

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