#include "bsp_key.h" typedef enum { bsp_key_value_none = 0, bsp_key_value_up = 0x01, bsp_key_value_ok = 0x02, bsp_key_value_down = 0x04, } bsp_key_value_e; struct { volatile bsp_key_value_e pressed_key; volatile bsp_key_value_e last_key; volatile uint8_t long_press_cnt; volatile uint8_t long_pressed; volatile bsp_key_event_e key_event; } bsp_key_status = { .pressed_key = bsp_key_value_none, .last_key = bsp_key_value_none, .long_press_cnt = 0, .long_pressed = 0, .key_event = bsp_key_none }; void bsp_key_init(void) { HAL_TIM_Base_Start_IT(&TIM_KEY_SCAN); } bsp_key_value_e bsp_key_scan(void) { if (HAL_GPIO_ReadPin(KEY_UP_GPIO_Port, KEY_UP_Pin) == GPIO_PIN_RESET) { return bsp_key_value_up; } else if (HAL_GPIO_ReadPin(KEY_OK_GPIO_Port, KEY_OK_Pin) == GPIO_PIN_RESET) { return bsp_key_value_ok; } else if (HAL_GPIO_ReadPin(KEY_DOWN_GPIO_Port, KEY_DOWN_Pin) == GPIO_PIN_RESET) { return bsp_key_value_down; } else { return bsp_key_value_none; } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim == &TIM_KEY_SCAN) { bsp_key_status.pressed_key = bsp_key_scan(); //记录按键值 if(bsp_key_status.pressed_key == bsp_key_value_none && !bsp_key_status.last_key) { //按键完全抬起之后 bsp_key_status.long_pressed = 0; } if(bsp_key_status.pressed_key) { //如果按键按下了 if(!bsp_key_status.long_pressed) { //当前还未触发长按事件 bsp_key_status.long_press_cnt ++; if(bsp_key_status.long_press_cnt >= 50) { bsp_key_status.key_event = (bsp_key_event_e)(bsp_key_status.pressed_key << 4); //长按按键事件 bsp_key_status.long_pressed = 1; } } } else { bsp_key_status.long_press_cnt = 0; } if(bsp_key_status.last_key != bsp_key_value_none && //按键抬起边沿 并且没有触发过长按事件 (bsp_key_status.pressed_key == bsp_key_value_none) && !bsp_key_status.long_pressed) { bsp_key_status.key_event = (bsp_key_event_e)bsp_key_status.last_key; //短按按键事件 } bsp_key_status.last_key = bsp_key_status.pressed_key;//按下时不记录按键状态 } } bsp_key_event_e bsp_key_get_event(void) { bsp_key_event_e event_ret = bsp_key_none; if (bsp_key_status.key_event != bsp_key_none) { event_ret = bsp_key_status.key_event; bsp_key_status.key_event = bsp_key_none; } return event_ret; }