在 51 单片机的应用领域中,人机交互是一个关键环节。而矩阵键盘作为一种常用的输入设备,能够为用户提供便捷的操作方式。本文将深入探讨 51 单片机中矩阵键盘的原理、功能、作用以及应用实例,帮助读者全面了解和掌握这一重要的技术。
一、矩阵键盘的原理
矩阵键盘是一种将多个按键排列成矩阵形式的输入设备。相比于独立按键,矩阵键盘最大的优势在于能够用较少的 I/O 口连接更多的按键,从而节省单片机的 I/O 资源。以常见的 4*4 矩阵键盘为例,它有 16 个按键,通过将按键排列成 4 行 4 列,只需 8 根线(4 根行线和 4 根列线)就可以实现对这 16 个按键的检测,而如果使用独立按键,则需要 16 个 I/O 口。
矩阵键盘的工作原理基于行线和列线的交叉点。每个按键都位于行线和列线的交叉处,当某个按键被按下时,对应的行线和列线之间会形成通路。单片机通过扫描行线和列线的电平状态,就可以判断出哪个按键被按下。具体的扫描方法有行列扫描法和线翻转法。
一)行列扫描法
行列扫描法是最常用的矩阵键盘扫描方法。其工作过程如下:
- 判断是否有按键按下:将所有行线输出低电平,所有列线输出高电平,然后将列线设置为输入状态。如果有按键按下,对应的列线电平会被拉低,此时就可以判断有按键按下。
- 按键消抖:由于机械按键在按下和松开时会产生抖动,可能会导致误判。因此,在检测到有按键按下后,需要进行消抖处理。通常采用软件延时的方法,延时 10 - 20ms 后再次检测列线电平,如果仍然为低电平,则确认有按键按下。
- 确定按键位置:确定有按键按下后,开始逐行扫描。先将第一行输出低电平,其余行输出高电平,然后检测列线电平。如果某一列线为低电平,则说明该列与第一行交叉处的按键被按下。如果所有列线都为高电平,则说明第一行没有按键按下,接着扫描第二行,以此类推,直到找到被按下的按键所在的行和列。
- 计算键值:根据找到的行和列的位置,按照事先设定的规则计算出按键的键值。例如,可以将第一行第一列的按键键值设为 1,第一行第二列的按键键值设为 2,以此类推。
(二)线翻转法
线翻转法的原理相对复杂一些,但速度更快。其工作过程如下:
- 第一次扫描:将所有行线输出低电平,列线设置为输入状态,检测所有列线是否有低电平。如果有,则记录下此时列线的值。
- 第二次扫描:将所有列线输出低电平,行线设置为输入状态,检测所有行线的值。由于有按键按下,行线的值会发生变化,记录下此时行线的值。
- 确定按键位置:根据两次记录的值,通过一定的算法就可以确定按键所在的行和列。例如,如果第一次扫描时列线的值为 0x07(表示第一列有按键按下),第二次扫描时行线的值为 0x70(表示第一行有按键按下),则可以确定是第一行第一列的按键被按下。
- 计算键值:与行列扫描法类似,根据确定的行和列位置计算出按键的键值。
二、矩阵键盘的作用
(一)作用
- 节省 I/O 口资源:如前所述,矩阵键盘可以用较少的 I/O 口实现多个按键的输入,这对于 I/O 口资源有限的 51 单片机来说尤为重要。在一些复杂的应用系统中,可能还需要连接其他设备,如数码管、液晶显示屏、传感器等,如果使用独立按键,I/O 口很容易不够用,而矩阵键盘则可以有效解决这个问题。
- 增加按键数量:在需要大量按键的应用场景中,矩阵键盘可以轻松实现较多按键的布局,满足用户对丰富操作功能的需求。例如,在电子密码锁、电子秤、计算器等设备中,都需要较多的按键来实现各种功能,矩阵键盘就成为了理想的选择。
- 提高系统可靠性:通过合理的按键消抖处理和扫描算法,矩阵键盘可以准确地检测按键状态,减少误操作的发生,提高系统的可靠性和稳定性。
三、矩阵键盘的应用实例
(一)矩阵键盘控制LCD1602显示
在这个实例中,我们使用 4*4 矩阵键盘来控制LCD1602显示按键的键值。当按下矩阵键盘上的某个按键时,LCD1602会显示对应的键值。
代码如下:
主函数:(dalay.h,LCD1602.h在上一篇文章已发布)
#include <REGX51.H>
#include "delay.h"
#include "MatrixKey.h"
#include "LCD1602.h"
void main()
{
unsigned char KeyNum;
LCD_Init();
LCD_ShowString(1,1,"hello world");
while(1)
{
KeyNum=MatrixKey();
if(KeyNum)
{
LCD_ShowNum(2,1,KeyNum,2);
}
}
}
MatrixKey.c:
#include <REGX51.H>
#include "MatrixKey.h"
#include "delay.h"
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;
}
MatrixKey.h:
#ifndef __MATRIXKEY__H_
#define __MATRIXKEY__H_
unsigned char MatrixKey();
#endif
四、总结
矩阵键盘作为 51 单片机应用中重要的输入设备,通过巧妙的矩阵排列和扫描算法,实现了用较少的 I/O 口控制多个按键的功能。它不仅节省了硬件资源,还提高了系统的可靠性和操作的便捷性。在实际应用中,矩阵键盘广泛应用于各种电子设备,如电子秤、计算器、电子密码锁、工业控制系统等。通过本文的介绍,相信读者对 51 单片机之矩阵键盘有了更深入的了解,能够在自己的项目中灵活运用矩阵键盘,实现更加丰富和实用的功能。
如果你在学习和实践过程中遇到任何问题,欢迎留言交流,让我们一起探索 51 单片机的奇妙世界。