长沙com建站网站设计/seo网络优化师就业前景

长沙com建站网站设计,seo网络优化师就业前景,电子商务网站开发与设计,龙泉市建设局网站【星云 Orbit-F4 开发板】03g. 按键玩法七:矩阵键盘单个触发 引言 矩阵键盘是一种常见的输入设备,广泛应用于各种嵌入式系统中。通过矩阵键盘,用户可以通过按键输入字符或控制信号。本文将详细介绍如何使用STM32F407的GPIO引脚实现矩阵键盘的…

【星云 Orbit-F4 开发板】03g. 按键玩法七:矩阵键盘单个触发


引言

矩阵键盘是一种常见的输入设备,广泛应用于各种嵌入式系统中。通过矩阵键盘,用户可以通过按键输入字符或控制信号。本文将详细介绍如何使用STM32F407的GPIO引脚实现矩阵键盘的单个触发功能。通过本教程,读者将能够掌握矩阵键盘的基本原理以及如何通过HAL库实现单个触发的检测。


硬件准备

在开始编程之前,确保您已经准备好以下硬件:

  1. STM32F407开发板:板载STM32F407VGT6(Cortex-M4/168MHz)作为主控芯片。
  2. 矩阵键盘模块:4x4矩阵键盘模块。
  3. 连接线:用于连接矩阵键盘和开发板。
  4. 限流电阻:若干个220Ω至330Ω的电阻,用于保护电路。

硬件连接

将矩阵键盘连接到STM32F407的GPIO引脚:

  1. 连接矩阵键盘的行引脚

    • 将矩阵键盘的行引脚(通常标记为R0-R3)连接到STM32F407的PB0-PB3引脚。
  2. 连接矩阵键盘的列引脚

    • 将矩阵键盘的列引脚(通常标记为C0-C3)连接到STM32F407的PC0-PC3引脚。
  3. 连接地线

    • 将矩阵键盘的地线连接到STM32F407的GND引脚。

GPIO配置

在STM32F407中,GPIO引脚可以配置为多种模式,以适应不同的应用需求。以下是一些常见的GPIO模式:

  1. 输入模式

    • 浮空输入(Floating Input):引脚处于高阻态,适用于不需要上拉或下拉的情况。
    • 上拉输入(Pull-Up Input):引脚内部连接上拉电阻,适用于外部信号为低电平有效的情况。
    • 下拉输入(Pull-Down Input):引脚内部连接下拉电阻,适用于外部信号为高电平有效的情况。
  2. 输出模式

    • 推挽输出(Push-Pull Output):引脚可以输出高电平或低电平,适用于直接驱动小电流负载,如LED灯。
    • 开漏输出(Open-Drain Output):引脚输出低电平或高阻态,适用于需要外部上拉电阻的场合。

在本教程中,我们将矩阵键盘的行引脚配置为推挽输出模式,列引脚配置为上拉输入模式。

配置GPIO时钟

在使用GPIO引脚之前,需要先使能相应的GPIO时钟。对于PB0-PB3引脚,需要使能GPIOB时钟;对于PC0-PC3引脚,需要使能GPIOC时钟。

// 使能GPIOB时钟
__HAL_RCC_GPIOB_CLK_ENABLE();// 使能GPIOC时钟
__HAL_RCC_GPIOC_CLK_ENABLE();

配置GPIO引脚

使用GPIO_InitTypeDef结构体配置GPIO引脚的模式、上下拉、速度等参数。

GPIO_InitTypeDef GPIO_InitStruct = {0};// 配置PB0-PB3为推挽输出模式
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);// 配置PC0-PC3为上拉输入模式
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

按键扫描模块

为了实现模块化设计,我们将按键的扫描功能封装到bsp/KEY目录下的bsp_key.cbsp_key.h文件中。

1. 创建KEY目录

  1. 打开文件管理器

    • 导航到STM32F407项目目录下的Drivers/BSP文件夹。
  2. 创建新目录

    • 右键点击空白区域,选择新建文件夹
    • 输入目录名称KEY,并按回车键确认。

2. 创建bsp_key.cbsp_key.h文件

  • 确保bsp_key.cbsp_key.h文件当前位于Drivers/BSP/KEY目录下。

