用状态机
int8 key_init()
{
static uint8 key_m=0,time1=0;
uint8 key_val=0;
key_shuju=0;
switch(key_m)
{
case 0 : if(KeyIn1==0){key_m=1;LED4=0;}break; //如果有按键按下 转到CASE1消斗
case 1 : if(KeyIn1==0){time1=0;key_m=2;LED4=1;}//如果按键还处于按下状态 消斗完成转到CASE2
else {key_val=0;key_m=0;}break; //如果按键已经弹起 返回无键按下
case 2 : if(KeyIn1==1){key_val=1;key_m=0;} //按键弹起 返回一次单击
else time1++; if(time1>=40){key_val=3;key_m=3;}break; //按键还处于按下状态 超过 3秒 返回长按键 转到CASE3
case 3 :if(KeyIn1==1){key_m=0;} break; //等待按键弹起
}
return key_val;
}
uint8 rend_key()
{
static uint8 key_m=0,time2=0,time3=0;
uint16 key_val=0,temp=0;
temp=key_init();
switch(key_m)
{
case 0 :if(temp==1){time2=0;key_m=1;} //如果有一次单击事件 转到CASE1 判断是否会发生第二次单击
else {key_val=temp;}break; //没有单击事件 返回key_val值
case 1: if(temp==1){key_m=2;time3=0;} //再一次单击事件 转到CASE3 判断是否会发生第三次单击
else time2++; if(time2>=8){key_val=1;key_m=0;}break; //如果再500m秒内没有再次发单击事件 返回 单击
case 2: if(temp==1){key_val=4;key_m=0;} //有第三次单击事件 返回key_val=4 表示连续按了三次按键
else time3++; if(time3>=8){key_val=2;key_m=0;}break; //如果在500m秒内没有再次发单击事件 返回 双击
}
return key_val;
}
|