状态机实现LED按键操作

发布时间 2023-08-07 21:28:34作者: 颖风船

一、按键状态机

// 定义按键状态
typedef enum
{
    IDLE,         // 空闲状态
    PRESS_ONCE,   // 按键按下状态
    PRESS_LONG    // 按键释放状态
} ButtonState;

 

二、定义LED状态

// 定义LED状态
typedef enum
{
    Filck_500ms,    // 500ms
    Filck_1s,          // 1s
    Filck_2s,             // 2s
    Led_On,                  // LED点亮
    Led_OFF,                // LED熄灭
    LED_IDLE                // LED空闲
} LED_STATE;

 

三、中断处理模块

void SysTick_Handler(void)
{
    delay++;
    
    if (++delay_500ms > 500)
    {
        delay_500ms = 0;
        switch(Led_State_500ms)                // LED_500ms状态
        {
            case Led_On:
                GPIO_SetBits(Port_Led_2, Pin_Led_2);          // 点亮LED
            break;
            case Led_OFF:
                Port_Led_2->ODR ^= Pin_Led_2;                            // 熄灭LED
            break;
            default:
            break;
        }
    }
}

 

四、主程序模块

while (1)
{
    if (delay > 40)
    {
        switch (Key_State)
        {
        case IDLE:
            if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)
            {
                Key_State = PRESS_ONCE;
            }
            else
            {
                Key_State = IDLE;
            }
            break;

        case PRESS_ONCE:
            if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)
            {
                Key_State = PRESS_LONG;
            }
            else
            {
                Key_State = IDLE;
            }
            break;

        case PRESS_LONG:
            if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)
            {
                Key_State = PRESS_LONG;
            }
            else
            {
                Key_State = IDLE;
            }
            break;
        }
        
        if(Key_State == PRESS_LONG)
        {
            Led_State_500ms = Led_On;
            GPIO_SetBits(Port_Led_1, Pin_Led_1);
        }
        else
        {
            Led_State_500ms = Led_OFF;
            GPIO_ResetBits(Port_Led_1, Pin_Led_1);
        }
    }
}