3. 更新项目包含路径

  1. 打开Keil MDK

    • 加载当前的STM32F407项目。
  2. 进入项目设置

    • 右键点击工程名称,选择Options for Target
  3. 添加新的包含路径

    • 在弹出的窗口中,选择C/C++选项卡。
    • Include Paths字段中,添加以下路径:
      Drivers/BSP/KEY
      
    • 确保路径正确无误,点击OK保存设置。

4. 更新main.c文件

  1. 打开main.c文件

    • 在Keil MDK的项目资源管理器中,找到并双击main.c文件。
  2. 包含新的头文件

    • 在文件顶部,添加以下包含语句:
      #include "bsp_key.h"
      
    • 确保路径正确,以便编译器能够找到该头文件。

5. 重新编译项目

  1. 编译工程

    • 点击工具栏中的Build按钮(或按F7键)。
    • 确保编译过程中没有错误和警告。
  2. 处理编译错误

    • 如果出现包含路径错误,请检查Include Paths设置是否正确。
    • 确保bsp_key.h文件位于Drivers/BSP/KEY目录下。

6. 更新项目分组

  1. 添加新的文件夹分组

    • 在Keil MDK的项目资源管理器中,右键点击BSP分组,选择Add Group
    • 输入分组名称KEY,点击OK
  2. 添加文件到分组

    • 右键点击新的KEY分组,选择Add New Item to Group
    • 选择Add Existing File,导航到Drivers/BSP/KEY目录,选择bsp_key.cbsp_key.h文件,点击OK
  3. 确保文件可见性

    • 确保bsp_key.cbsp_key.h文件在KEY分组下可见,并且路径正确。

按键扫描模块实现

bsp_key.h文件

#ifndef __BSP_KEY_H
#define __BSP_KEY_H#include "stm32f4xx_hal.h"#define ROWS 4    // 矩阵键盘的行数
#define COLS 4    // 矩阵键盘的列数/*** @brief 初始化矩阵键盘*/
void KEY_Init(void);/*** @brief 扫描矩阵键盘并检测按键状态* @return 按键状态(0:未按下,1-16:按键编号)*/
uint8_t KEY_Scan(void);#endif /* __BSP_KEY_H */

bsp_key.c文件

