This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSPM0G1505:按钮去抖

Guru**** 2392095 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1355710/mspm0g1505-button-debounce

器件型号:MSPM0G1505
我有3个按钮。 要根据按下的按钮增加按钮计数。 所有三个 MCU 引脚都在内部上拉、并且在下降沿启用中断、因此当按下按钮时、会连接接地、并调用中断。 问题是我无法正确滤除多次按压、例如去抖。 有人能建议我应该在代码中添加什么内容吗? 是否有任何 TI 内置函数可以帮助解决此问题?
void Group1_IRQHandler (void)
{
  开关(DL_Interrupt_getPendingGroup (DL_interrupt_Group_1))
  {
    案例 BUTTON_INT_IIDX:
      
              如果(DL_GPIO_readPins (button_port、button_BT1_PIN)
              {
                BT1_COUNT++;
               
              }
              
              
              如果(DL_GPIO_readPins (button_port、button_bt2_PIN))
              {
                 BT2计数++;
              
               }
              
               
               如果(DL_GPIO_readPins (button_port、button_bt3_PIN))
              {
                bt3_count++;
              
               }
               中断;
  }
              
             
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您需要在检测到按钮按压操作后设置延迟。

    我发现处理主代码中的按钮比处理中断更容易。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    还是与连续轮询一样? 我添加了延迟、但是我还要运行一个4位7段显示屏并读取模拟信号、它会在延迟功能运行时停止、它的可见度足以引起问题吗? 这有什么解决方案吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、SURESHAN、

    Keith 是正确的。 一种简单的方法是、你可以在"if (...){;}"中添加一个延迟、然后再次检查输入、如果它仍然具有相同的值、那么它就是一个有效的输入。

    不过、这是很常见的按钮检测要求、可以在互联网上搜索、应该有一些可行的解决方案可以参考。

    B.R.

    萨尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您需要使用计时器来设置非阻塞延迟。 我使用 SysTick 设置 Arduino 类似的"Millis"函数。 然后、当我看到按钮按压操作时、我会存储按压操作的起始时间。 在一段时间过去后(我的樱桃按钮15毫秒左右),我然后注册按钮按压。

    在 pseduocode 中类似于以下内容:

    if (按下按钮1)

    那么

    if (button1start == 0)

    那么

    button1start = Millis ();如果 button1start =0、则 button1start = 1;//如果 Millis 恰好为0!

    否则

    if (Millis()- button1start > 15)

    然后注册按键

    字节序

    字节序