一、矩阵键盘简介

矩阵键盘,也称矩阵按键,是为了节约单片机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连线,有以下特征:

  1. P17~P14这四个IO口连接了每一矩阵键盘
  2. P13~P10这四个IO口连接了每一矩阵键盘

矩阵键盘扫描共有两种扫描方式:

  • 逐行扫描
  • 逐列扫描

先分析逐行扫描,根据键盘被按下时,IO口为低电平这个特性。我们可以这样检测第一行:

  1. 给除第一行之外的其他行给高电平,防止其影响我们接下来的低电平检测
  2. 给第一行送低电平0
  3. 依次检测每一列的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.总代码

#include <REGX52.H>
#include <math.h>#define uchar unsigned char
#define uint unsigned int
#define led P0sbit 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);
}

四、课后作业(矩阵键盘计算器)

题目:请你利用矩阵按键和数码管来设计一个计算器,能够实现简单的四则整数运算和清零操作

51单片机矩阵键盘扫描及使用方法相关推荐

  1. 一个51单片机的键盘扫描程序,算法简单有效

    一个51单片机的键盘扫描程序,算法简单有效 发一个51单片机的键盘扫描程序,算法简单有效                                        再给大家分享一个不错按键程序(来 ...

  2. 51单片机矩阵键盘——数码管显示

    1.前言 当我们熟悉了数码管的位选与段选,并了解的矩阵键盘的扫描之后就可以编写程序了. 1.1实验现象 按下矩阵键盘S1并松开,数码管第一位(LED8)显示0:按下矩阵键盘S2并松开,数码管第一位显示 ...

  3. 51单片机矩阵键盘——LCD1602显示

    1.前言 本次的实验需要用到LCD1602液晶屏,需要用到LCD1602.c 与LCD1602.h文件链接: https://download.csdn.net/download/YLG_lin/86 ...

  4. 51单片机矩阵键盘的控制原理-扫描及使用方式

    矩阵键盘 矩阵键盘一般和之前学的LCD1602液晶屏一起控制,建议先看一下之前的博客学习一下液晶屏的使用. 当然矩阵键盘也可以和数码管和LED等一起操作,但是数码管需要扫描,很费CPU,LED又不能直 ...

  5. c51单片机矩阵键盘1602计算器_基于51单片机矩阵键盘的简易计算器制作

    1. 运算过程.符号公式实时显示在显示屏上(I2C 1602). 2. 自带三角函数.开根号.平方运算. 3. 计算得出的结果可设置保存并用以下一次计算. 4. 所有运算结果精确到至少小数点后两位. ...

  6. 51单片机矩阵键盘C程序

    飞哥语录:别高估关系,别低估人心. 主程序1: void main() {uchar i,j,ki=0;j=0;while(1){i=key();//键盘循环扫描,其值赋给变量数组tableif(i! ...

  7. c51单片机矩阵键盘1602计算器_51单片机矩阵键盘计算器.doc

    51单片机矩阵键盘计算器 51单片机矩阵键盘计算器 /**********413暑假作品*********12864液晶显示屏,结合4*4矩阵键盘,简易计算器*,存储地址:STC-hex2 , LCD ...

  8. 51单片机4x4矩阵键盘扫描+数码管显示

    51单片机4x4矩阵键盘扫描+数码管显示 个位闪烁感在这篇文章已经修复<51单片机4x4矩阵键盘扫描+数码管显示(二)(修bug篇)> 材料:AT89C52.2位数码管.74HC595. ...

  9. 矩阵键盘扫描原理详解——单片机

    矩阵键盘扫描原理详解 根据原理图 键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线.一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键 ...

最新文章

  1. ❤️手撕这十道HiveSQL题还不能吊打面试官,却能保你不被吊打❤️【推荐收藏】
  2. ps用法linux,在linux上使用ps(转载)
  3. 使用beanutil简化request值的接收
  4. VC/MFC分割字符串(SplitString)返回CStringArray
  5. 【效率】如何有效提问
  6. mapreduce编程实例python-使用Python实现Hadoop MapReduce程序
  7. JDK5.0新特性--可变参数
  8. mysql or优化_MySQL 语句优化
  9. 3.js模式-策略模式
  10. 对象数组根据某属性列的灵活排序
  11. OpenCV:概述、结构和内容
  12. 20145237 Exp2 后门原理与实践
  13. 拓端tecdat|Python贝叶斯推断Metropolis-Hastings(M-H)MCMC采样算法的实现
  14. 基于Django的网上书城系统
  15. 【VUE】如何关闭代码规范extra semicolon
  16. 我奋斗了18年还是不能和你坐在一起喝咖啡
  17. 解决github无法clone
  18. 运行时设置数据库连接字符串
  19. 传智博客 JavaWeb方面的所有知识 听课记录 经典
  20. HNOI 2015 【亚瑟王】

热门文章

  1. 如何使用TestFlight进行app测试
  2. 兴业银行电子账单读取
  3. 加油站的良好出发点问题
  4. 学计算机应该从那方面入手,想学电脑应该从哪入手 电脑并不神秘先消除紧张感...
  5. Python与或运算
  6. Jupyter安装和启动与使用
  7. 说说如何实现可扩展性的大型网站架构
  8. QT 操作 sqlite数据库(二)----问题与其解决方案
  9. UVa 297 - Quadtrees 四叉树, 及其在编码图像的应用
  10. 应届毕业生落户深圳的步骤