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

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

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.rhkb.cn/news/227958.html

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

相关文章

“C语言与人生:手把手教你玩转C语言数组,从此编程无难题“

各位少年&#xff0c;我是博主那一脸阳光&#xff0c;由我来给大家介绍C语言的数组的详解。 在C语言中&#xff0c;数组是一种极其重要的数据结构&#xff0c;它允许我们存储和管理相同类型的一系列相关数据。通过理解并熟练掌握数组的使用&#xff0c;开发者能够高效地处理大量…

Java(算术,自增自减,赋值,关系,逻辑,三元)运算符,运算符的优先级,隐式转换,强制转换,字符串的+。

文章目录 1.运算符和表达式运算符&#xff1a;表达式&#xff1a; 2.算术运算符练习&#xff1a;数值拆分 3.隐式转换概念&#xff1a;简单记忆&#xff1a;两种提升规则&#xff1a;取值范围从小到大的关系&#xff1a; 4.隐式转换的练习案例一&#xff1a;案例二&#xff1a;…

啊哈c语言——4.10(练习)

1&#xff0e;请尝试用for循环打印下面的图形。 #include <stdio.h> #include <stdlib.h> int main() {int a,b,c,d,e;for(a 1;a < 10;a){if(a < 5){b a * 2 - 1;c 5 - a;}else{b 9 - (a - 5) * 2;c a - 5;}for(d 0;d < c;d ){printf(" "…

AI创新之美:AIGC探讨2024年春晚吉祥物龙辰辰的AI绘画之独特观点

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《linux深造日志》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、龙辰辰事件概述二、为什么龙辰辰会被质疑AI创作&#xff1f;1.1 AI 作画的特点2.2 关于建行的合作宣传图…

微信小程序-父子页面传值

父子页面传值 父页面向子页面传值 方法一&#xff1a; 父页面&#xff1a; 1. /page/xxx/xxx?id1子页面&#xff1a; onLoad:function(option){ }方法二 <bindtap“func” data-xxx””> 子页面向父页面传值 定义父子页面 父页面&#xff1a;hotspot 子页面&a…

液晶时钟设计

#include<reg51.h> //包含单片机寄存器的头文件 #include<stdlib.h> //包含随机函数rand()的定义文件 #include<intrins.h> //包含_nop_()函数定义的头文件 sbit RSP2^0; //寄存器选择位&#xff0c;将RS位定义为P2.0引脚 sbit RWP2^1; //读写选…

使用Microsoft托管密钥的Azure信息保护云退出

由于各种原因&#xff0c;一些组织需要一个明确定义的流程来停止使用 Azure 信息保护以及对云服务的任何依赖&#xff0c;而不会在采用之前失去对其数据的访问权限 - 以便在出现需要时做好准备。 Azure 信息保护 (AIP) 为使用自带密钥 (BYOK) 的客户和使用 Microsoft 托管密钥…

PHP序列化总结1--序列化和反序列化的基础知识

序列化和反序列化的作用 1.序列化&#xff1a;将对象转化成数组或者字符串的形式 2.反序列化&#xff1a;将数组或字符串的形式转化为对象 为什么要进行序列化 这种数据形式中间会有很多空格&#xff0c;不同人有不同的书写情况&#xff0c;可能还会出现换行的情况 为此为了…

语义分割的应用及发展

语义分割(Semantic Segmentation)是一种计算机视觉领域的任务&#xff0c;旨在将一张图像中的每一个像素都分配一个语义标签&#xff0c;即将图像中的每个物体区域进行精确的分类划分。例如&#xff0c;在一张街景图中&#xff0c;语义分割可以将人、车、路、天空等每个像素分别…

2023-12-20 LeetCode每日一题(判别首字母缩略词)

2023-12-20每日一题 一、题目编号 2828. 判别首字母缩略词二、题目链接 点击跳转到题目位置 三、题目描述 给你一个字符串数组 words 和一个字符串 s &#xff0c;请你判断 s 是不是 words 的 首字母缩略词 。 如果可以按顺序串联 words 中每个字符串的第一个字符形成字符…

