STM32CubeMX实现矩阵按键(HAL库实现)
功能描述:
实现矩阵按键验证,将矩阵按键的按键值,通过串口显示,便于后面使用。
实物图

原理图:

编程原理:
原理很简单,就是通过循环设置引脚为低电平,另外引脚扫描读取电平值,如果是低电平则表示按键按下,就是一个矩阵关系,这里直接将扫描代码分享给大家,使用最简单的思路实现。
接线表:
| 矩阵按键 | STM32 | 模式 |
| R4 | PB12 | 上拉输入模式 |
| R3 | PB13 | 上拉输入模式 |
| R2 | PB14 | 上拉输入模式 |
| R1 | PB15 | 上拉输入模式 |
| C1 | PA8 | 推挽输出模式 |
| C2 | PA9 | 推挽输出模式 |
| C3 | PA10 | 推挽输出模式 |
| C4 | PA11 | 推挽输出模式 |
| - | PA2 | USART2_TX |
| - | PA3 | USART2_RX |
cubeMX配置:

代码如下:
uint16_t keyScan(void)
{HAL_GPIO_WritePin(GPIOA, COL1_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA, COL2_Pin|COL3_Pin|COL4_Pin, GPIO_PIN_SET);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 4\r\n", 8, 0XFFFF);return 4;}if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 8\r\n", 8, 0XFFFF);return 8;}if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 12\r\n", 9, 0XFFFF);return 12;}if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 16\r\n", 9, 0XFFFF);return 16;}HAL_GPIO_WritePin(GPIOA, COL2_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA, COL1_Pin|COL3_Pin|COL4_Pin, GPIO_PIN_SET);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 3\r\n", 9, 0XFFFF);return 3;}if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 7\r\n", 9, 0XFFFF);return 7;}if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 11\r\n", 9, 0XFFFF);return 11;}if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 15\r\n", 9, 0XFFFF);return 15;}HAL_GPIO_WritePin(GPIOA, COL3_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA, COL1_Pin|COL2_Pin|COL4_Pin, GPIO_PIN_SET);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 2\r\n", 9, 0XFFFF);return 2;}if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 6\r\n", 9, 0XFFFF);return 6;}if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 10\r\n", 9, 0XFFFF);return 10;}if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 14\r\n", 9, 0XFFFF);return 14;}HAL_GPIO_WritePin(GPIOA, COL4_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA, COL1_Pin|COL2_Pin|COL3_Pin, GPIO_PIN_SET);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 1\r\n", 9, 0XFFFF);return 1;}if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 5\r\n", 9, 0XFFFF);return 5;}if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 9\r\n", 9, 0XFFFF);return 9;}if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin)){HAL_Delay(20);if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin)){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin));//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 13\r\n", 9, 0XFFFF);return 13;}return 0;
}
实现效果
如下:


