gpt4 book ai didi

c - 如何通过微处理器/微 Controller 同时检测两个或多个按钮按下(GPIO)?

转载 作者:太空狗 更新时间:2023-10-29 15:26:38 26 4
gpt4 key购买 nike

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

我是 Controller 编程的新手,从基础开始 - 闪烁 LED,然后转移到按钮,现在尝试玩弄按钮按下。我想在同时按下两个按钮时设置一些标志

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

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

问候,梅西

最佳答案

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

此外,您需要程序不受 EMI 影响,这样只要按钮发出大量脉冲,多个中断就不会对堆栈造成破坏。

例如:

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

  2. 每当您因按钮的任何信号边沿(上升或下降)而获得中断时,然后在 ISR 中禁用中断并启动通常为 5-10 毫秒的硬件计时器取决于按钮。定时器最好触发一个定时器中断。

    禁用中断对于过滤掉由弹跳和潜在的 EMI 毛刺引起的虚假中断是必要的。

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

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

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

  5. 对第一个按钮执行相同的操作。您将有两个不同的变量告诉按钮的当前状态。只需将这两个变量相互比较即可判断两个按钮是否同时按下。

关于c - 如何通过微处理器/微 Controller 同时检测两个或多个按钮按下(GPIO)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23557921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com