stm32-code/stm32f0_clock/Bsp/Src/bsp_key.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;
}