状态机实现LED按键操作
一、按键状态机
// 定义按键状态 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); } } }