4*4矩阵键盘学习

提示:这里主要围绕4*4矩阵键盘,其他结构键盘的原理可通用。


一、为什么用矩阵键盘

我们在做独立键盘实验的时候,独立键盘与单片机连接时,每一个按键都需要一个独立的I/O口。
如果某单片机系统需要较多按键,使用独立按键便会占用较多的I/O口资源。
单片机系统中I/O口资源往往比较宝贵,当用到多个按键时,为了节省I/O口,我们选择矩阵键盘。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

二、矩阵键盘的工作原理

4*4矩阵键盘学习_第1张图片
如上图,由IO接口线组成行和列结构,键位设置在行和列的交叉点上。8个IO口实现了16个按键。

当按键没有按下时,行线与列线之间开路,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,两条I/O口线之间短路,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。

三、如何判断按键按下

1.逐行扫描

我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。

2.行列扫描

我们可以通过高四位全部输出为低电平,低四位输出为高电平。当接收到的数据低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下;然后再反过来,高四位输出为高电平,低四位输出低电平,然后根据接收到的高四位的值判断是哪一行有按键按下,这样就能确定是哪个按键被按下了。

四、按键的消抖

按键在按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动。抖动时长与开关的机械特性有关,一般为5~10ms。为了保证键每闭合一次CPU仅作一次处理,必须去除键释放时的抖动。

消除抖动的常见方法:硬件去抖和软件去抖。
在按键数较少时,可采用硬件去抖;而当按键数较多时,采用软件去抖。

硬件去抖:并联电容或双稳态消抖电路;
软件去抖:延时约10ms后再次判断。

五、参考程序
代码如下(示例):

	if( tmp != 0XF0 )//如果有按键按下
	{
        
		//防止长按时,持续自增导致变量溢出
		if( key_count < 2 )
		{
     
			key_count++;
		}
	}
	//若产生按键抖动被抬起则计数清0 
	else
	{
     
		key_count = 0;
	}
	
	//若连续2次扫描均处于按下状态 则认定按键确实被按下
	if( key_count == 2 )
	{
               
		column = tmp & 0XF0;//获取列号

		/*------------- GPIOE 高8位端口配置 -------------*/
		PB -> OUTEN |= 0XFF00;//PB输出使能
		
		//翻转: GPIOE 高8位端口 低4位为高, 高4位为低
		PB -> OUT &= 0X00FF;
		PB -> OUT |= 0X0F00;
		
		//GPIOE 高8位端口 低4位为 上拉输入
		PB -> OUTEN &= 0XF0FF;//PB输入使能
		GPIO_PUPD_SEL(PUPD_PU, PB, 8 );
		GPIO_PUPD_SEL(PUPD_PU, PB, 9 );
		GPIO_PUPD_SEL(PUPD_PU, PB, 10 );
		GPIO_PUPD_SEL(PUPD_PU, PB, 11 );
										
		row = ( PORTE >> 8 ) & 0X0F;//获取行号 		

之后会对矩阵键盘的应用做出详细介绍。

你可能感兴趣的:(单片机)