123 lines
2.1 KiB
C
123 lines
2.1 KiB
C
#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 );
|
||
}
|
||
|
||
}
|