矩阵键盘
开篇
此前,我们用 STC89C52RC 单片机点亮 LED,领略其魅力。现在,一起聚焦矩阵键盘,探索它与单片机的交互奥秘。
学习材料清单
要实现矩阵键盘的功能,我们需要准备以下软硬件:
硬件:普中单片机开发板(带有矩阵键盘模块)、USB 数据线(用于供电和编程)。
软件:Keil uVision5(用于编写和编译代码)、stc - isp(用于将程序下载到单片机) 。
1.矩阵键盘工作原理
矩阵键盘是一种将多个按键按照行列形式排列的键盘结构。(如图1中红色框内)
图1
相比于独立按键,它的优势在于能够利用较少的 I/O 端口连接更多的按键。想象一下,如果使用独立按键,每一个按键都需要占用一个 I/O 端口,那么当按键数量较多时,单片机的 I/O 端口很快就会不够用。而矩阵键盘通过行列扫描的方式,大大节省了 I/O 端口资源。
图2
如图2为普中单片机矩阵键盘的原理图,是最常见的 4×4 矩阵键盘为例,它一共有 16 个按键。我们把键盘的行线和列线分别连接到单片机的不同 I/O 端口。(行线对应P14-P17,列线对应P10-P13)
在扫描时,单片机先将某一行线置为低电平,其余行线置为高电平,然后读取列线的电平状态。如果某一列线的电平变为低电平,就说明在这一行和这一列交叉处的按键被按下了。比如,当第一行线置为低电平,检测到第三列线为低电平时,就可以判断出第一行第三列的按键被按下。通过依次扫描每一行和每一列,就能准确识别出被按下的按键。
2.编程操控矩阵键盘
(1)创建一个工程
如果还不会创建工程的请回顾“单片机第一课”。
(2)编写代码
理解了矩阵键盘的原理,可根据电路图可以写出扫描按键的代码。
(此处的#include "Delay.H"是因为用了模块化编程,大家可以直接在main.c中写,直接写在main.c中的话则不需要写.h文件)
MatrixKey.c函数
#include <REGX52.H>
#include "Delay.H"
unsigned char MatrixKey()
{
// 用于存储按键编号,初始值 0 表示无按键按下
unsigned char KeyNumber=0;
//第一行扫描
//将 P1 端口初始化为高电平
P1=0xFF;
P1_3=0;
if(P1_7==0) {Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}//加Delay的目的是防止抖动
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
/*********************************
以下为模块化的基本形式
#ifndef __函数名称_H_
#define __函数名称_H_
//在.c函数中创立的函数需在.h文件中声明
unsigned char MatrixKey();
#endif
*********************************/
Delay.c函数
void Delay(int x)
{
unsigned char data i, j;
while(x)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
x--;
}
}
Delay.h函数
#ifndef __DELAy_H__
#define __DELAY_H__
void Delay(int x);
#endif
main.c函数
#include <REGX52.H>
#include "Delay.H"//延时函数
#include "MatrixKey.H"//矩阵键盘
void main()
{
// 存储矩阵键盘返回的按键编号
unsigned char KeyValue;
//无限循环,持续检测按键
while(1)
{
// 调用 MatrixKey 函数获取当前按键编号
KeyValue=MatrixKey();
if(KeyValue != 0)
{
//若按下的是 1号键
if(KeyValue == 1)
{
//点亮连接到 P2.0 的 LED,P2 端口除 P2.0 外其余位为高电平
p2 = 0xFE;
}
}
}
}
此段代码的效果是按下1号键P2.0的LED就会亮。
学完矩阵按键,就让我们做一给小项目复习一下吧!项目要求为:将矩阵按键与LED联动,矩阵按键编号1~16,但对应的按键按下时,LED显示出对应的二进制状态。(如按键按键6时,LED的状态为0000 0110)效果如下。
可以参考一下其他同学的代码呀~
总结
每一次对单片机的探索,都是一次自我成长的旅程;每一个新技能的掌握,都是向技术高峰迈进的坚实一步。希望各位在今后的学习道路上,能够始终秉持探索精神,深入挖掘单片机的无限潜力,创造出更多既有趣又实用的精彩项目!
若文章有出现纰漏还请大佬指正
作者:nck