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

Mes*_*i L 4 c embedded microcontroller microprocessors gpio

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

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

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

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

梅西

Lun*_*din 6

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

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

例如:

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

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

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

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

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

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

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