[STM32F1] [STM32F103C8T6] 使用函数 判断 按钮 是否点击 出错

[复制链接]
437|2
假发 发表于 2025-8-29 00:12 | 显示全部楼层 |阅读模式
大家好,我是个 嵌入式开发小白  
我的 面包板 上 有 3个设备,LED Blue, LED Red 和 Button 按钮  
初始时我设置了 红灯亮,蓝灯灭,按下按钮刚好反过来

这是正常运行的代码

```c

HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET); // turn on
HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_SET); // turn off
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1) {


    GPIO_PinState state = HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin);

    if (state == GPIO_PIN_RESET) {
      HAL_Delay(10);

      if (HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin) == GPIO_PIN_RESET) {

        // break loop when release the
        while (HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin) == GPIO_PIN_RESET) {}

        HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
        HAL_GPIO_TogglePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin);
      }

    }


}
```

我想着 封装一个函数 用来判断 按钮是否被 按下 并 **释放**

```c

bool is_button_clicked(GPIO_TypeDef * button_port, uint16_t button_pin, GPIO_PinState valid_state) {
  GPIO_PinState state = HAL_GPIO_ReadPin(button_port, button_pin);
  
  if (state == valid_state) {
    HAL_Delay(10);
    while (HAL_GPIO_ReadPin(button_port, button_pin) == valid_state);
    return true;
  } else {
    return false;
  }
}


```

修改主循环的代码如下

```c

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

    // this won't work fine

    bool is_clicked = is_button_clicked(BUTTON_GPIO_Port, BUTTON_Pin, GPIO_PIN_RESET);
    if (is_clicked) {
      HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
      HAL_GPIO_TogglePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin);
    }

}
```

结果发现,按下按钮后,有概率 不工作,另一个灯只是闪一下,其他啥事没有,切换不过去

不知道代码出了什么问题,求大佬教我,🙏

yueguang3048 发表于 2025-8-29 13:09 | 显示全部楼层
1.没按键消抖(软件)
2.没检测按键释放


dffzh 发表于 2025-8-29 15:06 | 显示全部楼层
把这个函数改成下面试试:
  1. bool is_button_clicked(GPIO_TypeDef * button_port, uint16_t button_pin, GPIO_PinState valid_state)
  2. {
  3.   GPIO_PinState state = HAL_GPIO_ReadPin(button_port, button_pin);
  4.   
  5.   if (state == valid_state)
  6.   {
  7.     HAL_Delay(10);
  8.         if (HAL_GPIO_ReadPin(button_port, button_pin) == valid_state)
  9.         {
  10.       while(HAL_GPIO_ReadPin(button_port, button_pin) == valid_state);
  11.       return true;
  12.         }
  13.         else
  14.         {
  15.           return false;
  16.         }
  17.   }
  18.   else
  19.   {
  20.     return false;
  21.   }
  22. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部