51单片机基础部分——矩阵按键检测

前言

上一节,我们说到了独立按键的检测以及使用,但是独立按键每一个按键都要对应一个IO口进行检测,在一些需要多按键的情况下,使用过多的独立按键会过多的占用单片机的IO资源,为了解决这个问题的出现,我们今天就来介绍一些矩阵按键。

矩阵按键

为了解决独立按键占用过多IO的问题,我们这里用到矩阵按键,这里我们要先搞懂,矩阵按键的工作原理,我们先看一下我们开发板上面的独立按键和矩阵按键部分的原理图

上面是独立按键的部分,下面则是矩阵按键部分的原理图,我们只看按键的样子,上下两种模式似乎是一样的,实际情况也确实如此,上下部分使用的按键是同样的,他们的区别是排列接线方式不同,我们来看,上面的独立按键是使用了4个IO来连接了4个按键,下面的矩阵按键则使用了8个IO连接了16个按键,这就会节省了IO的使用,提高单片机的运行效率。

原理

在该开发板我们用了8个IO来检测16个按键的状态检测,在该开发板中,,我们看到P0端口全部是用来做矩阵按键检测,8个IO检测16个按键,将16个按键以4*4的方式排摆开来,每行四个,每列四个,这样我们就可以通过8个IO来检测16个按键,每一个按键只对应一个行和一个列,所以我们可以将8个IO分为两组,一组检测行,一组检测列,每个按键只对应两个IO,但是每个IO可以对应四个按键。


检测&代码

该开发板中,矩阵按键为4*4排列,每一行(列)对应4个按键,共可以交叉出16个坐标,且每个坐标都是唯一存在的,所以我们可以通过逐行(列)的方式来判断按键的状态并检测,这样我们就可以定位到每一个按键,检测方式和独立按键相同,话不多说,直接上代码

c 复制代码
unsigned char MatrixKey()
{
	
	unsigned char KeyNumber=0;
	
	P1=0xff;
	P1_3=0;
	if(P1_7==0){delay(20);while(P1_7==0);delay(20);KeyNumber=1;}
	if(P1_6==0){delay(20);while(P1_6==0);delay(20);KeyNumber=5;}
	if(P1_5==0){delay(20);while(P1_5==0);delay(20);KeyNumber=9;}
	if(P1_4==0){delay(20);while(P1_4==0);delay(20);KeyNumber=13;}

	P1=0xff;
	P1_2=0;
	if(P1_7==0){delay(20);while(P1_7==0);delay(20);KeyNumber=2;}
	if(P1_6==0){delay(20);while(P1_6==0);delay(20);KeyNumber=6;}
	if(P1_5==0){delay(20);while(P1_5==0);delay(20);KeyNumber=10;}
	if(P1_4==0){delay(20);while(P1_4==0);delay(20);KeyNumber=14;}

	P1=0xff;
	P1_1=0;
	if(P1_7==0){delay(20);while(P1_7==0);delay(20);KeyNumber=3;}
	if(P1_6==0){delay(20);while(P1_6==0);delay(20);KeyNumber=7;}
	if(P1_5==0){delay(20);while(P1_5==0);delay(20);KeyNumber=11;}
	if(P1_4==0){delay(20);while(P1_4==0);delay(20);KeyNumber=15;}

	P1=0xff;
	P1_0=0;
	if(P1_7==0){delay(20);while(P1_7==0);delay(20);KeyNumber=4;}
	if(P1_6==0){delay(20);while(P1_6==0);delay(20);KeyNumber=8;}
	if(P1_5==0){delay(20);while(P1_5==0);delay(20);KeyNumber=12;}
	if(P1_4==0){delay(20);while(P1_4==0);delay(20);KeyNumber=16;}

	return KeyNumber;
}

我们可以对KeyNumber进行判断,判断读取到了哪个按键有变化,然后做出相应的状态,写对应的代码;

大家可以尝试用矩阵按键在数码管做一个简易的计算器,在数码管显示,大家可以自己尝试写一下,后面会在其他文章更新

相关推荐
嵌入式ZYXC18 小时前
STM32烧录一次后无法再次烧录的两种原因
stm32·单片机·嵌入式硬件
踏着七彩祥云的小丑19 小时前
嵌入式测试学习第33 天:压力测试、反复开关机、反复插拔接口测试
单片机·嵌入式硬件·学习
开发笔记-阿牛21 小时前
CK6159A 可靠性测评:芯片工艺、环境测试与量产稳定性分析
stm32·单片机·嵌入式硬件
国科安芯21 小时前
商业航天通信载荷数字处理单元供电架构研究——基于ASP7A84AS的高精度低压差线性稳压器技术分析
前端·单片机·嵌入式硬件·fpga开发·架构·安全性测试
嵌入式ZYXC21 小时前
第8篇:《面试题:模拟地和数字地为什么要分开?怎么接?》
stm32·单片机·嵌入式硬件·面试·职场和发展
hai31524754321 小时前
九章编程法 · HTTP转发代理网关【终极完美版·矩阵步进交换】
人工智能·网络协议·线性代数·http·矩阵·极限编程
开发笔记-阿牛1 天前
CK6159A 主控开发:多模式手电筒硬件架构、接线规范及选型参考
单片机·嵌入式硬件
一目Leizi1 天前
通信协议完全指南
stm32·单片机·嵌入式硬件
Zyed1 天前
[STM32]Day11-Part2硬件实现SPI读写W25Q64
stm32·单片机·嵌入式硬件
HAPPY酷1 天前
软件模拟 I2C vs 硬件 I2C:核心异同与工程选型指南
stm32·单片机·嵌入式硬件·物联网·microsoft