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;
|
|||
|
|
|
|||
|
|
/* <20>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ״̬ */
|
|||
|
|
ret = key_group[name].is_press;
|
|||
|
|
|
|||
|
|
/* <20><><EFBFBD><EFBFBD>flash<73><68><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>δ<EFBFBD><CEB4><EFBFBD> */
|
|||
|
|
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 ++;
|
|||
|
|
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1> */
|
|||
|
|
if( key_group[name].count > KEY_SHORT_PRESS_TIME_MS )
|
|||
|
|
{
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> */
|
|||
|
|
if( key_group[name].continue_enable == false )
|
|||
|
|
{
|
|||
|
|
/* <20><><EFBFBD>ڵ<EFBFBD>һ<EFBFBD>ζ̰<CEB6><CCB0>´<EFBFBD><C2B4><EFBFBD><EFBFBD>ж<EFBFBD> */
|
|||
|
|
if( key_group[name].is_continue == false )
|
|||
|
|
{
|
|||
|
|
/* <20><>ֹ<EFBFBD>´δ<C2B4><CEB4><EFBFBD> ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD><EFBFBD>false*/
|
|||
|
|
key_group[name].is_continue = true;
|
|||
|
|
/* <20><>һ<EFBFBD>θ<EFBFBD><CEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>ʶ */
|
|||
|
|
key_group[name].is_press = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> */
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>ʶ */
|
|||
|
|
key_group[name].is_press = true;
|
|||
|
|
/* <20><><EFBFBD>¼<EFBFBD>ʱ */
|
|||
|
|
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 );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|