1 短按以松手作为触发条件
2 长按以2秒钟未松手作为触发条件
3 按键按下为0 松开为1
4 key_return 0 未按下 1 短按 2 长按
伪代码如下:
enum key_state
{
S0=1, S1, S2, S3
};
char key_scan()
{
static char key_state = 0, key_time = 0;
static char key_press = 0, key_return = 0;
key_press = readKEY();
switch(key_state)
{
case S0://无按键按下
if(!key_press)
key_state = S1;
break;
case S1: //有按键按下
if(!key_press)
{
key_state = S2;
key_time = 0;
}
else
{
key_state = S0;//消抖
key_return = 0;
}
break;
case S2://计时1
if(key_press)//按键松开
{
key_state = S0;//短按已松开,返回初始状态
key_return = 1;
}
else if(++key_time >= 2000)
{
key_state = S3;//计时满2秒,表示是长按
key_time = 0;
key_return = 2;
}
break;
case S3://计时2
if(key_press) //按键松开
key_state = S0;//此时按键已经持续了2秒了 等待按键松开返回初始状态
break;
}
return key_return;
}
还未测试