当前位置: 首页 > news >正文

单片机学习笔记---矩阵键盘

目录

矩阵键盘的介绍

独立按键和矩阵按键的相同之处:

矩阵按键的扫描

代码演示

代码模块化移植

Keil自定义模板步骤:

代码编写


矩阵键盘就是开发板上右下角的这个模块

这一节的代码是基于上一节讲的LCD1602液晶显示屏驱动代码进行的

矩阵键盘的介绍

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式

采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态。

数码管扫描(输出扫描)

原理:显示第1位→显示第2位→显示第3位→……,然后快速循环这个过程,最终实现所有数码管同时显示的效果

矩阵键盘扫描(输入扫描)

原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果

以上两种扫描方式的共性:节省I/O口

独立按键和矩阵按键的相同之处:

独立按键是把按键公共的一端直接接地(低电平0),另一端接在IO口上

然后我们发现矩阵键盘和独立按键有个相似的地方就是如果只看一种一行,将这一整行接地的话,只看这一行两节IO口时,和独立按键的连接方式其实是一样的。

所以矩阵按键可以说是独立按键的复杂版,而独立按键是简单化的版本。

矩阵按键的扫描

比如想要判断第二行,那P16就给0,其他的给1

然后如果P13给0,就是S5按下了,如果P12给0,就是S6按下了,如果P11给0,就是S7按下了,如果P10给0,就是S6按下了。

其实这个和数码管的操作原理差不多,可以理解为上面4个引脚为使能,下面四个为读取,也可以说上面四个是位选,后四个事段选。

同理,如果想要判断第三行,和第四行,那就是P15和P14分别给0

就是这样一行一行读下来,就相当于把键盘扫描一遍。

要注意的一点是,这个P15口会连接到步进电机上,它相当于驱动器(增大输出电流能力的)

然后BZ就连接到蜂鸣器上

我们这个开发板上的蜂鸣器是无源蜂鸣器,所以这个BZ口以一定的频率高低变化,蜂鸣器就会响。

所以我们逐行扫描矩阵按键出现的问题就是蜂鸣器会自己响,并且关不掉,是引脚冲突造成的。

为了避免这个问题,我们可以采用逐列扫描。

怎么逐列扫描呢?

就是反过来,给下面四个IO口赋值,然后读取上面四个IO口

比如我们要判断第一行,就给P13口0,然后其余给1,然后如果P17口给0,就是S1按下了,如果P16给0,就是S5按下了,如果P15给0,就是S9按下了,如果P14给0,就是S13按下了。同理,其他列是一样的方式。

代码演示

接下来开始代码演示:

新建一个工程,写上框架

代码模块化移植

本节用到的所有程序源码文件可以到评论区自取!

我们把上一节用到的四个文件拷贝过来放进这节的工程文件夹中

这个过程就叫做模块化移植

然后我们把这四个文件添加进来

这样我们就可以引用这几个模块化的程序了。

然后我们需要再创建一个矩阵按键的.c和.h文件

这个时候发现只出现了MatrixKey的.c文件,.h文件我们要自己再添加

这样就能看到它的.h文件了

然后双击MatrixKey.h文件,写上防止重复定义的程序

如果嫌每次都写#ifndef这个框架很麻烦的话,可以把它做成一个templates模板

Keil自定义模板步骤:

左栏点击函数模板

可以看到一些已经被定义好的模板,我们也可以自己添加一个

点击右键-构建模板

点击新建模板

填写模板名称

填写模板内容

点击OK

这样就可以使用了

试一下,双击模板名称

框架就自动出来了!

把它补充完整:

.h文件的框架写好之后,可以写.c文件了

代码编写

根据原理图,我们在MatrixKey.c文件上编写一个程序扫描矩阵按键上的每一个按键,实现的效果是:当我们按下某个按键的时候,屏幕上就给我们提示所按下的按键的编号

写好之后在MatrixKey.h文件里面声明一下

然后我们在main.c上调用一下这些函数

编译无错误后看看效果:

按下S2键后松手后,的确是在第2行,第1列显示按键序号02

按下S3键后松手后,的确是在第2行,第1列显示按键序号03

我们可以添加这样一行代码,显示“MatrixKey:”

这样就可以自动在第一行显示“MatrixKey:”提示的按键序号在第二行显示

