今日处理工作时遇到了一个问题,操作非连发按键时也会唤醒机器,但不会有连发动作,查看代码了解到也是历史遗留问题。
它采用掩码形式,将多个按键键值或运算到一起,最后在与收到的按键值与运算来查看该按键是否可以连发,这样有一个弊端,即多个按键的按键值占用多个位,会导致非连发按键的键值也被包裹进或运算后的掩码里,导致一直接收按键唤醒。如
#define K1 0X01
#define K2 0X02
#define K3 0X0C
#define K4 0X04
#define code=(K1|K2|K3)
判断函数
if((code&reception)==reception) //reception为实际接收到的按键码值
{//一些处理}
这时会出现K4不在code里,但是也会进入到判断函数里,code=00001111,K4=00000100,因为code把K4的键值给包含了,导致误进入判断函数(如果每个键值只占一bit位,不会发生该现象)。
解决方法如下,不使用掩码,依次判断,如下
if((K1==reception)||(K2==reception)||(K3==reception))
{//一些处理}
或者更好的方法,采用链表数据,寻表查找键值,如下
#define K1 0X01
#define K2 0X02
#define K3 0X0C
#define K4 0X04
#define num (3)
#define const code[num]={K1,K2,K3}
for(i=0;i<num;i++)
{if(code[i]==reception)
{//一些处理}
}
此时不会再出现误进入的现象。