源码链接:
STM32CubeMXHAL库实现矩阵按键资源-CSDN文库
吾心电子
相关文章:
STM32CubeMX实现矩阵按键(HAL库实现)
功能描述: 实现矩阵按键验证,将矩阵按键的按键值,通过串口显示,便于后面使用。 实物图 原理图: 编程原理: 原理很简单,就是通过循环设置引脚为低电平,另外引脚扫描读取电平值&…...
mmdetection3D指定版本安装指南
1. 下载指定版本号 选择指定版本号下载mmdetection3d的源码,如这里选择的是0.17.2版本 git clone https://github.com/open-mmlab/mmdetection3d.git -b v0.17.22. 安装 cd mmdetection3d安装依赖库 pip install -r requirment.txt编译安装 pip install -v e .…...
SQLMap工具详解与SQL注入防范
SQLMap工具详解与SQL注入防范 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨SQLMap工具的详细使用方法以及如何防范SQL注入攻击。 SQL注入简介 SQL注入是一种常见的安全漏洞&am…...
如何在Java中实现自定义数据结构:从头开始
如何在Java中实现自定义数据结构:从头开始 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在Java中实现自定义数据结构ÿ…...
【机器学习】在【Pycharm】中的应用:【线性回归模型】进行【房价预测】
专栏:机器学习笔记 pycharm专业版免费激活教程见资源,私信我给你发 python相关库的安装:pandas,numpy,matplotlib,statsmodels 1. 引言 线性回归(Linear Regression)是一种常见的统计方法和机器学习算法&a…...
如何在 Linux 中后台运行进程?
一、后台进程 在后台运行进程是 Linux 系统中的常见要求。在后台运行进程允许您在进程独立运行时继续使用终端或执行其他命令。这对于长时间运行的任务或当您想要同时执行多个命令时特别有用。 在深入研究各种方法之前,让我们先了解一下什么是后台进程。在 Linux 中…...
软考-软件设计师
软考 软考科目 软考分为初级、中级、高级,初级含金量相对不够,高级考试有难度,所以大多数人都在考中级,中级也分很多科目,我考的是软件设计师(已经通过)。 合格标准 考试分为上午题和下午题…...
UOS系统中JavaFx笔锋功能
关于笔锋功能,网上找了很久,包括Java平台客户端,Android端,相关代码资料比较少,找了很多经过测试效果都差强人意,自己也搓不出来,在UOS平台上JavaFX也获取不到压力值,只能用速度的变…...
后端加前端Echarts画图示例全流程(折线图,饼图,柱状图)
本文将带领读者通过一个完整的Echarts画图示例项目,演示如何结合后端技术(使用Spring Boot框架)和前端技术(使用Vue.js或React框架)来实现数据可视化。我们将实现折线图、饼图和柱状图三种常见的数据展示方式ÿ…...
ValidateAntiForgeryToken、AntiForgeryToken 防止CSRF(跨网站请求伪造)
用途:防止CSRF(跨网站请求伪造)。 用法:在View->Form表单中: aspx:<%:Html.AntiForgeryToken()%> razor:Html.AntiForgeryToken() 在Controller->Action动作上:[ValidateAntiForge…...
《昇思25天学习打卡营第5天 | mindspore 网络构建 Cell 常见用法》
1. 背景: 使用 mindspore 学习神经网络,打卡第五天; 2. 训练的内容: 使用 mindspore 的 nn.Cell 构建常见的网络使用方法; 3. 常见的用法小节: 支持一系列常用的 nn 的操作 3.1 nn.Cell 网络构建&…...
SQLServer:从数据类型 varchar 转换为 numeric 时出错。
1.工作要求 计算某两个经纬度距离 2.遇到问题 从数据类型 varchar 转换为 numeric 时出错。 3.解决问题 项目版本较老,使用SQLServer 2012 计算距离需执行视图,如下: SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO ALTER view vi_ord…...
探索迁移学习:通过实例深入理解机器学习的强大方法
探索迁移学习:通过实例深入理解机器学习的强大方法 🍁1. 迁移学习的概念🍁2. 迁移学习的应用领域🍁2.1 计算机视觉🍁2.2 自然语言处理(NLP)🍁2.3 医学图像分析🍁2.4 语音…...
【Linux】性能分析器 perf 详解(四):trace
上一篇:【Linux】性能分析器 perf 详解(三) 1、trace 1.1 简介 perf trace 类似于 strace 工具:用于对Linux系统性能分析和调试的工具。 原理是:基于 Linux 性能计数器(Performance Counters for Linux, PCL),监控和记录系统调用和其他系统事件。 可以提供关于硬件…...
信息安全体系架构设计
对信息系统的安全需求是任何单一安全技术都无法解决的,要设计一个信息安全体系架构,应当选择合适的安全体系结构模型。信息系统安全设计重点考虑两个方面;其一是系统安全保障体系;其二是信息安全体系架构。 1.系统安全保障体系 安…...
GPT-5即将登场:AI赋能下的未来工作与日常生活新图景
随着OpenAI首席技术官米拉穆拉蒂在近期采访中的明确表态,GPT-5的发布已不再是遥不可及的梦想,而是即将在一年半后与我们见面的现实。这一消息无疑在科技界乃至全社会引发了广泛关注和热烈讨论。从GPT-4到GPT-5的飞跃,被形容为从高中生到博士生…...
RocketMQ实战:一键在docker中搭建rocketmq和doshboard环境
在本篇博客中,我们将详细介绍如何在 Docker 环境中一键部署 RocketMQ 和其 Dashboard。这个过程基于一个预配置的 Docker Compose 文件,使得部署变得简单高效。 项目介绍 该项目提供了一套 Docker Compose 配置,用于快速部署 RocketMQ 及其…...
前端项目vue3/React使用pako库解压缩后端返回gzip数据
pako仓库地址:https://github.com/nodeca/pako 文档地址:pako 2.1.0 API documentation 外部接口返回一个直播消息或者图片数据是经过zip压缩的,前端需要把这个数据解压缩之后才可以使用,这样可以大大降低网络数据传输的内容&…...
C++专业面试真题(1)学习
TCP和UDP区别 TCP 面向连接。在传输数据之前,通信双方需要先建立一个连接(三次握手)。可靠性。TCP提供可靠的数据传输,它通过序列号、确认应答、重传机制和校验和等技术确保数据的正确传输。数据顺序:TCP保证数据按发…...
2024 年人工智能和数据科学的五个主要趋势
引言 2023年,人工智能和数据科学登上了新闻头条。生成性人工智能的兴起无疑是这一显著提升曝光度的驱动力。那么,在2024年,该领域将如何继续占据头条,并且这些趋势又将如何影响企业的发展呢? 在过去几个月,…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
