51单片机矩阵键盘扫描及使用方法
一、矩阵键盘简介
矩阵键盘,也称矩阵按键,是为了节约单片机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.总代码
#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单片机矩阵键盘扫描及使用方法相关推荐
- 一个51单片机的键盘扫描程序,算法简单有效
一个51单片机的键盘扫描程序,算法简单有效 发一个51单片机的键盘扫描程序,算法简单有效 再给大家分享一个不错按键程序(来 ...
- 51单片机矩阵键盘——数码管显示
1.前言 当我们熟悉了数码管的位选与段选,并了解的矩阵键盘的扫描之后就可以编写程序了. 1.1实验现象 按下矩阵键盘S1并松开,数码管第一位(LED8)显示0:按下矩阵键盘S2并松开,数码管第一位显示 ...
- 51单片机矩阵键盘——LCD1602显示
1.前言 本次的实验需要用到LCD1602液晶屏,需要用到LCD1602.c 与LCD1602.h文件链接: https://download.csdn.net/download/YLG_lin/86 ...
- 51单片机矩阵键盘的控制原理-扫描及使用方式
矩阵键盘 矩阵键盘一般和之前学的LCD1602液晶屏一起控制,建议先看一下之前的博客学习一下液晶屏的使用. 当然矩阵键盘也可以和数码管和LED等一起操作,但是数码管需要扫描,很费CPU,LED又不能直 ...
- c51单片机矩阵键盘1602计算器_基于51单片机矩阵键盘的简易计算器制作
1. 运算过程.符号公式实时显示在显示屏上(I2C 1602). 2. 自带三角函数.开根号.平方运算. 3. 计算得出的结果可设置保存并用以下一次计算. 4. 所有运算结果精确到至少小数点后两位. ...
- 51单片机矩阵键盘C程序
飞哥语录:别高估关系,别低估人心. 主程序1: void main() {uchar i,j,ki=0;j=0;while(1){i=key();//键盘循环扫描,其值赋给变量数组tableif(i! ...
- c51单片机矩阵键盘1602计算器_51单片机矩阵键盘计算器.doc
51单片机矩阵键盘计算器 51单片机矩阵键盘计算器 /**********413暑假作品*********12864液晶显示屏,结合4*4矩阵键盘,简易计算器*,存储地址:STC-hex2 , LCD ...
- 51单片机4x4矩阵键盘扫描+数码管显示
51单片机4x4矩阵键盘扫描+数码管显示 个位闪烁感在这篇文章已经修复<51单片机4x4矩阵键盘扫描+数码管显示(二)(修bug篇)> 材料:AT89C52.2位数码管.74HC595. ...
- 矩阵键盘扫描原理详解——单片机
矩阵键盘扫描原理详解 根据原理图 键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线.一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键 ...
最新文章
- ❤️手撕这十道HiveSQL题还不能吊打面试官,却能保你不被吊打❤️【推荐收藏】
- ps用法linux,在linux上使用ps(转载)
- 使用beanutil简化request值的接收
- VC/MFC分割字符串(SplitString)返回CStringArray
- 【效率】如何有效提问
- mapreduce编程实例python-使用Python实现Hadoop MapReduce程序
- JDK5.0新特性--可变参数
- mysql or优化_MySQL 语句优化
- 3.js模式-策略模式
- 对象数组根据某属性列的灵活排序
- OpenCV:概述、结构和内容
- 20145237 Exp2 后门原理与实践
- 拓端tecdat|Python贝叶斯推断Metropolis-Hastings(M-H)MCMC采样算法的实现
- 基于Django的网上书城系统
- 【VUE】如何关闭代码规范extra semicolon
- 我奋斗了18年还是不能和你坐在一起喝咖啡
- 解决github无法clone
- 运行时设置数据库连接字符串
- 传智博客 JavaWeb方面的所有知识 听课记录 经典
- HNOI 2015 【亚瑟王】