热度 3||
特点:
1,任意单键键按键和松键都会发编码。
2,按住某些键后,再按另外的键,按键和松键,还是发送编码。编码中,原先按住的键,一直也是按住的状态。
3,没有短按和长按,双击单击的区别。
代码实现:
void Handle_SW(void)
{
unsigned char key_change = 0;
static unsigned char handle_value_last;
static unsigned char handle_value_this;
handle_value_this = SWV;
key_change = handle_value_last ^ handle_value_this;
if(key_change)
{
if(handle_value_this & key_change)
{
switch(key_change)
{
case 0x01:
key1_press();
break;
case 0x02:
key2_press();
break;
case 0x04:
key3_press();
break;
case 0x08:
// key4_press();
break;
case 0x10:
// key5_press();
break;
case 0x20:
// key6_press();
break;
case 0x40:
// key7_press();
break;
case 0x80:
// key8_press();
break;
default:
break;
}
}
else
{
switch(key_change)
{
case 0x01:
key1_loosen();
break;
case 0x02:
key2_loosen();
break;
case 0x04:
key3_loosen();
break;
case 0x08:
// key4_loosen();
break;
case 0x10:
// key5_loosen();
break;
case 0x20:
// key6_press();
break;
case 0x40:
// key7_press();
break;
case 0x80:
// key8_press();
break;
default:
break;
}
}
}
handle_value_last = handle_value_this;
}
分析:不停的读取按键值,如果两次读值不同,则有按键动作。按键动作又分为按下和松开两种状态。
按下:如果这次读到某个管脚是1,而上次读到这个管脚是0,则是按键被按下了。
松开:如果这次读到某个管脚是0,而上次读到这个管脚是1,则是按键被松开了。
这里用的是异或运算来实现对两次按键值得比较。