b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

矩阵键盘与独立按键松手检测的逻辑更加复杂一点

电脑杂谈  发布时间:2021-02-15 12:01:35  来源:网络整理

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

独立按键原理图

按下按钮时,将使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,并添加一个控制位以启用释放检测。

51 矩阵键盘_不死族键盘怎么打_巨蟒出击 迅雷下载

方法2-

如果放开后按按钮,则I / O端口必须从高电平变为低电平。我们只需要捕获此更改。

uchar before;
while(1) {
	//before = 1; 如果需要使用连按功能时,可以这样写
	before = KEY1;
	//如果之前值不等于现在值,必然发生了高低电平的变化
	//这种变化有两种可能,0变1或者1变0,只需在消抖后重新判断即可
	if(KEY1 != before) {
		delay_ms(10);
		if(KEY1 == 0) {
			...
		}
	}
}

当然有一些想法。矩阵键盘的松手检测采用了另一种思维方式。

不死族键盘怎么打_51 矩阵键盘_巨蟒出击 迅雷下载

矩阵键盘的发布检测

矩阵键盘

矩阵键盘和独立键释放检测之间存在一些差异。矩阵键盘的任何端口均未接地,并且所有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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 殷瑞
        殷瑞

        从没听说过会作词作曲

      • 高扬
        高扬

        我们做出反应是有必要的

      热点图片
      拼命载入中...