css mask 案例

文章目录 一、基本用法二、图案遮罩二、文字阴影效果三、日历探照灯效果 CSS的mask属性用于定义一个可重复使用的遮罩&#xff0c;可以将其应用到任何可视元素上。这个功能类似于Photoshop中的图层蒙版。通过mask属性&#xff0c;可以创建独特的效果&#xff0c;比如圆形、渐变…

GIT提交、回滚等基本操作记录

1、add文件时warning: LF will be replaced by CRLF in .idea/workspace.xml. 原因&#xff1a;windows中的换行符为 CRLF&#xff0c; 而在Linux下的换行符为LF&#xff0c;所以在执行add . 时会出现以下提示 解决&#xff1a;git config core.autocrlf false 2、GIT命令&…

AJAX: 整理2:学习原生的AJAX,这边借助express框架

1. npm install express 终端直接安装 2. 测试案例&#xff1a;Hello World&#xff01; 新建一个express.js的文件&#xff0c;写入下方的内容 // 1. 引入express const express require(express)// 2. 创建服务器 const app express()// 3.创建路由规则 // request 是对请…

python+django在线学习教学辅助作业系统gp6yp

本课题使用Python语言进行开发。基于web,代码层面的操作主要在PyCharm中进行&#xff0c;将系统所使用到的表以及数据存储到MySQL数据库中 技术栈 后端&#xff1a;pythondjango 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask Python版本&#xff1a;python3.…

用Xshell连接虚拟机的Ubuntu20.04系统记录。虚拟机Ubuntu无法上网。本机能ping通虚拟机,反之不能。互ping不通

先别急着操作&#xff0c;看完再试。 如果是&#xff1a;本机能ping通虚拟机&#xff0c;反之不能。慢慢看到第8条。 如果是&#xff1a;虚拟机不能上网&#xff08;互ping不通&#xff09;&#xff0c;往下一直看。 系统是刚装的&#xff0c;安装步骤&#xff1a;VMware虚拟机…

Windows搭建RTMP视频流服务(Nginx服务器版)

文章目录 引言1、安装FFmpeg2、安装Nginx服务器3、实现本地视频推流服务4、使用VLC或PotPlayer可视化播放器播放视频5、RTSP / RTMP系列文章 引言 RTSP和RTMP视频流的区别 RTSP &#xff08;Real-Time Streaming Protocol&#xff09;实时流媒体协议。 RTSP定义流格式&#xff…

全栈架构:从0开始,Vue的搭建与开发

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;很多小伙伴拿到一线互联网企业、上市企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 然后&#xff0c;很多小伙伴平时聚焦CRUD&#xff0c;没有亮点项目&#xff0c; 黄金项目。 简历也写得是非常lo…

第5课 使用openCV捕获摄像头并实现预览功能

这节课我们开始利用ffmpeg和opencv来实现一个rtmp推流端。推流端的最基本功能其实就两个:预览画面并将画面和声音合并后推送到rtmp服务器。 一、FFmpeg API 推流的一般过程 1.引入ffmpeg库&#xff1a;在代码中引入ffmpeg库&#xff0c;以便使用其提供的功能。 2.捕获摄像头…

【教3妹学编程-算法题】一年中的第几天

3妹&#xff1a;“太阳当空照&#xff0c;花儿对我笑&#xff0c;小鸟说早早早&#xff0c;你为什么背上炸药包” 2哥 :3妹&#xff0c;什么事呀这么开森。 3妹&#xff1a;2哥你看今天的天气多好啊&#xff0c;经过了一周多的寒潮&#xff0c;天气总算暖和些了。 2哥&#xff…

因吹斯汀!只需上传照片,GPT-4V精准识别食物的卡路里和摄入热量

健身和减肥的朋友有福啦&#xff01; 最近一篇文章探索了GPT-4V在膳食评估领域的强大能力&#xff0c;可以根据饮食图片精准判断食物的种类与重量&#xff0c;并给出营养成分的分析&#xff0c;包括碳水化合物、蛋白质、脂肪占比。 最最重要的是&#xff0c;它还能告诉我们这…