单片机外设矩阵键盘之行列扫描识别原理与示例

单片机外设矩阵键盘之行列扫描识别原理与示例

1.概述

这篇文章介绍单片机通过行列扫描的方式识别矩阵键盘的按键,通过程序执行相应的操作。

2.行列扫描识别原理

2.1.独立按键识别原理

为什么需要矩阵按键
独立按键操作简单,当数量较多时候会占用单片机的IO口,限制了按键的数量,无法满足需要更多按键的场景,因此矩阵键盘就应用而生了,他的按键数量多占用的IO口却很少。

为什么介绍独立按键
为什么不直接介绍矩阵按键而是先介绍独立按键工作原理那,这是因为矩阵键盘是独立按键数量的升级,矩阵键盘工作原理并没有改变,还是独立按键的工作原理。

一个独立按键工作原理

  • 当我们将按键接到单片机上,通过按键控制LED灯的亮灭。
  • -他的工作原理是将按键的一端接到单片机IO口,另一端接到GND端
  • 当按下按键,连接按键的IO口和GND导通,高电平变为低电平。
  • 当检测到IO口为低电平,就让LED灯点亮。
  • 松开按键IO口恢复高电平,就让LED灯灭。

多个独立按键工作原理
当我们掌握了一个独立按键控制LED灯的原理后,就可以将多个独立按键用一根导线并联并接到GND,按键另一端接到单片机的每个IO口,形成一列独立按键。

  • 定义每个接到单片机IO口上的按键名称
  • 当某个按键按下去的时候,对应的IO口引脚就会与GND导通,高电平变为低电平
  • 检测低电平的引脚对应的按键,然后通过程序逻辑作出对应操作。

在这里插入图片描述

2.2.独立按键升级矩阵按键

当一列独立按键不够用的时候,可以增加多列。但是单片机的IO口是有限的,因此不能介入更多的按键。这个时候就可以采用矩阵接线方式,连接多列独立按键形成行和列的矩阵键盘。

行列扫描工作原理
例如下图中是一个4X4矩阵键盘,KEYIN1~KEYIN4为行,KEYOUT1~KEYOUT4为列。

  • 第一列行扫描:如果我们将第一列接到GND,KEYIN1~KEYIN4行接到单片机的4个IO口上那么就是上面的多个独立按键组成一列独立按键场景,当按下某个按键时就会扫描第一列的1~4行按键的高低电平。
  • 第二列行扫描:将第二列接到GND,KEYIN1~KEYIN4行接到单片机的4个IO口上,当按下某个按键时就会扫描第二列的1~4行按键的高低电平。
  • 第三列行扫描:将第三列接到GND,KEYIN1~KEYIN4行接到单片机的4个IO口上,当按下某个按键时就会扫描第三列的1~4行按键的高低电平。
  • 第四列行扫描:将第三列接到GND,KEYIN1~KEYIN4行接到单片机的4个IO口上,当按下某个按键时就会扫描第四列的1~4行按键的高低电平。

在这里插入图片描述
行列扫描软件实现原理
了解了矩阵键盘的行列扫描工作原理后,就可以用程序实现行列扫描识别按键。

  • 第一列行扫描:将第一列KEYOUT1接到单片机引脚并设置为低电平,就可以模拟硬件电路接到GND,KEYIN1~KEYIN4行接到单片机的4个IO口上设置为高电平,当按下1号按键那么第一行就与第一列接通,第一行的高电平就变为低电平,这个时候就能识别出按下了1号按键
  • 第二列行扫描:将第二列KEYOUT2接到单片机引脚并设置为低电平,KEYIN1~KEYIN4行接到单片机的4个IO口上设置为高电平,当按下5号按键那么第一行就与第二列接通,第一行的高电平就变为低电平,这个时候就能识别出按下了5号按键
  • 第三列行扫描:将第三列KEYOUT3接到单片机引脚并设置为低电平,KEYIN1~KEYIN4行接到单片机的4个IO口上设置为高电平,当按下9号按键那么第一行就与第三列接通,第一行的高电平就变为低电平,这个时候就能识别出按下了9号按键
  • 第四列行扫描:将第四列KEYOUT4接到单片机引脚并设置为低电平,KEYIN1~KEYIN4行接到单片机的4个IO口上设置为高电平,当按下C号按键那么第一行就与第四列接通,第一行的高电平就变为低电平,这个时候就能识别出按下了C号按键

3.行列扫描实例

根据矩阵键盘的行列扫描原理用程序来实现识别按键,并作出对应的操作。

