单片机——对矩阵键盘进行扫描

本文介绍了如何使用矩阵按键来有效节省单片机的引脚资源,特别是在开发计算器和密码锁等需要多个按键的设备时。通过行列扫描法,仅需8个引脚就能实现16个按键的功能,进一步优化后,9个引脚可处理20个按键。详细阐述了矩阵按键的工作原理和编程思路,包括消抖、行列扫描和按键序号的计算方法,为单片机项目的硬件和软件设计提供了实用技巧。
摘要由CSDN通过智能技术生成

前言:在项目开发中,有时会涉及到很多物理按键的操作,如果每个开关按键都接一个引脚的话(一端和单片机引脚连接,一端和GND连接),这样虽然好判断按键是否按下(按下为低电平)。但想一想这样是不是特别浪费引脚呢?

1、比如如果用单片机开发一款计算器,类似按键界面如下图所示。
在这里插入图片描述
2、又比如开发一款大门的密码锁,键盘界面如下所示。
在这里插入图片描述
想一想如果用实体按键来模拟上面的按键,如果每一个实体按键和单片机引脚相连,就要占用16个引脚,太浪费单片机引脚了,对吧,毕竟单片机引脚是非常稀少、宝贵的。

所以接下来就进入今天的正题。

一、矩阵按键的简介

在键盘中按键数量较多时,为了减少I/0口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。电路连接的原理图如下图所示。

在这里插入图片描述
从上图可以看出16个按键只用了8个引脚,比用简单方法(一个按键连接一个引脚)连接减少了8个引脚的开支。

想一想如果要接20个按键呢?用矩阵按键的接法,需要用多少个单片机引脚呢?解决方法如下图所示,最终我们只需要用9个单片机引脚即可。
在这里插入图片描述

二、矩阵按键扫描方法

1、优缺点讨论

每个按键都接一个引脚,这种方法虽然有浪费引脚的弊端,但也有一个好处,那就是在编程中方便判断引脚是否按下,只用检测所连接引脚的电平即可。

把按键集中起来,用矩阵的排列方式连接,这样有一个好处就是节约引脚,但是在编程时,如果要检测哪个按钮是否按下,就没有原始连接方法那样容易判断了。但学习了矩阵按键的扫描方法后,就变得很容易了。

2、矩阵按键扫描方法

此次矩阵按键的扫描方法:行列扫描法。

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

3、具体的编程思路

在这里插入图片描述
看图说话,代码如下:

//定义函数中要用到的变量
int key;		//存储哪一个按键按下
int key_scan()
{
	P1=0x0f;		//引脚的高四位输入低电平,低四位输入高电平
	if(P0!=0x0f)		//此时检测矩阵按键中是否有按键按下,如果有按键按下,则低四位中某个引脚就会输入低电平
	{
		delay(100);		//延时消抖
		if(P1!=0x0f)		//再确认一次按键按下
		{
			//测试列
			switch(P1)
			{
				case(0X07):	key=1;break;		//第一列有按键按下,则低四位中的第4位会变为0
				case(0X0b):	key=2;break;		//第一列有按键按下,则低四位中的第3位会变为0
				case(0X0d): key=3;break;
				case(0X0e):	key=4;break;
			}
			//测试行
			P1=0Xf0;		//引脚的低四位输入低电平,高四位输入高电平
			switch(P1)
			{
				case(0X70):	key=key;break;		//第一行有按键按下
				case(0Xb0):	key+=4;break;		//第二行有按键按下
				case(0Xd0): key+=8;break;
				case(0Xe0):	key+=12;break;
			}
			
		}
	}
return key;
}

这里解释一下上面代码中的一个片段,这里涉及一个小小的算法。代码片段如下:

switch(P1)
		{
			case(0X70):	key=key;break;
			case(0Xb0):	key+=4;break;
			case(0Xd0): key+=8;break;
			case(0Xe0):	key+=12;break;
		}

这里是根据矩阵按键扫描的行、列号直接计算出来了对应的按键序号。原理分析如下:

第一次列扫描,知道第n列有按键按下后。
接下来行扫描,如果第一行有按键按下,那么按键序列号就是列序列号。
如果第二行有按键按下,那么按键序列号就是列号+4。
如果第三行有按键按下,那么按键序列号就是列号+8。
如果第四行有按键按下,那么按键序列号就是列号+12。

可以对照上面原理图看。

根据上面的代码,我们就可以扫描出是哪一个按键按下,然后在编程中就根据相应的按键执行相应的功能代码就行。

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掏一淘哆啦A梦的奇妙口袋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值