一、独立按键上的手丢失检测

按下按钮时,将使51 MCU的相应引脚变为低电平。使用此原理,可以执行密钥检测。类似于以下代码:
if(KEY1 == 0) {
delay_ms(10);
if(KEY1 == 0) {
...
}
}
如果要控制是否可以双击按钮,只需将其更改为以下内容即可:
方法1-
uchar enable = 0; //使能连按的标志位
while(1) {
if(KEY1 == 0) {
delay_ms(10);
if(KEY1 == 0) {
//执行按键被按下的操作
...
//前面已经执行完了响应操作
while(KEY1 == 0 && enable == 0){
//enable=0不支持连按,如果一直按着就会卡在这个循环
}
//在while之后,表明此时已经松手了
//因此,可以进行一些松手后的操作,例如
LED1 = 0;
delay_ms(10);
LED1 = 1;
}
}
}
上面是一个粗略的想法:如果持续按下按钮,则相应的I / O端口必须始终为0,并添加一个控制位以启用释放检测。

方法2-
如果放开后按按钮,则I / O端口必须从高电平变为低电平。我们只需要捕获此更改。
uchar before;
while(1) {
//before = 1; 如果需要使用连按功能时,可以这样写
before = KEY1;
//如果之前值不等于现在值,必然发生了高低电平的变化
//这种变化有两种可能,0变1或者1变0,只需在消抖后重新判断即可
if(KEY1 != before) {
delay_ms(10);
if(KEY1 == 0) {
...
}
}
}
当然有一些想法。矩阵键盘的松手检测采用了另一种思维方式。

矩阵键盘的发布检测

矩阵键盘和独立键释放检测之间存在一些差异。矩阵键盘的任何端口均未接地,并且所有8个端口均已连接到I / O端口。这需要手动更改I / O端口的输入以检测是否松开。在这里,我制作了矩阵键盘扫描功能,并在其中嵌套了按键响应接口功能execute(key_val)接口功能。用户只需要在execute()中编写响应操作:
//mode=1表示支持连按,flag是用于表示按键是否被连按的标志位
void key(uint time, uint mode, uint* flag)
{
uint temp = 0x00;
uint row = 0,line = 0,key_val = 0;
/*
逻辑说明:flag取值为0或1,mode取值为0或1
当mode=1时,表示支持连按,无论*flag取何值,均可以进入键盘扫描判断
当mode=0,*flag=1时,表示不支持连按,但是按键是被第一次按下的,可以进入键盘扫描判断
当mode=0,*flag=0时,表示不支持连按,且按键不是第一次被按下,不可以进入键盘扫描判断
所以,当mode,*flag均为0时,不可以进入键盘扫描判断,也就是说,当两者相加为0时,不能进入键盘扫描函数
*/
uint enable;
enable = mode + *flag;
P3 = 0x0f; //行高列低,写引脚
temp = P3 & 0x0f; //读引脚
if(temp == 0x0f){
//如果检测到按键没有被按下,说明连按被中断了,此时恢复标志位
*flag=1;
}
if(temp != 0x0f && enable != 0){
delay(time);
if(temp != 0x0f){
switch(temp){
case 0x0e:
row = 1;
break;
case 0x0d:
row = 2;
break;
case 0x0b:
row = 3;
break;
case 0x07:
row = 4;
break;
}
P3 = 0xf0; //列高行低
temp = P3 & 0xf0;
if(temp != 0xf0){ //之前已经消抖过了,所以这里不用消抖
switch(temp){
case 0xe0:
line = 1;
break;
case 0xd0:
line = 2;
break;
case 0xb0:
line = 3;
break;
case 0x70:
line = 4;
break;
}
}
}
P3 = 0xf0; //P3重新赋值,方便之后的连按检测
key_val = 4*(line-1)+row;
execute(key_val);
//在执行完函数之后,检测按键是否还在被按着
if(mode == 0 && P3 != 0xf0){
//如果按键还在被按着,并且不支持连按
//改变标志位,告诉下一次的键盘扫描之前已经执行过响应操作了
*flag = 0;
}
}
}
emmmm,因此矩阵键盘的逻辑似乎更加复杂。如果有更简单的方法,我希望可以交换。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-357425-1.html
我们做出反应是有必要的
从没听说过会作词作曲