#include "bsp_key.h"static uint8_t key_state = 0;/*** @brief 初始化矩阵键盘*/
void KEY_Init(void) {GPIO_InitTypeDef GPIO_InitStruct = {0};// 使能GPIOB和GPIOC时钟__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();// 配置PB0-PB3为推挽输出模式GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);// 配置PC0-PC3为上拉输入模式GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}/*** @brief 扫描矩阵键盘并检测按键状态* @return 按键状态(0:未按下,1-16:按键编号)*/
uint8_t KEY_Scan(void) {static uint8_t row = 0;static uint8_t col = 0;static uint8_t key_pressed = 0;if (key_pressed) {// 检测按键是否释放if (HAL_GPIO_ReadPin(GPIOC, C0_Pin) == GPIO_PIN_SET &&HAL_GPIO_ReadPin(GPIOC, C1_Pin) == GPIO_PIN_SET &&HAL_GPIO_ReadPin(GPIOC, C2_Pin) == GPIO_PIN_SET &&HAL_GPIO_ReadPin(GPIOC, C3_Pin) == GPIO_PIN_SET) {key_pressed = 0;}return 0;}// 扫描行for (row = 0; row < ROWS; row++) {// 激活当前行switch (row) {case 0:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);break;case 1:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);break;case 2:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);break;case 3:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);break;}// 检测列for (col = 0; col < COLS; col++) {if (HAL_GPIO_ReadPin(GPIOC, (GPIO_PinTypeDef)(GPIO_PIN_0 << col)) == GPIO_PIN_RESET) {// 按键按下key_pressed = 1;return (row * COLS) + col + 1;}}// 禁用当前行switch (row) {case 0:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);break;case 1:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);break;case 2:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);break;case 3:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);break;}}return 0;
}

主程序实现

#include "stm32f4xx_hal.h"
#include "bsp_key.h"int main(void) {// 系统初始化HAL_Init();SystemClock_Config();// 按键初始化KEY_Init();while (1) {// 扫描按键状态uint8_t key = KEY_Scan();if (key != 0) {// 按键按下,执行相应操作// 在此处添加按键处理代码// 例如,控制LED灯或播放声音}}
}

测试与验证

  1. 编译与下载

    • 将代码编译并下载到STM32F407开发板中。
  2. 观察按键状态

    • 连接好硬件后,按下矩阵键盘上的按键,观察是否能够正确检测按键按下事件。如果按键状态没有正确检测,请检查硬件连接和代码配置是否正确。
  3. 验证单个触发

    • 按下按键,确保每次按下只触发一次响应。如果触发不正常,请检查按键扫描逻辑以及相关处理代码。

总结

通过本教程,您已经掌握了如何使用STM32F407的GPIO引脚实现矩阵键盘的单个触发功能。矩阵键盘的扫描逻辑是关键步骤,选择合适的行和列配置以及扫描逻辑可以确保按键的稳定工作。模块化设计使代码更加清晰和易于维护,为后续的项目扩展奠定了良好的基础。希望本教程对您有所帮助,祝您在嵌入式开发的道路上取得更大的成功!

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

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

相关文章

Milvus x DeepSeek 搭建低成本高精度 RAG 实战

为什么手握海量数据&#xff0c;却用不出真正的“智能”&#xff1f;要么 AI 模型学艺不精&#xff0c;答非所问&#xff1b;要么技术门槛太高&#xff0c;让普通开发者望而却步。现在&#xff0c;使用阿里云 Milvus 向量检索服务、DeepSeek 大模型和 PAI LangStudio 开发工具&…

2025年SCI1区TOP:真菌生长优化算法FGO,深度解析+性能实测

目录 1.摘要2.算法原理3.结果展示4.参考文献5.代码获取 1.摘要 本文提出了一种新型的自然启发元启发式算法——真菌生长优化算法&#xff08;FGO&#xff09;&#xff0c;灵感来源于真菌在自然界中的生长行为。真菌的生长行为包括菌丝生长、分枝和孢子萌发&#xff0c;菌丝生长…

1 | 从零开始解密数据库:数据库基础概念

❤个人主页&#xff1a;折枝寄北的博客 ❤专栏位置&#xff1a;数据库专栏 目录 前言1. 数据&#xff08;data&#xff09;2. 数据库(DB)3. 数据库管理系统(DBMS)4. 数据库系统(DBS) 感谢您的阅读支持 前言 【前言】 在万物互联的数字时代&#xff0c;数据已成为驱动社会运转…

Web自动化之Selenium下Chrome与Edge的Webdriver常用Options参数

目录 引言 说明 Add_argument() 添加方式 常用参数 Add_experimental_option() 添加方式 常用方法 任务结束后仍然保持浏览器打开 禁用“Chrome 正受到自动测试软件的控制”提示 设置下载路径 禁用弹窗拦截 禁用图片加载 禁用 JavaScript 注意 引言 …

AI提示词的种类与适合的任务

以下是提示词的主要种类及其适用任务&#xff0c;基于大模型特性与最佳实践总结&#xff1a; 一、基础提示词 零样本提示&#xff08;Zero-shot Prompting&#xff09; 形式&#xff1a;直接输入任务指令&#xff0c;不提供示例&#xff08;如“翻译以下句子&#xff1a;Hello …

FTP 实验(ENSP模拟器实现)

目录 FTP 概述 FTP实验 FTP的报文交互 FTP 概述 FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型&#xff0c;客户端通过…

Windows前端开发IDE选型全攻略

Windows前端开发IDE选型全攻略 一、核心IDE对比矩阵 工具名称最新版本核心优势适用场景推荐指数引用来源VS Code2.3.5轻量级/海量插件/跨平台/Git深度集成全栈开发/中小型项目⭐⭐⭐⭐⭐14WebStorm2025.1智能提示/框架深度支持/企业级调试工具大型项目/专业前端团队⭐⭐⭐⭐47…

鸿蒙5.0实战案例:har和hsp的转换

往期推文全新看点&#xff08;文中附带全新鸿蒙5.0全栈学习笔录&#xff09; ✏️ 鸿蒙&#xff08;HarmonyOS&#xff09;北向开发知识点记录~ ✏️ 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ ✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景&#…

SAP-ABAP:使用ST05(SQL Trace)追踪结构字段来源的步骤

ST05 是 SAP 提供的 SQL 跟踪工具&#xff0c;可以记录程序运行期间所有数据库操作&#xff08;如 SELECT、UPDATE、INSERT&#xff09;。通过分析跟踪结果&#xff0c;可以精准定位程序中结构字段对应的数据库表。 步骤1&#xff1a;激活ST05跟踪 事务码 ST05 → 点击 Activa…

【落羽的落羽 数据结构篇】树、二叉树

文章目录 一、树1. 树的概念和结构2. 树的相关术语 二、二叉树1. 概念与结构2. 满二叉树3. 完全二叉树4. 二叉树的性质5. 二叉树的存储结构 一、树 1. 树的概念和结构 之前我们学习了线性表&#xff0c;今天我们再来接触一种全新的数据结构——树。 树是一种非线性的数据结构…

CPU、MCU、MPU、SOC、DSP、ECU、GPU、FPGA傻傻分不清楚?一文讲清它们的区别

文章目录 前言一、定义与功能1、CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09;2、MCU&#xff08;Microcontroller Unit&#xff0c;微控制单元&#xff09;3、MPU&#xff08;Microprocessor Unit&#xff0c;微处理器&#xff09;4、SOC&#x…

网络安全学习-常见安全漏洞检测以及修复方法-1

渗*透测试 渗透测试就是模拟攻击者入侵系统&#xff0c;对系统进行一步步渗透&#xff0c;发现系统的脆弱环节和隐藏风险。形成测试报告提供给系统的所有者&#xff0c;所有者根据报告对系统进行加固&#xff0c;提升系统的安全性&#xff0c;防止真正的攻击者入侵。 渗透测试…

JVM之JVM的组成

Java 虚拟机&#xff08;JVM&#xff09;是 Java 程序的运行核心&#xff0c;它主要由类加载系统、运行时数据区、执行引擎和本地方法接口这几个关键部分组成。 类加载系统&#xff08;Class Loading System&#xff09; 类加载系统负责在程序运行时动态地将 Java 类加载到 J…

个人简历html网页模板,科技感炫酷html简历模板

炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。这样一款黑色个人简历html网页模板,科技感炫酷html简历模板,设计效果类似科技看板图,可帮您展示技能、任职经历、作品等,喜欢这种风格的小伙伴不要犹豫哦。该素材呈现了数据符号排版显示出人形的动画效…

java后端开发day18--学生管理系统

&#xff08;以下内容全部来自上述课程&#xff09; 1.业务分析并搭建主菜单 1.需求 采取控制台的方式去书写学生管理系统 2.分析 1.初始菜单 2.学生类 属性&#xff1a;id&#xff0c;姓名&#xff0c;年龄&#xff0c;家庭住址 3.添加功能 键盘录入每一个学生信息并…

记录一次部署PC端网址全过程

当我查看我之前写的文章时、顿时惊奇发出感慨&#xff1a;啥时候写的&#xff1f;是我写的么&#xff1f;疑惑重重… 所以说&#xff0c;好记性不如烂笔头。 记录一次部署PC端网址全过程 部署PC端网址分是三步&#xff1a;第一步&#xff1a;申请域名并映射到外网IP &#xff0…

本地大模型编程实战(22)用langchain实现基于SQL数据构建问答系统(1)

使 LLM(大语言模型) 系统能够查询结构化数据与非结构化文本数据在性质上可能不同。后者通常生成可在向量数据库中搜索的文本&#xff0c;而结构化数据的方法通常是让 LLM 编写和执行 DSL&#xff08;例如 SQL&#xff09;中的查询。 我们将演练在使用基于 langchain 链 &#x…

最好的Git实践指南(Windows/Linux双系统详解)

Git最佳实践指南&#xff1a;从入门到熟练&#xff08;Windows/Linux双系统详解&#xff09; 一、环境搭建与基础配置&#xff08;适用Windows/Linux&#xff09; 1.1 Git安装与验证 # Windows系统安装&#xff08;推荐Chocolatey包管理&#xff09; # 直接下载git二进制文件…

Python零基础学习第二天(条件语句,循环语句)

Python零基础学习第二天&#xff1a;流程控制与模块导入 一、流程控制结构 1. 条件语句&#xff08;if, elif, else&#xff09; 条件语句用于根据不同的条件执行不同的代码块。基本形式如下&#xff1a; if 条件1: # 当条件1为True时执行这里的代码 elif 条件2: # 当前面的条…

从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(三) 实现注册 登录接口

1.划分文件夹 在src目录下创建controllers middleware models routes controllers 放具体的方法 signup login middleware 里面是中间件 请求的验证 models 放对象实体 routes 处理访问路径像/signup /login 等等 2. 接口开发 系统的主要 有用户认证 和 消息 2种类型…