我对嵌入式不太熟悉,我想在按下 STM32f407-disc1 上的蓝色按钮时切换 LCD 背光 (16x2),但是当我按下它片刻时,它会关闭然后再次返回。我是否错过了一些延迟,或者我需要以其他方式进行吗?
void btn_Task(void *pvParameters)
{
uint8_t lcd_on = 1;
while(1){
if(HAL_GPIO_ReadPin(GPIOA, BTN_PIN) && lcd_on)
{
HD44780_NoBacklight();
lcd_on = 0;
}
else
{
HD44780_Backlight();
lcd_on = 1;
}
vTaskDelay(pdMS_TO_TICKS(50));
}
}
期望的结果应该是 -
逻辑是否有问题,或者缺少一些延迟以确保用户在处理逻辑时已释放按钮。
要实现切换效果,您的任务需要检测按钮状态的变化。为此,它需要记住上一个循环期间按钮的状态。
我假设按下按钮时引脚处于低电平。否则,调整分配。
考虑到按钮弹跳,任务将每个循环延迟 50 毫秒。不需要“复杂的”去抖动逻辑,因为这样的采样率足够低,可以“跳过”大多数按钮的抖动,同时对于用户来说足够快。
void btn_Task(void *pvParameters)
{
bool is_lcd_on = false;
bool was_button_pressed = false;
for (;;) {
bool is_button_pressed = !HAL_GPIO_ReadPin(GPIOA, BTN_PIN);
if (is_button_pressed && !was_button_pressed) {
is_lcd_on = !is_lcd_on;
if (is_lcd_on) {
HD44780_Backlight();
} else {
HD44780_NoBacklight();
}
}
was_button_pressed = is_button_pressed;
vTaskDelay(pdMS_TO_TICKS(50));
}
}