在 STM32f407-disc1 上按下用户按钮时如何切换 LCD 背光

问题描述 投票:0回答:1

我对嵌入式不太熟悉,我想在按下 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));
    }
}

期望的结果应该是 -

  1. 按住按钮时不应打开和关闭背光,并将其记录为单击直到松开。
  2. 一旦按下开关,如果不再次切换,背光应该无限地改变其状态。

逻辑是否有问题,或者缺少一些延迟以确保用户在处理逻辑时已释放按钮。

button embedded stm32
1个回答
0
投票

要实现切换效果,您的任务需要检测按钮状态的变化。为此,它需要记住上一个循环期间按钮的状态。

我假设按下按钮时引脚处于低电平。否则,调整分配。

考虑到按钮弹跳,任务将每个循环延迟 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));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.