|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2012-5-11 13:40:11
|
显示全部楼层
本帖最后由 3lvictor 于 2012-5-11 13:57 编辑
uchar read_key_n(void)
{
static uchar key_state = 0, key_time = 0, key_old; //保存按键的状态值,该变量的值在函数调用结束后不能消失
uchar key_press, key_return = 0;
key_press = key_input & key_mask; //读按键I/O电平,每一个10MS都要读IO电平是什么电平
switch (key_state)
{
case key_state_0: // 按键初始态
if (key_press != key_mask)
{
key_old = key_press; // 记录原电平状态 主要是把刚才按下的键值存到变量key_old中
key_state = key_state_1; // 键被按下,状态转换到键确认态
}
// 键被按下,状态转换到键确认态
break;
case key_state_1: // 按键确认态
if (key_press == key_old)
{
key_state = key_state_2; // 按键仍按下,状态转换到计时1
key_time = 0; // 清零按键时间计数器 开始计数
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态,这说明刚才那是抖动。
break;
case key_state_2:
if (key_press == key_mask) // 按键已经抬起,利用key_old记录了IO电平的状态 这句非常关键
{
key_state = key_state_0; // 按键已释放,转换到按键初始态 这里判断的是单击
if (key_old == 0x0e) {key_return = key_short_mode;}
else if(key_old == 0x0d) {key_return = key_short_left;}
else if(key_old == 0x0b) {key_return = key_short_clr;}
else if(key_old == 0x07) {key_return = key_short_del;}
else if(key_old == 0x2f) {key_return = key_short_up; }
else if(key_old == 0x1f) {key_return = key_short_set;}
}
else if (++key_time >= 100) // 按键时间计数 说明还是有键按下的
{
key_state = key_state_3; // 按下时间>1s,状态转换到计时2
key_time = 0; // 清按键计数器
if (key_old == 0x0e) {key_return = key_long_mode;}
else if(key_old == 0x0d) {key_return = key_long_left;}
else if(key_old == 0x0b) {key_return = key_long_clr;}
else if(key_old == 0x07) {key_return = key_long_del;}
else if(key_old == 0x2f) {key_return = key_long_up; }
else if(key_old == 0x1f) {key_return = key_long_set;}
}
break;
case key_state_3:
if (key_press==key_mask) //这里说明长按键也松手了
key_state = key_state_0; //按键已释放,转换到按键初始态
break;
}
return key_return;
}
这就是底层的状态机代码。我想问的是:
是不是永远都不可能检测到第二个键按下啊(因为人的反应好慢,根本不可能在10毫秒内再按下第二个键啊?)
我想实现在在某个键按下的情况下,再去检测其他的键,当其他键按下后执行功能函数。这个带吗该如何组织? |
|