uint8_t key_state_curr = 0;
uint8_t key_state_last = 0;
uint8_t key_press_cont = 0;
uint16_t key_release_time = 0;
uint16_t key_long_press_time = 0;
//10ms执行1次
void key_porc(void)
{
//key_state_curr 是已消抖的按键状态,0按下,1松开,这里不提供消抖部分逻辑
//按键状态变化
if(key_state_last != key_state_curr)
{
//当前是按下,下降沿
if(key_state_curr == 0)
{
//处理按下相关
key_long_press_time=0;
key_release_time=0;
key_press_cont++;
}
//当前是松开,上升沿
else
{
//处理松开相关
}
key_state_last = key_state_curr;
}
//长按下检测
if(key_state_curr == 0)
{
if(key_press_cont)
{
key_long_press_time++;
//长按2秒
if(key_long_press_time >= 200)
{
//处理长按相关
key_long_press_time=0;
key_press_cont=0;
}
}
}
//长松开检测
else
{
if(key_press_cont)
{
key_release_time++;
//松开500ms,处理按键值
if(key_release_time >= 50)
{
//当前是单击
if(key_press_cont == 1)
{
//处理单击相关
}
//当前是双击
else if(key_press_cont == 2)
{
//处理双击相关
}
key_press_cont = 0;
key_release_time = 0;
}
}
}
}
简洁的c代码实现按键长按、短按、单击、双击程序
最新推荐文章于 2024-06-12 17:30:15 发布