按键长按短按检测
需要放入任务中轮询执行,dT_ms是任务周期
代码
static uint8_t key_check(uint32_t dT_ms)
{
static uint8_t key_state = 0;
static uint8_t key_return = NO_KEY;
static uint32_t key_time_cnt = 0;
switch(key_state)
{
case 0:
{
if(gpio_input_bit_get(KEY_GPIO, KEY_GPIO_PIN) == RESET)
{
key_time_cnt += dT_ms;
if(key_time_cnt > 20)
{
key_state++;
//key_time_cnt = 0;//不需要置0,若置零则为连按
}
}
else
{
key_state = 0;
key_time_cnt = 0;
}
break;
}
case 1:
{
if(gpio_input_bit_get(KEY_GPIO, KEY_GPIO_PIN) == SET)//release check
{
if((key_time_cnt > 20) && (key_time_cnt < 1000))// short press
{
key_return = KEY_DOWN;
key_time_cnt = 0;
key_state = 0;
}
else if(key_time_cnt >= 1000)//long press
{
key_return = KEY_DOWN_LONG;
key_time_cnt = 0;
key_state = 0;
}
else
{
key_return = NO_KEY;
key_time_cnt = 0;
key_state = 0;
}
}
else if(gpio_input_bit_get(KEY_GPIO, KEY_GPIO_PIN) == RESET)
{
key_time_cnt += dT_ms;
}
break;
}
default:
{
key_state = 0;
break;
}
}
return key_return;
}