星痕飘渺 2024-08-21 17:01 采纳率: 0%
浏览 7

关于按键检测里奇怪的问题!(关键词-get)

我想要检测两个按键哪个按下时,发现一个奇怪的问题,
我两次调用KEY_getkeynum()函数,就只有按键1能够检测,按键2无反应,代码如下

void key_tesk()
{
  while (1)
  {
    if (KEY_getkeynum() == 1)
    {
      printf("press: 1\n");
    }
    if (KEY_getkeynum() == 2)
    {
      printf("press: 2\n");
    }
    vTaskDelay(30 / portTICK_PERIOD_MS);
  }
}

调用一次KEY_getkeynum()函数,两个按键都能够正确检测,

void key_tesk()
{ 
  uint8_t keynum=0;
  while (1)
  {
    keynum=KEY_getkeynum();
    if (keynum == 1)
    {
      printf("press: 1\n");
    }
    if (keynum == 2)
    {
      printf("press: 2\n");
    }
    vTaskDelay(30 / portTICK_PERIOD_MS);
  }
}


KEY_getkeynum()函数如下:


```c
uint8_t KEY_getkeynum()
{
    uint8_t keynum = 0;
    if (gpio_get_level(KEY_one_pin) == 0)
    {
        vTaskDelay(10 / portTICK_PERIOD_MS);
        if (gpio_get_level(KEY_one_pin) == 0)
        {
            while (gpio_get_level(KEY_one_pin) == 0);
            keynum = 1;
            return keynum;
        }
    }
    else if (gpio_get_level(KEY_two_pin) == 0)
    {
        vTaskDelay(10 / portTICK_PERIOD_MS);
        if (gpio_get_level(KEY_two_pin) == 0)
        {
            while (gpio_get_level(KEY_two_pin) == 0);
            keynum = 2;
            return keynum;
        }
    }
    return keynum;
}

```

  • 写回答

1条回答 默认 最新

  • 吃不了席 2024-08-21 17:06
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    这个问题可能是由于按键抖动引起的。当你连续调用KEY_getkeynum()函数时,按键检测可能会受到干扰,导致按键2无法正确检测。而当你只调用一次KEY_getkeynum()函数并将结果存储在变量中时,按键检测不受干扰,因此两个按键都能正确检测。

    为了解决这个问题,你可以在KEY_getkeynum()函数中使用去抖算法来消除按键抖动。以下是一个简单的去抖算法示例:

    #define DEBOUNCE_TIME 50 // 去抖时间,单位为毫秒
    
    uint8_t KEY_getkeynum()
    {
        uint8_t keynum = 0;
        static uint32_t last_debounce_time[2] = {0, 0};
    
        if (gpio_get_level(KEY_one_pin) == 0)
        {
            if ((HAL_GetTick() - last_debounce_time[0]) > DEBOUNCE_TIME)
            {
                last_debounce_time[0] = HAL_GetTick();
                vTaskDelay(10 / portTICK_PERIOD_MS);
                if (gpio_get_level(KEY_one_pin) == 0)
                {
                    while (gpio_get_level(KEY_one_pin) == 0);
                    keynum = 1;
                    return keynum;
                }
            }
        }
        else if (gpio_get_level(KEY_two_pin) == 0)
        {
            if ((HAL_GetTick() - last_debounce_time[1]) > DEBOUNCE_TIME)
            {
                last_debounce_time[1] = HAL_GetTick();
                vTaskDelay(10 / portTICK_PERIOD_MS);
                if (gpio_get_level(KEY_two_pin) == 0)
                {
                    while (gpio_get_level(KEY_two_pin) == 0);
                    keynum = 2;
                    return keynum;
                }
            }
        }
        return keynum;
    }
    

    这个示例中,我们使用了一个静态数组last_debounce_time来记录上一次按键检测的时间。在每次检测按键时,我们检查当前时间与上次检测时间的差值是否大于去抖时间(例如50毫秒)。如果大于去抖时间,说明按键已经稳定下来,可以进行按键检测。这样可以避免因按键抖动导致的误判。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月21日