一、矩阵键盘简介
矩阵键盘,也称矩阵按键,是为了节约单片机IO口占用所引入的一种外设。
(图片截取至普中A2开发板原理图)
(图片截取至普中A2开发板实物图)
我们知道,一个独立按键需要1个IO口。但是如果我们需要大量的按键,则需要大量的IO口,但是单片机现有的IO口并不能很好的满足,所以引入矩阵键盘。
二、矩阵键盘扫描原理
从独立按键到矩阵按键
1.独立按键回顾
上图的矩阵键盘共16个按键(4行×4列),先回到原来的一个独立按键分析。
首先分析独立按键的原理图连接方式(如上图),以按键K1为例,按键K1一端连接到单片机的P3.1口,另一端接地(GND)。当按键K1被按下时,GND直接就连到P3.1。所以当K1被按下时,P3.1口为低电平。我们只需要判断P3.1口是否为低电平,即可判断K1是否被按下。
2.矩阵按键扫描思路
先分析矩阵按键的IO连线,有以下特征:
- P17~P14这四个IO口连接了每一行矩阵键盘
- P13~P10这四个IO口连接了每一列矩阵键盘
矩阵键盘扫描共有两种扫描方式:
- 逐行扫描
- 逐列扫描
先分析逐行扫描,根据键盘被按下时,IO口为低电平这个特性。我们可以这样检测第一行:
- 给除第一行之外的其他行给高电平,防止其影响我们接下来的低电平检测
- 给第一行送低电平0
- 依次检测每一列的IO口电平(P13~P10),当出现低电平时,说明第一行的这一列的这个按键就被按下。
结合下图很好理解:
要检测第一行,给其他行赋值高电平。假设S2被按下了,那么P17的低电平会顺着绿色路线通到S2的另一端IO口(P12),只要检测出P12为低电平,那么就可以得出结论:K2被按下
按照这个思路,继续依次检测其他行即可。
总结:
按行扫描 给第1到第4行要扫描的行置0,其余行置1。然后对每一列进行读取,读出低电平的列则可以判断该行该列的按键被按下。
IO口电平(P17~P14:每行对应IO的口) | 检测的行 | 若第K列IO口测出低电平 |
0 1 1 1 | 一 | 第一行第K列被按下 |
1 0 1 1 |
二 | 第二行第K列被按下 |
1 1 0 1 | 三 | 第三行第K列被按下 |
1 1 1 0 | 四 | 第四行第K列被按下 |
按列扫描的结果类似:
IO口电平(P13~P10:每行对应IO的口) | 检测的列 | 若第K行IO口测出低电平 |
0 1 1 1 | 一 | 第K行第一列被按下 |
1 0 1 1 |
二 | 第K行第二列被按下 |
1 1 0 1 | 三 | 第K行第三列被按下 |
1 1 1 0 | 四 | 第K行第四列被按下 |
三、编程验证
1、先给出一些引脚定义
#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
#define led P0
//IO口位选
sbit wei1=P2^2;
sbit wei2=P2^3;
sbit wei3=P2^4;
//定义行引脚
sbit hang1=P1^7;
sbit hang2=P1^6;
sbit hang3=P1^5;
sbit hang4=P1^4;
//定义列引脚
sbit lie1=P1^3;
sbit lie2=P1^2;
sbit lie3=P1^1;
sbit lie4=P1^0;
2、按行扫描代码:
//扫描第一行的各列
P1|=0xff;//IO口全部初始化为高电平
hang1=0;//第一行设置为低电平
if(lie1==0)//检测第一列是否为低电平(按键是否被按下)
{
Delay10ms();//延时消抖
if(lie1==0)
{
while(lie1==0);
key=1;//确认被按下,保存键值
}
}
//下面依次扫描第二、三和第四列,方法类似
if(lie2==0)
{
Delay10ms();
if(lie2==0)
{
while(lie2==0);
key=2;
}
}
if(lie3==0)
{
Delay10ms();
if(lie3==0)
{
while(lie3==0);
key=3;
}
}
if(lie4==0)
{
Delay10ms();
if(lie4==0)
{
while(lie4==0);
key=4;
}
}
第二行,第三行、第四行扫描的方法类似
只需把 if 判断改成对应的行,键值改为对应的键值即可
3.总代码文章来源:https://www.toymoban.com/news/detail-782579.html
#include <REGX52.H>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define led P0
sbit wei1=P2^2;
sbit wei2=P2^3;
sbit wei3=P2^4;
sbit hang1=P1^7;
sbit hang2=P1^6;
sbit hang3=P1^5;
sbit hang4=P1^4;
sbit lie1=P1^3;
sbit lie2=P1^2;
sbit lie3=P1^1;
sbit lie4=P1^0;
void play(int a);
void Delay10ms();
int scan();
uchar code smg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
int key=0;
int x;
void main()
{
while(1)
{
play(scan());
}
}
void play(int a)
{
x=a;
wei1=0;
wei2=0;
wei3=0;
led=smg[x];
Delay10ms();
}
int scan()
{
P1|=0xff;
hang1=0;
if(lie1==0)
{
Delay10ms();
if(lie1==0)
{
while(lie1==0);
key=1;
}
}
if(lie2==0)
{
Delay10ms();
if(lie2==0)
{
while(lie2==0);
key=2;
}
}
if(lie3==0)
{
Delay10ms();
if(lie3==0)
{
while(lie3==0);
key=3;
}
}
if(lie4==0)
{
Delay10ms();
if(lie4==0)
{
while(lie4==0);
key=4;
}
}
P1|=0xff;
hang2=0;
if(lie1==0)
{
Delay10ms();
if(lie1==0)
{
while(lie1==0);
key=5;
}
}
if(lie2==0)
{
Delay10ms();
if(lie2==0)
{
while(lie2==0);
key=6;
}
}
if(lie3==0)
{
Delay10ms();
if(lie3==0)
{
while(lie3==0);
key=7;
}
}
if(lie4==0)
{
Delay10ms();
if(lie4==0)
{
while(lie4==0);
key=8;
}
}
P1|=0xff;
hang3=0;
if(lie1==0)
{
Delay10ms();
if(lie1==0)
{
while(lie1==0);
key=9;
}
}
if(lie2==0)
{
Delay10ms();
if(lie2==0)
{
while(lie2==0);
key=10;
}
}
if(lie3==0)
{
Delay10ms();
if(lie3==0)
{
while(lie3==0);
key=11;
}
}
if(lie4==0)
{
Delay10ms();
if(lie4==0)
{
while(lie4==0);
key=12;
}
}
P1|=0xff;
hang4=0;
if(lie1==0)
{
Delay10ms();
if(lie1==0)
{
while(lie1==0);
key=13;
}
}
if(lie2==0)
{
Delay10ms();
if(lie2==0)
{
while(lie2==0);
key=14;
}
}
if(lie3==0)
{
Delay10ms();
if(lie3==0)
{
while(lie3==0);
key=15;
}
}
if(lie4==0)
{
Delay10ms();
if(lie4==0)
{
while(lie4==0);
key=0;
}
}
return key;
}
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 18;
j = 235;
do
{
while (--j);
} while (--i);
}
四、课后作业(矩阵键盘计算器)
题目:请你利用矩阵按键和数码管来设计一个计算器,能够实现简单的四则整数运算和清零操作文章来源地址https://www.toymoban.com/news/detail-782579.html
到了这里,关于51单片机矩阵键盘扫描及使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!