51单片机入门:独立按键与矩阵键盘

独立按键

轻触按键:相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。

 独立按键在开发板内部的原理图如下:

4个独立按键的右端都公共接地,左端引出四个编号,接单片机的I/O口上。当单片机上电时,所有I/O口默认都是高电平,当按键没有按下时,I/O口保持高电平;当按键按下后,I/O口变为低电平。

寄存器会检测I/O口的电平,再读回寄存器中。比如按下K1后,寄存器检测到P3_1为低电平,寄存器内的值为0,即P3_1==0。


按键抖动

按键开关一般是由弹性金属制成,当机械触点被按下时,会经历波动过程,然后再稳定;弹起时也会产生类似情况。通常我们称此现象为按键抖动,也被称为接触弹跳

而单片机运行速度很快,按键抖动会被检测出来,从而对按键的判断产生一些误操作(比如按一下会产生按多下的效果),因此必须要消除抖动才能正常使用按键。

一开始为高电平,按下按键后,经过5~10ms的抖动才稳定为低电平;松开按键后,同样经过5~10ms的抖动才稳定为高电平。

按键消抖分为两种:软件消抖硬件消抖

硬件消抖:通过滤波电路或者其他电路实现,此处不做讨论。

软件消抖:简单的消抖方法为延时消抖,即检测到状态变化后,延时大约10ms,再次确认状态,如果相同才识别为有效。通常通过延时代码来实现,如下所示:

void Delay1ms(int xms)		//@12.000MHz,实际根据晶振选频率
{
	unsigned char i, j;
	while(xms){
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

上述代码可自己设定参数来决定延时的时间。


矩阵按键

当键盘中按键比较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,所以称为矩阵按键。采用逐行或逐列的“扫描”,就能实现读出任何位置按键的状态。

矩阵键盘识别比独立按键略微复杂,但是相比独立按键可节省大量IO口,实际开发中应用较多。以下是矩阵按键原理图:

可以看出按键以矩阵方式连接,P1.0~P1.3 为列线,P1.4~P1.7为行线。

 具体如何通过代码来检测哪个按键被按下了呢?如下代码所示:

此代码为按下第几个按键就在LCD显示屏上显示几的代码,此处采用逐列扫描:循环设置单个列线为0,检测每列对应行线,确定按键位置。

unsigned char MatrixKey()
{
	unsigned char keynumber=0;
	P1=0xFF;
	P1_3=0;
	if(P1_7==0){Delay();while(P1_7==0);Delay();keynumber=1;}
//假设按下此行代码对应按键,则P1_7会由高电平变为低电平。
	if(P1_6==0){Delay();while(P1_6==0);Delay();keynumber=5;}
	if(P1_5==0){Delay();while(P1_5==0);Delay();keynumber=9;}
	if(P1_4==0){Delay();while(P1_4==0);Delay();keynumber=13;}
	
	P1=0xFF;
	P1_2=0;
	if(P1_7==0){Delay();while(P1_7==0);Delay();keynumber=2;}
	if(P1_6==0){Delay();while(P1_6==0);Delay();keynumber=6;}
	if(P1_5==0){Delay();while(P1_5==0);Delay();keynumber=10;}
	if(P1_4==0){Delay();while(P1_4==0);Delay();keynumber=14;}
	
	P1=0xFF;
	P1_1=0;
	if(P1_7==0){Delay();while(P1_7==0);Delay();keynumber=3;}
	if(P1_6==0){Delay();while(P1_6==0);Delay();keynumber=7;}
	if(P1_5==0){Delay();while(P1_5==0);Delay();keynumber=11;}
	if(P1_4==0){Delay();while(P1_4==0);Delay();keynumber=15;}
	
	P1=0xFF;
	P1_0=0;
	if(P1_7==0){Delay();while(P1_7==0);Delay();keynumber=4;}
	if(P1_6==0){Delay();while(P1_6==0);Delay();keynumber=8;}
	if(P1_5==0){Delay();while(P1_5==0);Delay();keynumber=12;}
	if(P1_4==0){Delay();while(P1_4==0);Delay();keynumber=16;}
	
	return keynumber;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值