|
书中按键长按的代码如下:
char read_key_n(void)
{
static char key_state = 0, key_time = 0;
char key_press, key_return = 0;
key_press = key_input; // 读按键 I/O电平
switch (key_state)
{
case key_state_0: // 按键初始态
if (!key_press) key_state = key_state_1; // 键被按下,状态转换到键确认态
break;
case key_state_1: // 按键确认态
if (!key_press)
{
key_state = key_state_2; // 按键仍按下,状态转换到计时 1
key_time = 0; // 清另按键时间计数器
}
else key_state = key_state_0; // 按键已抬起,转换到按键初始态
break;
case key_state_2:
if (key_press)
{
key_state = key_state_0; // 按键已释放,转换到按键初始态
key_return = 1; // 输出“1”
}
else if (++key_time >= 100) // 按键时间计数
{
key_state = key_state_3; // 按下时间>1s,状态转换到计时 2
key_time = 0; // 清按键计数器
key_return = 2; // 输出“2”
}
break;
case key_state_3:
if (key_press) key_state = key_state_0; //按键已释放,转换到按键初始态
else
{
if (++key_time >= 50) // 按键时间计数
{
key_time = 0; // 按下时间>0.5s,清按键计数器
key_return = 2; // 输出“2”
}
}
break;
}
return key_return;
}
这段程序中的key_time是静态局部变量,如果我一次按键按下了800ms就松手的话,那么在key_state_2中,就不会执行else if (++key_time >= 100){}括号里面的语句,会返回到key_state_0状态,这时key_time并没有被清零,应该是80,下一次按的时候再进入key_state_2状态下,只要我按下时间超过200ms,就会认为是长按了吧?同理在key_state_3中也是(key_time<50的时候)。是否应该在key_state_0状态下将key_time清零呢? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。
如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》
|