Files
E32_433_dev/Core/Src/key.c
2026-04-10 20:26:51 +08:00

123 lines
2.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "main.h"
#define KEY_SHORT_PRESS_TIME_MS 100
typedef struct
{
uint32_t count ;
bool continue_enable;
bool is_press;
bool is_continue;
}key_config_t;
static key_config_t key_group[3] =
{
[ KEY_NAME_UP ] = {
.count = 0,
.is_press = 0,
.continue_enable = false,
.is_continue = false,
},
[ KEY_NAME_DOWN ] = {
.count = 0,
.is_press = 0,
.continue_enable = false,
.is_continue = false,
},
[ KEY_NAME_ENTER ] = {
.count = 0,
.is_press = 0,
.continue_enable = false,
.is_continue = false,
}
};
bool key_check_press( key_name_t name )
{
bool ret = false;
/* 上层会持续查询状态,给出当前状态 */
ret = key_group[name].is_press;
/* 重置flash禁止二次触发 */
key_group[name].is_press = false;
return ret;
}
void key_set_continue( key_name_t name , bool enable )
{
key_group[name].continue_enable = enable;
}
static inline void key_press( key_name_t name )
{
key_group[name].count ++;
/* 如果短按超过判定时间 */
if( key_group[name].count > KEY_SHORT_PRESS_TIME_MS )
{
/* 如果禁止连续按下判定 */
if( key_group[name].continue_enable == false )
{
/* 仅在第一次短按下触发判定 */
if( key_group[name].is_continue == false )
{
/* 禁止下次触发 直到按键释放 重新false*/
key_group[name].is_continue = true;
/* 第一次给出按下标识 */
key_group[name].is_press = true;
}
}
/* 如果允许连续按下判定 */
else
{
/* 连续给出按下标识 */
key_group[name].is_press = true;
/* 重新计时 */
key_group[name].count = 0;
}
}
}
static inline void key_release( key_name_t name )
{
key_group[ name ].count = 0;
key_group[ name ].is_continue = false;
}
void key_timer_1ms_interrupt_callback(void)
{
if( HAL_GPIO_ReadPin( KEY_UP_GPIO_Port, KEY_UP_Pin ) == RESET )
{
key_press( KEY_NAME_UP );
}
else
{
key_release( KEY_NAME_UP );
}
if( HAL_GPIO_ReadPin( KEY_DOWN_GPIO_Port, KEY_DOWN_Pin ) == RESET )
{
key_press( KEY_NAME_DOWN );
}
else
{
key_release( KEY_NAME_DOWN );
}
if( HAL_GPIO_ReadPin( KEY_ENTER_GPIO_Port, KEY_ENTER_Pin ) == RESET )
{
key_press( KEY_NAME_ENTER );
}
else
{
key_release( KEY_NAME_ENTER );
}
}