以上就是本节要实现的效果。

本节用到的所有程序源码文件可以到评论区自取!

相关文章:

单片机学习笔记---矩阵键盘

目录 矩阵键盘的介绍 独立按键和矩阵按键的相同之处: 矩阵按键的扫描 代码演示 代码模块化移植 Keil自定义模板步骤: 代码编写 矩阵键盘就是开发板上右下角的这个模块 这一节的代码是基于上一节讲的LCD1602液晶显示屏驱动代码进行的 矩阵键盘的介…...

第八篇 交叉编译华为云Iot SDK到Orangepi3B

本篇主要内容: 一、交叉编译华为云Iot SDK依赖1.宿主机安装交叉编译工具链(1)选择下载交叉编译工具链(2)解压、添加环境变量、重启2.交叉编译依赖库(0) 准备工作(1) 交叉…...

软件工程测试2

1.【单选】“数据流的分解一般达到2层数据流就截止”的说法是否正确 A. 正确 B. 错误 答案:B 2.【单选】 在类图中,哪种关系表达总体与局部的关系 A. 泛化 B. 实现 C. 聚合 D. 依赖 答案:C 3.【多选】从UML时序图中我们能够得到(…...

31.【TypeScript 教程】混入(Mixins)

TypeScript 混入(Mixins) 混入(Mixins)是面向对象编程中的一个比较重要的概念。本节将会通过一个实例逐步介绍混入是如何在 TypeScript 中使用的。 1. 解释 在 TypeScript 中,可以根据不同的功能定义多个可复用的类,它们将作为 …...

C语言常见面试题:什么是联合体,联合体的作用是什么?

联合体(union)是一种特殊的数据类型,它可以在同一块内存单元中存储不同的数据类型。联合体的作用在于能够节省内存空间,并且可以用来实现数据的共享和交换。 联合体的定义方式是在C语言中通过关键字union来定义,例如&…...

Nginx进阶篇【五】

Nginx进阶篇【五】 八、Nginx实现服务器端集群搭建8.1.Nginx与Tomcat部署8.1.1.环境准备(Tomcat)8.1.1.1.浏览器访问:8.1.1.2.获取动态资源的链接地址:8.1.1.3.在Centos上准备一个Tomcat作为后台web服务器8.1.1.4.准备一个web项目,将其打包为war8.1.1.5.启动tomcat进…...

IndexedDB

Web SQL Database | Can I use... Support tables for HTML5, CSS3, etc IndexedDB | Can I use... Support tables for HTML5, CSS3, etc 为什么websql被废弃?_笔记大全_设计学院 WebSQL有兼容、性能、安全问题,要考虑使用IndexedDB替代。 一文看懂 In…...

git用法总结

以gitee为例,GitHub也可参考本文 创建远程仓库 在自己的gitee主页 创建本地仓库 在文件夹下,右键→git bash here git init添加gitignore vi .gitignoregitignore里的内容根据自己实际情况设置,这里举个例子 # #开头的是注释 # Prer…...

统计学-R语言-7.3

文章目录 前言总体方差的检验一个总体方差的检验两个总体方差比的检验 非参数检验总体分布的检验正态性检验的图示法Shapiro-Wilk和K-S正态性检验总体位置参数的检验 练习 前言 本篇文章继续对总体方差的检验进行介绍。 总体方差的检验 一个总体方差的检验 在生产和生活的许多…...

在Idea中使用git查看历史版本

idea查git历史 背景查看步骤总结 背景 有好几次同事到我电脑用idea查看git管理的历史记录,每次都说我的idea看不了历史版本,叫我到他电脑上去看,很晕,为什么,原来是我自己把显示历史文件的视图覆盖了,下面我们来一起学…...

书籍 - 《华杉讲透孙子兵法》 - 11

第十章 地形第十 六种地形的用兵之道(一):先占有利地形 我们读兵法,会发现很多时候,等待都是最好的策略。你一定要懂得等,等得起。有的人不能等,总以为等待就是不作为,那就容易“胡作…...

2024 axios封装 包括请求拦截、错误码等

1.新建 codeMessage.ts export default {200: "服务器成功返回请求的数据。",201: "新建或修改数据成功。",202: "一个请求已经进入后台排队(异步任务)。",204: "删除数据成功。",400: "发出的请求有错误…...

Kotlin Multiplatform项目推荐 | 太空人分布图

Kotlin Multiplatform项目推荐 | 太空人分布图 项目简介 Kotlin Multiplatform项目是一种跨平台开发技术,它可以同时使用SwiftUI、Jetpack Compose、Compose for Wear OS、Compose for Desktop、Compose for Web、Kotlin/JS React等客户端框架,并且使…...

使用Opencv-python库读取图像、本地视频和摄像头实时数据

使用Opencv-python库读取图像、本地视频和摄像头实时数据 Python中使用OpenCV读取图像、本地视频和摄像头数据很简单, 首先需要安装Python,然后安装Opencv-python库 pip install opencv-python然后在PyCharm或者VScode等IDE中输入对应的Python代码 一…...

webpack如何把dist.js中某个模块js打包成一个全局变量,使得在html引入dist.js后可以直接访问

webpack可以通过使用expose-loader来将模块中的一个js文件暴露为全局可以访问的变量。下面是一个示例代码: 1、安装expose-loader npm install expose-loader --save-dev 2、webpack.config.js配置文件 值得注意的是:我在本地使用16.14.2版本的node打包…...

Mysql第一天

数据库概述 1. 为什么要使用数据库 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。(可掉电:内存 使用高电压和低电压来区别0和1进行数据的一个存储但是一旦断电了电压都没了 0和1也就没有了)大多数情况下,特别是企 业级应用&#…...

用C语言实现贪吃蛇游戏!!!(破万字)

前言 大家好呀,我是Humble,不知不觉在CSND分享自己学过的C语言知识已经有三个多月了,从开始的C语言常见语法概念说到C语言的数据结构今天用C语言实现贪吃蛇已经有30余篇博客的内容,也希望这些内容可以帮助到各位正在阅读的小伙伴…...

uniapp 使用echarts做折线图条形图。

提前10天把中烟活动做完了,以为能打酱油到除夕那天,结果又要做什么数据看板,方便烟草领导过年查看数据,还只给5天时间,真实压榨剥削啊,下辈子再也不‘拍黄片’了,不!下份工作我就转前…...

美易平台:诺基亚四季度财报超预期

正文: 近日,诺基亚发布了其四季度财报,显示调整后营业利润达到了8.46亿欧元,超出市场预估的7.627亿欧元。同时,调整后每股收益(EPS)为0.10欧元,符合市场预期。这一成绩表明诺基亚在…...

大数据学习之Flink算子、了解(Source)源算子(基础篇二)

Source源算子(基础篇二) 目录 Source源算子(基础篇二) 二、源算子(source) 1. 准备工作 2.从集合中读取数据 可以使用代码中的fromCollection()方法直接读取列表 也可以使用代码中的fromElements()方…...

抖去推短视频矩阵系统+实景无人直播系统技术源头开发

抖去推爆款视频生成器,通过短视频矩阵、无人直播,文案引流等,打造实体商家员工矩阵、用户矩阵、直播矩阵,辅助商家品牌曝光,团购转化等多功能赋能商家拓客引流。 短视频矩阵通俗来讲就是批量剪辑视频和批量发布视频&a…...

【机器学习】一文读懂统计学与机器学习的区别。

统计学与机器学习的区别 1、机器学习2、统计学3、统计学与机器学习异同性3.1 差异性3.2 相似性 4、总结 1、机器学习 关于机器学习,我想大家都很熟悉,这里我再简单唠叨一些 机器学习是人工智能的一个子领域,主要关注如何通过算法使计算机系统…...

燃烧的指针(二)

🌈个人主页:小田爱学编程 🔥 系列专栏:c语言从基础到进阶 🏆🏆关注博主,随时获取更多关于c语言的优质内容!🏆🏆 😀欢迎来到小田代码世界~ &#x…...

【工具使用-Everything】everything只能搜到文件夹,无法搜到文件

一,问题现象 everything搜索时,只能搜索到文件夹,无法搜索到文件夹下的文件。 二,问题原因 everything搜索设置问题,设置为"文件夹"导致 三,解决方法 将搜索选项设置为“所有”即可&#x…...

手写rpc和redis

rpc框架搭建 consumer 消费者应用 provider 提供的服务 Provider-common 公共类模块 rpc 架构 service-Registration 服务发现 nacos nacos配置中心 load-balancing 负载均衡 redis-trench 手写redis实现和链接 package com.trench.protocol;import com.trench.enumUtil.Redis…...

Unity动画桢事件

1,使用原因 在新项目内部审核的时候,说什么动画节奏不匹配,所以决定用动画桢事件来处理技能释放。当释放技能的时候,先播放技能动画,然后再动画桢所在的时间戳执行技能的逻辑。 2,具体实现 1,…...

搭建Redis集群

一 应用场景 为什么需要redis集群? 当主备复制场景,无法满足主机的单点故障时,需要引入集群配置。 一般数据库要处理的读请求远大于写请求 ,针对这种情况,我们优化数据库可以采用读写分离的策略。我们可以部 署一台…...

C语言sizeof 不是函数吗?

一、问题 sizeof 怎么⽤,它不是函数吗? 二、解答 sizeof 在 C 和 C 中不是一个函数,而是一个运算符。它在编译时计算其操作数所占用的内存大小,并返回一个大小(字节数),这个结果是类型或表达式…...

Mybatis的XML配置

MyBatis 是一个持久层框架&#xff0c;通过 XML 配置文件来定义 SQL 映射和结果的映射规则。以下是关于 MyBatis XML 配置文件的详细说明&#xff1a; 基本结构&#xff1a; XML 配置文件通常包含 <mapper>、<resultMap>、<typeAliases> 等元素。 2. mappe…...

Oracle报错:ORA-08002: sequence CURRVAL is not yet defined in this session

问题 直接查询序列的当前值&#xff0c;然后报了这个错误。 SELECT HR.EMPLOYEES_SEQ.CURRVAL; ORA-08002: sequence CURRVAL is not yet defined in this session解决 ORA-08002错误是Oracle数据库中的一个常见错误&#xff0c;它表示在当前会话中未定义序列的CURRVAL值。这…...

wordpress 评论时间/网络服务商怎么咨询

上代码&#xff1a; :http-request"(file)>imgUploadLogin(file, 上传的参数)"这是upload组件的上传文件成功时的钩子。 文件上传一、 methods:{imgUploadLogin(file, name) {//name就是上传的参数let content file.file;let data new FormData();data.appen…...

赤峰网站建设/营销软件网站

◆ 方案背景<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />IWS-ICB解决方案是北京一维天地科技有限公司&#xff08;微软金牌认证合作伙伴&#xff09;在微软SharePoint及Office系列产品基础上实现的企业集成协作工作平台解决方…...

网站海报做一张多少钱/搜索引擎市场份额2023

文章目录&#x1f449;&#x1f3fb;前言❤️主从模式说明&#x1f90d;logbin日志&#x1f90d;Mysql主从复制的流程&#x1f90d;主从复制中遇到的问题❤️主从模式配置&#x1f90d;Master配置&#x1f90d;Slave配置❤️其他设置&#x1f90d;半同步复制&#x1f90d;并行复…...

企业网站建设一般包含哪些内容/能翻到国外的浏览器

title: Spring加载资源文件冲突问题 tags: tomcat8springmacwebjarsj2cache categories: spring date: 2017-11-14 16:42:08背景 开发者在使用Spring做Properties文件载入时&#xff0c;这也是spring做placeholder的便捷之处。 classpath:和classpath*:想必也是大部分开发都会写…...

做代购网站有哪些/免费b站网站推广

Welcome to 3306π4月APRIL 14TH福利「3306π」社区北京站meetup活动刚上线一周多&#xff0c;早鸟免费票、普票均已告罄。为了方便在外地以及北京本地有事无法亲临现场交流的胖友们&#xff0c;我们特邀“IT大咖说”平台直播本次活动。各位亲们可以在家里、在野外、在飞机中、…...

wordpress分类权限插件/百度竞价优化软件

上一篇是纯kotlin实现&#xff0c;这一篇是基于现有Java接口做的kotlin拓展&#xff0c;最早是在stackoverflow上看的(现在忘了地址是哪个)。只是当时没看懂&#xff0c;当完成上一篇后&#xff0c;再看这一篇时候忽然就明白了作者的意思&#xff0c;这里做个记录。 代码可以直…...