83 lines
2.5 KiB
C
83 lines
2.5 KiB
C
#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;
|
|
}
|