typedef enum Key_return
{
key_return_none = 0 ,
start_short_press, //开始短按
start_long_press, //开始长按
start_double_press, //开始双击
start_double_and_long_press, //开始双击并长按
long_long_press_trig, //连续长按(可设定连续返回的间隔时间)
double_and_long_long_press_trig, //开始双击并连续长按(可设定连续返回的间隔时间)
end_short_press, //短按结束(释放)
end_short_press_and_wait, //短按结束并完成等待(短按松开后无操作一段时间,用于短按和双击共存的情况)
end_long_press, //长按结束(释放)
end_double_press, //双击结束(释放)
end_double_and_long_press, //双击并长按结束(释放)
}Key_return_t;
typedef enum Key_state
{
key_state_none = 0,
short_press_and_hold, //短按中
short_press_release, //短按松开
short_press_release_and_wait, //短按松开等待(短按松开后无操作一段时间,用于短按和双击共存的情况)
long_press_and_hold, //长按中
long_press_release, //长按松开
double_press_and_hold, //双击中
double_press_and_long_hold, //双击并长按中
}Key_state_t;
//----------------------------全功能------------------------------------
//单位10ms
#define Get_Key_Right() (PA5==0)
#define key_delay_count 2 //连续扫描消抖设置
#define key_long_count 35 //长短按时间阈值
#define key_long_trig_count 4 //连续长按触发返回的时间
#define key_double_delay_count 10 //双击,最大间隔设置,少于这个时间连续短按会被判断为双击
uint16_t key_right_det_count;
Key_state_t key_right_state;
Key_return_t Key_Right_det()
{
if(Get_Key_Right())
{
key_right_det_count++;
switch(key_right_state)
{
case key_state_none:{if(key_right_det_count>=key_delay_count){key_right_state=short_press_and_hold;key_right_det_count=0;return start_short_press;}}break;
case short_press_and_hold:{if(key_right_det_count>=key_long_count){key_right_state=long_press_and_hold;key_right_det_count=0;return start_long_press;}}break;
case short_press_release:{if(key_right_det_count>=key_delay_count){key_right_state=double_press_and_hold;key_right_det_count=0;return start_double_press;}}break;
case long_press_and_hold:{if(key_right_det_count>=key_long_trig_count){key_right_det_count=0;return long_long_press_trig;}}break;
case double_press_and_hold:{if(key_right_det_count>=key_long_count){key_right_state=double_press_and_long_hold;key_right_det_count=0;return start_double_and_long_press;}}break;
case double_press_and_long_hold:{if(key_right_det_count>=key_long_trig_count){key_right_det_count=0;return double_and_long_long_press_trig;}}break;
default:break;
}
}
else
{
switch(key_right_state)
{
case key_state_none:{key_right_det_count=0;}break;
case short_press_and_hold:{key_right_det_count=0;key_right_state=short_press_release;return end_short_press;}break;
case short_press_release:{key_right_det_count++;if(key_right_det_count>=key_double_delay_count){key_right_det_count=0;key_right_state=key_state_none;return end_short_press_and_wait;}}break;
case long_press_and_hold:{key_right_det_count=0;key_right_state=key_state_none;return end_long_press;}break;
case double_press_and_hold:{key_right_det_count=0;key_right_state=key_state_none;return end_double_press;}break;
case double_press_and_long_hold:{key_right_det_count=0;key_right_state=key_state_none;return end_double_and_long_press;}break;
default:break;
}
}
return key_return_none;
}
//全功能
void Key_Right_func()
{
switch(Key_Right_det())
{
case key_return_none: //无按键动作
break;
case start_short_press: //开始短按
break;
case start_double_press: //开始双击
break;
case start_long_press: //开始长按
break;
case start_double_and_long_press: //开始双击并长按
break;
case long_long_press_trig: //连续长按
break;
case double_and_long_long_press_trig: //开始双击并连续长按
break;
case end_short_press_and_wait: //短按结束并完成等待(短按结束后等待一点时间,可用于短按和双击共存)
break;
case end_short_press: //短按结束(释放)
break;
case end_double_press: //双击结束(释放)
break;
case end_long_press: //长按结束(释放)
break;
case end_double_and_long_press: //双击并长按结束(释放)
break;
default:break;
}
}
//不需要双击
void Key_Right_2func()
{
switch(Key_Right_det())
{
case key_return_none: //无按键动作
break;
case start_short_press: //开始短按
case start_double_press: //开始双击
break;
case start_long_press: //开始长按
case start_double_and_long_press: //开始双击并长按
break;
case long_long_press_trig: //连续长按
case double_and_long_long_press_trig: //开始双击并连续长按
break;
case end_short_press_and_wait: //短按结束并完成等待(短按结束后等待一点时间,可用于短按和双击共存)
break;
case end_short_press: //短按结束(释放)
case end_double_press: //双击结束(释放)
break;
case end_long_press: //长按结束(释放)
case end_double_and_long_press: //双击并长按结束(释放)
break;
default:break;
}
}