/*
程序名:行列扫描操作矩阵键盘   
编写人:bruce     
编写时间:2023年12月
硬件支持:STC12C2052AD系列  
接口说明:    
修改日志:  NO.1-								
*/#include <STC12C2052AD.H> //STC12Cx052或STC12Cx052AD系列单片机头文件
// 定义LED灯
sbit LED = P3^7;
// 定义行扫描按键
sbit KEYIN1 = P1^0;
sbit KEYIN2 = P1^1;
sbit KEYIN3 = P1^2;
sbit KEYIN4 = P1^3;//定义列扫描按键
sbit KEYOUT1 = P1^4;
sbit KEYOUT2 = P1^5;
sbit KEYOUT3 = P1^6;
sbit KEYOUT4 = P1^7;/*
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
*/
void DELAY_MS (unsigned int a){unsigned int i;while( a-- != 0){for(i = 0; i < 600; i++);}
}/*
作用:行列扫描方式识别矩阵键盘按键
参数:返回识别到的按键
返回:
*/
unsigned char keyScan(){unsigned char keyNum;/*扫描第一列行上面的按键*/KEYIN1,KEYIN2,KEYIN3,KEYIN4 = 1;KEYOUT2,KEYOUT3,KEYOUT4 = 1;// 第一列设置为低电平KEYOUT1 = 0;if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4 ){DELAY_MS(20);if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4){if(!KEYIN1){keyNum = 1;}if(!KEYIN2){keyNum = 2;}if(!KEYIN3){keyNum = 3;}if(!KEYIN4){keyNum = 4;}}//等待按键松开while(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4);}/*扫描第二列行上面的按键*/KEYIN1,KEYIN2,KEYIN3,KEYIN4 = 1;KEYOUT1,KEYOUT3,KEYOUT4 = 1;// 第二列设置为低电平KEYOUT2 = 0;if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4 ){DELAY_MS(20);if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4){if(!KEYIN1){keyNum = 5;}if(!KEYIN2){keyNum = 6;}if(!KEYIN3){keyNum = 7;}if(!KEYIN4){keyNum = 8;}}//等待按键松开while(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4);}/*扫描第三列行上面的按键*/KEYIN1,KEYIN2,KEYIN3,KEYIN4 = 1;KEYOUT1,KEYOUT2,KEYOUT4 = 1;// 第三列设置为低电平KEYOUT3 = 0;if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4 ){DELAY_MS(20);if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4){if(!KEYIN1){keyNum = 9;}if(!KEYIN2){keyNum = 10;}if(!KEYIN3){keyNum = 11;}if(!KEYIN4){keyNum = 12;}}//等待按键松开while(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4);}/*扫描第四列行上面的按键*/KEYIN1,KEYIN2,KEYIN3,KEYIN4 = 1;KEYOUT1,KEYOUT2,KEYOUT3 = 1;// 第四列设置为低电平KEYOUT4 = 0;if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4 ){DELAY_MS(20);if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4){if(!KEYIN1){keyNum = 13;}if(!KEYIN2){keyNum = 14;}if(!KEYIN3){keyNum = 15;}if(!KEYIN4){keyNum = 16;}}//等待按键松开while(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4);}return keyNum;}void main(){while(1){switch(keyScan()){case 1:LED = 0;break;case 2:LED = 1;break;default:LED =1;}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/588224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PAT 乙级 1033 旧键盘打字

旧键盘上坏了几个键&#xff0c;于是在敲一段文字的时候&#xff0c;对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键&#xff0c;打出的结果文字会是怎样&#xff1f; 输入格式&#xff1a; 输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其…

机器视觉实战应用:手势、人脸、动作以及手势鼠标构建(一)

CV实战应用手势、人脸、动作以及手势鼠标构建&#xff08;一&#xff09;总起 核心思想 手势识别是一种常见的计算机视觉应用&#xff0c;它可以通过摄像头或者预先录制的视频图像来追踪和识别人类手势。手势识别的应用非常广泛&#xff0c;例如在游戏、虚拟现实、人机交互等…

【算法】数论---欧拉函数

什么是欧拉函数&#xff1f; 对于正整数n&#xff0c;欧拉函数是小于或等于n的正整数中与n互质的数的数目&#xff0c;记作φ(n) φ(1)1 当m,n互质时&#xff0c;φ(mn)φ(m)∗φ(n) 一、求一个正整数的欧拉函数---&#xff08;先对它分解质因数&#xff0c;然后套公式&#xf…

2024年,程序员有哪些危机,有什么应对方式?

在2024年&#xff0c;程序员可能面临的危机主要包括技术更新迅速、职业竞争激烈、工作与生活平衡困难等方面。 为了应对这些危机&#xff0c;程序员可以采取以下策略&#xff1a; 技术更新迅速&#xff1a;随着技术的不断发展&#xff0c;新的编程语言和工具不断涌现&#xff…

spring核心与思想

spring核心与思想 Spring 是什么&#xff1f;什么是容器&#xff1f;什么是 IoC&#xff1f;传统程序开发传统程序开发的缺陷解决传统开发中的缺陷控制反转式程序开发对⽐总结规律 理解 Spring IoCDI 概念说明 Spring 是什么&#xff1f; Spring 指的是 Spring Framework&…

Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性

目录 1. 背景 2. Windows系统安装canal 3.Mysql准备工作 4. 公共依赖包 5. Redis缓存设计 6. mall-canal-service 1. 背景 canal [kənl] &#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费。其诞…

C语言实验5:结构体

目录 一、实验要求 二、实验原理 1. 普通结构体 1.1 显示声明结构体变量 1.2 直接声明结构体变量 ​编辑 1.3 typedef在结构体中的作用 2. 结构体的嵌套 3. 结构体数组 4. 指向结构体的指针 4.1 静态分配 4.2 动态分配 三、实验内容 1. 学生数据库 代码 截图 …

vue 项目 添加 页面上方 NProgress进度条

NProgress官网和Github地址 路由 跳转时 页面上方 和 右上角 会有一个加载进度 安装 使用npm安装 npm install --save nprogress 基本用法 main.js 引入 import NProgress from “nprogress”; import “nprogress/nprogress.css”; 开关和关闭 start()开启NProgress进度条d…

基于Ubuntu环境Git服务器搭建及使用

基于Ubuntu环境Git服务器搭建及使用 Chapter1 搭建本地git服务器及详细操作步骤1.搭建本地git服务器1.1 环境1.2 服务端配置1.3 创建git专属用户1.4 创建git仓库1.5 配置免密登录基础 2.客户端拉取推送代码2.1客户端创建ssh公钥 2.2 免密配置3.仓库使用&#xff08;拉取及推送代…

【linux】tail的基本使用

在linux可以用find查找一个文件&#xff0c;可以用grep查找符合要求的文件内容&#xff0c;但是有的时候希望查看文件的前几行或者后几行&#xff08;其实这种场景经常可以遇到&#xff0c;比如接触到日志分析的时候&#xff09;&#xff0c;那就应该使用head和tail这两个工具了…

如何使用ModuleShifting测试Module Stomping和Module Overloading注入技术

关于ModuleShifting ModuleShifting是一款针对Module Stomping和Module Overloading注入技术的安全测试工具&#xff0c;该工具基于Python ctypes实现其功能&#xff0c;因此可以通过Python解释器或Pyramid在内存中完整执行&#xff0c;这样就可以避免使用编译加载器了。 需要…

大语言模型(LLM)训练平台与工具

LLM 是利用深度学习和大数据训练的人工智能系统&#xff0c;专门 设计来理解、生成和回应自然语言。 大模型训练平台和工具提供了强大且灵活的基础设施&#xff0c;使得开发和训练复杂的语言模型变得可行且高效。 平台和工具提供了先进的算法、预训练模型和优化技术&#xff0c…

HarmonyOS 组件通用属性之通用事件 文档参数讲解(点击事件)

我们组件中 会有很多通用的信息和方法 那么 首先 我们看通用事件 通用事件中 最常用的就是我们的点击事件 比如说 我们之前常写的 组件.onClick(()>{//事件逻辑 })但是 我们之前 都没有用它接参数 我们可以这样 Button("跳转").onClick((ewat: ClickEvent)>…

边界判断缺失

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

2023年03月20日_对李开复3月20日线下媒体会的解读

最近这个AI大模型 因为GPT4.0 ChatGPT 文心一言等等这些事情呢 一下子就被推到了风口浪尖 我们也做了来介绍相关的进展 国内呢也不断有一些大佬开始下场 包括王慧文、张朝阳、李彦宏什么的 都开始说自己要搞AI大模型 就在昨天呢 创新工厂的董事长兼CEO李开复 也发朋友…

2024年:三大壁炉趋势

2024年的壁炉趋势是环保的、现代的和100%安全的&#xff0c;作为装饰性壁炉已经比取暖的壁炉更加受欢迎。现今&#xff0c;作为装饰性观赏的壁炉与为了加热取暖而开发的燃木壁炉、燃气壁炉之间存在明显区别。尽管加热取暖的壁炉在农村很有意义&#xff0c;但是装饰性壁炉在城市…

手拉手Springboot获取yml配置文件信息

环境介绍 技术栈 springboot3 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 17 Spring Boot 3.1.7 配置文件说明&#xff1a;启动配置文件优先级&#xff1a;properties高于yml 配置文件application.yml yml是 JSON 的超集&#xff0c;简洁而强大&#xf…

HTML标签基础入门

HTML 基本语法概述标签关系HTML基础结构HTML常用标签标题标签示例 段落和换行标签示例 文本格式化标签示例 div和span标签示例 图像标签和路径示例 超链接标签示例 注释 ctrl/特殊字符示例 表格标签 表头单元格标签表格属性示例 合并单元格示例 列表标签无序列表有序列表自定义…

介绍几种mfc140u.dll丢失的解决方法,找不到msvcp140.dll要怎么处理

如果你在使用电脑时遇到mfc140u.dll丢失错误时&#xff0c;这可能会导致程序无法正常运行&#xff0c;但是大家不必过于担心。今天的这篇文章本将为你介绍几种mfc140u.dll丢失的解决方法&#xff0c;找不到msvcp140.dll要怎么处理的一些解决方法。 一.mfc140u.dll文件缺失会有什…

数据结构【线性表篇】(一)

数据结构【线性表篇】(一&#xff09; 文章目录 数据结构【线性表篇】(一&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f; 目录一、顺序表(一)、顺序表的定义(二)、顺序表的插入删除(三)、顺序表的查找 二、完整代码(一)、顺序表的…