下面是我写的一个键盘检测程序。键盘的底层是用状态机写的,这里没10毫秒扫描一次。
问题是: 键盘只能检测到key_long_set这里,进去后,key_lshort_left,key_short_up都检测不到这是什么问题啊?
是不是在我按下key_long_set之后的10毫秒里没有按下其他键,他就不检测了?
还有就是if(keyValue == key_long_set)条件成立的情况下,它里面的内容只执行一次还是一直停在里面了?(这个问题一直困扰我好久)
请大家斑斑我分析下,谢谢。
if(Time10Ms)
{
Time10Ms = 0;
keyValue = read_key_n();
}
if(keyValue == key_long_set)
{
InputCode();
if(keyValue == key_short_left )
{
codeWei++;
if(codeWei > 5)
{
codeWei = 0;
}
}
switch(codeWei)
{
case 0:
{
if(keyValue == key_short_up)
code5++;
if(code5 > 9)
code5 = 0;
} break;
case 1:
{
if(keyValue == key_short_up)
code4++;
if(code4 > 9)
code4 = 0;
}break;
case 2:
{
if(keyValue == key_short_up)
code3++;
if(code3 > 9)
code3 = 0;
}break;
case 3:
{
if(keyValue == key_short_up)
code2++;
if(code2 > 9)
code2 = 0;
}break;
case 4:
{
if(keyValue == key_short_up)
code1++;
if(code1 > 9)
code1 = 0;
}break;
default:break;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
keyvalue第一次结果为long_set,然后执行inputData()函数,然后下一个if判定不成立,检测退出,10 ms后状态机返回什么呢?是什么状态?还有按键检测有优先级吗?
楼主还是把状态机和底层按键扫描代码也贴下吧。。。。
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毫秒内再按下第二个键啊?)
我想实现在在某个键按下的情况下,再去检测其他的键,当其他键按下后执行功能函数。这个带吗该如何组织?
谢谢您的指导
一周热门 更多>