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

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

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://xiahunao.cn/news/2659250.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Talk | ACM MM 2023最佳论文,CATR:基于组合依赖和音频查询的视频分割模型

本期为TechBeat人工智能社区第558期线上Talk。 北京时间12月27日(周三)20:00&#xff0c;浙江大学博士生—李可欣的Talk已准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “CATR-基于组合依赖和音频查询的视频分割模型”&#xff0c;介绍了她的团队在基于组…

BDTC2023:CloudberryDB开源创新与实践

中国大数据技术大会&#xff08;BDTC&#xff09;由中国计算机学会&#xff08;CCF&#xff09;创立于2008年&#xff0c;已经成为国内外极具行业实践的专业大数据交流平台。12月22日-24日&#xff0c;第十七届中国大数据技术大会&#xff08;BDTC 2023&#xff09;在广州举行。…

【map】【滑动窗口】【优先队列】LeetCode480滑动窗口中位数

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口 map 优先队列 题目 中位数是有序序列最中间的那个数。如果序列的长度是偶数&#xff0c;则没有最中间的数&#xff1b;此时中位数是最中间的两个数的平均数。 例如&#xf…

【日常聊聊】编程语言的未来:趋势、多样性、人工智能融合、教育与生态系统

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 1. 编程语言的发展趋势 1.1 新语言和编程范式的涌现 1.2 影响和挑战 2. 编程语言的多样性 2.1 互操作性和可移…

8.小明和完美序列

题目 import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();sc.nextLine();Map<Integer,Intege…

为什么企业需要客户crm系统?

客户CRM提供数据储存&#xff0c;数据调配&#xff0c;数据分析。让传统的人工操作&#xff0c;让系统去完成。企业只需要提供原始数据就行了。举几个栗子&#xff1a; 1、客户资料的集中管理&#xff1a;可以集中存储和管理客户信息&#xff0c;包括联系方式、工商信息&#…

Jupyter Notebook 开启远程登录

Jupyter Notebook可以说是非常好用的小工具&#xff0c;但是不经过配置只能够在本机访问 安装jupyter notebook conda install jupyter notebook 生成默认配置文件 jupyter notebook --generate-config 将会在用户主目录下生成.jupyter文件夹&#xff0c;其中jupyter_noteb…

使用骨传导耳机的危害有哪些?使用骨传导会损伤听力吗?

长时间不正确的使用骨传导耳机可能会出现以下危害&#xff1a; 听力下降&#xff1a;骨传导耳机通常是佩戴在头部的&#xff0c;通过对头部的振动产生声波&#xff0c;能够减轻对耳道部位的损伤。但是佩戴骨传导耳机时需要和头部紧密相贴&#xff0c;有可能会引起头部出现不适…

《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(12)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识&#xff08;11&#xff09; 1.3 PCI总线的存储器读写总线事务 1.3.3 HOST处理器访问PCI设备 HOST处理器对PCI设备的数据访问主要包含两方面内容&#xff1a;一方面是处理器向PCI…

数据结构学习 Leetcode474 一和零

关键词&#xff1a;动态规划 01背包 一个套路&#xff1a; 01背包&#xff1a;空间优化之后dp【target1】&#xff0c;遍历的时候要逆序遍历完全背包&#xff1a;空间优化之后dp【target1】&#xff0c;遍历的时候要正序遍历 目录 题目&#xff1a; 思路&#xff1a; 复杂…

Flink项目实战篇 基于Flink的城市交通监控平台(上)

系列文章目录 Flink项目实战篇 基于Flink的城市交通监控平台&#xff08;上&#xff09; Flink项目实战篇 基于Flink的城市交通监控平台&#xff08;下&#xff09; 文章目录 系列文章目录1. 项目整体介绍1.1 项目架构1.2 项目数据流1.3 项目主要模块 2. 项目数据字典2.1 卡口…

【OpenAI Q* 超越人类的自主系统】DQN :Q-Learning + 深度神经网络

深度 Q 网络&#xff1a;用深度神经网络&#xff0c;来近似Q函数 强化学习介绍离散场景&#xff0c;使用行为价值方法连续场景&#xff0c;使用概率分布方法实时反馈连续场景&#xff1a;使用概率分布 行为价值方法 DQN&#xff08;深度 Q 网络&#xff09; 深度神经网络 Q-L…

【自然语言处理】第3部分:识别文本中的个人身份信息

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

复盘打码功能

最近工作中&#xff0c;需求方提出了一个打印条码的功能&#xff0c;需要将指定样本及其关联实验单的编号全部打印出来。 后端会把我需要的打码入参返回给我&#xff0c;前端需要做的是&#xff1a;引入厂家提供的js文件&#xff0c;调用提供的js方法初始化打印机&#xff0c;从…

k8s二进制部署--部署高可用

连接上文 notready是因为没有网络&#xff0c;因此无法创建pod k8s的CNI网络插件模式 1.pod内部&#xff0c;容器与容器之间的通信。 在同一个pod中的容器共享资源和网络&#xff0c;使用同一个网络命名空间。 2.同一个node节点之内&#xff0c;不同pod之间的通信。 每个pod都…

通过Python将PDF转为文本,快速提取PDF中的文字

快速高效地从PDF文档中提取信息对于专业人士来说非常重要。处理大量PDF文件时&#xff0c;将PDF转换为可编辑的文本格式可以节省时间和精力。而强大的Python语言正是在这些方面发挥其作用。利用Python中丰富的API&#xff0c;我们可以轻松在Python程序中将PDF转换为文本&#x…

通过Vue自定义指令实现前端埋点

在营销活动中&#xff0c;通过埋点可以获取用户的喜好及交互习惯&#xff0c;从而优化流程&#xff0c;进一步提升用户体验&#xff0c;提高转化率。 在之前的埋点方案实现中&#xff0c;都是在具体的按钮或者图片被点击或者被曝光时主动通过事件去上报埋点。这种方法在项目中…

2022年全国职业院校技能大赛高职组云计算正式赛卷第三场-公有云

2022 年全国职业院校技能大赛高职组云计算赛项试卷 【赛程名称】云计算赛项第三场-公有云 目录 2022 年全国职业院校技能大赛高职组云计算赛项试卷 【赛程名称】云计算赛项第三场-公有云 【任务 1】公有云服务搭建[10 分] 【任务 2】公有云服务运维[10 分] 【任务 3】公有云运维…

[SWPUCTF 2021 新生赛]finalrce

[SWPUCTF 2021 新生赛]finalrce wp 注&#xff1a;本文参考了 NSSCTF Leaderchen 师傅的题解&#xff0c;并修补了其中些许不足。 此外&#xff0c;参考了 命令执行(RCE)面对各种过滤&#xff0c;骚姿势绕过总结 题目代码&#xff1a; <?php highlight_file(__FILE__); …

微软发布安卓版Copilot,可免费使用GPT-4、DALL-E 3

12月27日&#xff0c;微软的Copilot助手&#xff0c;可在谷歌应用商店下载。目前&#xff0c;只有安卓版&#xff0c;ios还无法使用。 Copilot是一款类ChatGPT助手支持中文&#xff0c;可生成文本/代码/图片、分析图片、总结内容等&#xff0c;二者的功能几乎没太大差别。 值…