Extend module 01:Keyboard

目录

一、Keyboard

(1)资源介绍

        🔅原理图

        🔅扫描原理

(2)STM32CubeMX 软件配置

(3)代码编写

(4)实验现象

二、Keyboard接口函数封装

三、踩坑日记

(1)上拉电阻问题


一、Keyboard

(1)资源介绍

        🔅原理图

        蓝桥杯物联网竞赛实训平台提供了一个拓展接口 EXTEND MODULE,所有拓展模块均可直接安装在 Lora 终端上使用;

图1        拓展接口

        2×3 矩阵键盘模块电路原理图如下所示:

图2        Keyboard电路原理图

         通过两张电路图连接可知,引脚资源配置情况为:

表1 引脚资源配置情况
KeyboardMCU
COLUMN_1PB3
COLUMN_2PA15
COLUMN_3PA0
ROW_1PA12
ROW_2PA11
        🔅扫描原理

        1️⃣行扫描:所有行线作为输入端口,列线作为输出端口。逐个拉低列线输出,检测对应行是否读到低电平,若有即可确定按键触发位置;

        2️⃣列扫描:与行扫描相反。所有列线作为输入端口,行线作为输出端口。逐个拉低行线输出,检测对应列是否读到低电平,从而确定按键触发位置;

        本文将通过列扫描方式使用矩阵键盘模块;

(2)STM32CubeMX 软件配置


🔅“工程建立、时钟树配置、Debug 串行线配置、代码生成配置” 在下文中有讲解,这里不再赘述❗️

【蓝桥杯——物联网设计与开发】Part1:GPIOhttps://blog.csdn.net/m0_63116406/article/details/144894900?spm=1001.2014.3001.55011️⃣点击引脚 PA12 PA11 → 选择 GPIO_Input 模式;

2️⃣点击"System Core""GPIO", 将 PA12 PA11 "GPIO Pull-up/Pull-down" 栏修改为 "Pull-up" ,即将 PA12 PA11 引脚初始化为带上拉电阻的输入引脚;

图3        输入引脚配置

3️⃣点击引脚 PA0 、 PA15  PB3 → 选择 GPIO_Output 模式;

4️⃣点击"System Core""GPIO", 将 PA0 、 PA15  PB3 "GPIO output level" 栏修改为 "High",即将 PA0 、 PA15  PB3 引脚初始化为高电平

图4        输出引脚配置

5️⃣配置 OLED

6️⃣生成代码即可;

(3)代码编写

🟢️main 函数

/* USER CODE BEGIN Includes */
#include "oled.h"
#include <stdio.h>
/* USER CODE END Includes *//* USER CODE BEGIN PV */
uint8_t puc_oled[17];
/* USER CODE END PV *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */uint8_t key_val = 0;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_I2C1_Init();/* USER CODE BEGIN 2 */OLED_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){key_val = ' ';/* 按键扫描 */HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);	//	第一列HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0){HAL_Delay(10);	// 延时消抖if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0){key_val = '1';while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0);	//	抬手检测}}if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0){HAL_Delay(10);	// 延时消抖if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0){key_val = '4';while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0);	//	抬手检测}}HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);	//	第二列HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0){HAL_Delay(10);	// 延时消抖if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0){key_val = '2';while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0);	//	抬手检测}}if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0){HAL_Delay(10);	// 延时消抖if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0){key_val = '5';while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0);	//	抬手检测}}HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);	//	第三列if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0){HAL_Delay(10);	// 延时消抖if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0){key_val = '3';while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0);	//	抬手检测}}if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0){HAL_Delay(10);	// 延时消抖if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0){key_val = '6';while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0);	//	抬手检测}}/* 键值显示 */sprintf((char*)puc_oled, "  Key value:%c   ", key_val);OLED_ShowString(0, 0, puc_oled, 16);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

(4)实验现象

        按下按键后,OLED 屏幕上会显示对应键值。


二、Keyboard接口函数封装

🟡️Keyboard扫描函数

uint8_t key_read(void)
{uint8_t key_val = 0;/* 按键扫描 */HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);	//	第一列HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0)key_val = '1';else if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0)key_val = '4';HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);	//	第二列HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0)key_val = '2';else if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0)key_val = '5';HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);	//	第三列if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0)key_val = '3';else if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0)key_val = '6';return key_val;
}

🔴Keyboard接口函数调用实例

/* 按键处理任务函数 */
void task_keys(void)
{uint8_t key_down, key_tmp;static uint8_t key_old = 0;// 10ms 调用一次if(cnt_10ms < 10)	return;cnt_10ms = 0;// 边沿检测key_tmp = key_read();key_down = key_tmp & (key_tmp ^ key_old);key_old = key_tmp;// 下降沿逻辑处理if(key_down){OLED_Clear();sprintf((char*)puc_oled, "  Key value:%c   ", key_down);OLED_ShowString(0, 0, puc_oled, 16);}
}

三、踩坑日记

(1)上拉电阻问题

  • 列扫描时,对应的引脚需配置为带上拉电阻的输入模式
  • 行扫描时,对应的引脚需配置为带上拉电阻的输入模式

        🔅如果不带有上拉电阻,则在按键未按下的时候,输入引脚的电平处于不确定的状态,导致读入数据不稳定;而带有上拉电阻,可将引脚电平钳制为高电平,在按键按下时才变化为低电平

       

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

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

相关文章

【机器人】复现 GrainGrasp 精细指导的灵巧手抓取

GrainGrasp为每个手指提供细粒度的接触指导&#xff0c;为灵巧手生成精细的抓取策略。 通过单独调整每个手指的接触来实现更稳定的抓取&#xff0c;从而提供了更接近人类能力的抓取指导。 论文地址&#xff1a;GrainGrasp: Dexterous Grasp Generation with Fine-grained Con…

解锁 AWX+Ansible 自动化运维新体验:快速部署实战

Ansible 和 AWX 是自动化运维领域的强大工具组合。Ansible 是一个简单高效的 IT 自动化工具&#xff0c;而 AWX 则是 Ansible 的开源 Web 管理平台&#xff0c;提供图形化界面来管理 Ansible 任务。本指南将带你一步步在 Ubuntu 22.04 上安装 Ansible 和 AWX&#xff0c;使用 M…

Vulhub-jangow-01-1.0.1通关攻略

第0步&#xff1a; 打开靶机&#xff0c;按下shift&#xff0c;出现下图界面 在此页面按下e键&#xff0c;进入如下界面&#xff0c; 将ro 替换为 rw signie init/bin/bash 替换完毕后&#xff0c;按下Ctrl键X键&#xff0c;进入如下页面 ip a查看网卡信息 编辑配置文件网卡信…

默克生命科学 | ProClin™安全、高效防腐剂

ProClin™防腐剂是水溶性抗菌剂&#xff0c;是体外诊断(IVD)行业中最有效的抗菌剂之一&#xff0c;广泛应用于行业领先的诊断生产商的1,000多种FAD注册IVD试剂盒。低工作浓度下&#xff0c;ProClin™产品有效快速地抑制广谱微生物&#xff0c;有助于延长IVD试剂的保质期。 有别…

const应用

最近学校的花开了&#xff0c;选了一张三号楼窗前的白玉兰&#xff0c;(#^.^#) 1.修饰普通变量 当 const 用于修饰普通变量时&#xff0c;该变量的值在初始化之后就不能再改变。 #include <stdio.h>int main() {const int num 10;// num 20; // 错误&#xff0c;不…

FastStoneCapture下载安装教程(附安装包)专业截图工具

文章目录 前言FastStoneCapture下载FastStoneCapture安装步骤FastStoneCapture使用步骤 前言 在日常工作与学习里&#xff0c;高效截图工具至关重要。本教程将为你呈现FastStoneCapture下载安装教程&#xff0c;助你轻松拥有。 FastStoneCapture下载 FastStone Capture 是一款…

3. 轴指令(omron 机器自动化控制器)——>MC_ResetFollowingError

机器自动化控制器——第三章 轴指令 13 MC_ResetFollowingError变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启动运动指令▶多重启运动指令▶异常 MC_ResetFollowingError 对指令当前位置和反馈当前位置的偏差进行复位。 指令名称FB/FUN图形表现S…

【HTML5游戏开发教程】零基础入门合成大西瓜游戏实战 | JS物理引擎+Canvas动画+完整源码详解

《从咖啡杯到财务自由&#xff1a;一个程序员的合成之旅——当代码遇上物理引擎的匠心之作》 &#x1f31f; 这是小游戏开发系列的第四篇送福利文章&#xff0c;感谢一路以来支持和关注这个项目的每一位朋友&#xff01; &#x1f4a1; 文章力求严谨&#xff0c;但难免有疏漏之…

举例说明自然语言处理(NLP)技术

当我们使用智能助手或社交媒体平台时&#xff0c;就会接触到自然语言处理&#xff08;NLP&#xff09;技术的应用。以下是一些常见的例子&#xff1a; 语音识别&#xff1a;当我们与智能助手如Siri、Alexa或Google Assistant交互时&#xff0c;我们说出语音命令&#xff0c;系统…

ResNet与注意力机制:深度学习中的强强联合

引言 在深度学习领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;一直是图像处理任务的主流架构。然而&#xff0c;随着网络深度的增加&#xff0c;梯度消失和梯度爆炸问题逐渐显现&#xff0c;限制了网络的性能。为了解决这一问题&#xff0c;ResNet&#xff08;残差…

【设计模式】组合模式

第11章 组合模式 11.1 一个基本的目录内容遍历范例 组合模式用于处理树形结构数据&#xff0c;如操作系统目录。以下是目录遍历的非组合模式实现&#xff1a; 文件类定义 class File { public:File(string name) : m_sname(name) {}void ShowName(string lvlstr) {cout <…

DSP28335 eCAN(增强型控制器局域网)

一、概述 1.1 特征 can协议2.0 ,高达1Mbps32个邮箱 1)—可配置接收或发送—可配置标准或扩展标识符—接收标识符屏蔽功能—支持数据和远程帧—支持0到8字节的数据帧—在接收和发送的消息上使用32位时间戳(发送接收计时器)—接收新消息保护—允许动态可编程的发送消息优先…

现代控制原理

一、在状态空间中&#xff0c;建立控制系统的数学模型 如&#xff1a;有单输入&#xff08;U)--单输出&#xff08;Y)控制系统&#xff0c;其状态方程和输出方程如下图&#xff1a; 二、画状态结构图 将上述状态方程转化为状态结构图有&#xff1a; 三、高阶控制系统的状态方…

【Git】基础使用

Git基础使用 基础配置工作区-暂存区-版本库添加文件修改文件版本回退撤销修改删除文件分支管理强制删除分支 基础配置 初始化仓库&#xff1a; git init # 此时就会生成一个 .git 的文件夹&#xff0c;切勿修改或删除文件夹里的内容配置仓库——名字&#xff1a; git config…

系统与网络安全------网络应用基础(2)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 交换机 认识交换机 交换机&#xff0c;Switch 用户将多台计算机/交换机连接在一起&#xff0c;组建网络 交换机负责为其中任意两台计算机提供独享线路进行通信 非网管型交换机 即插即用交换机 即插即用&…

【xiaozhi赎回之路-2:语音可以自己配置就是用GPT本地API】

固件作用 打通了网络和硬件的沟通 修改固件实现【改变连接到小智服务器的】 回答逻辑LLM自定义 自定义了Coze&#xff08;比较高级&#xff0c;自定义程度比较高&#xff0c;包括知识库&#xff0c;虚拟脚色-恋人-雅思老师-娃娃玩具{可能需要使用显卡对开源模型进行微调-产…

蓝桥杯——嵌入式学习日记

因为lED和LCD共用PC8~PC15引脚&#xff0c;要通过锁存&#xff08;LE&#xff09;和&#xff08;GPIOC->ODR&#xff09;来避免LED和LCD引脚冲突 修改点: main.c中&#xff0c;GPIO初始化引脚后&#xff0c;LE&#xff08;PD2引脚低电平锁存&#xff0c;退出透明模式&…

Liunx系统Microsoft SQL Server数据库还原

1.确认Linux系统已安装SQLServer服务并启动 2.在Windows中使用SSMS连接原数据库与Linux远程数据库服务 3.备份 成功备份如下 4.上传bak文件到远程Linux服务器 登陆Linux服务并创建数据库文件夹 退出Linux服务

【学习资源】多元时序分析问题和时序图模型

工业数据分析领域中&#xff0c;多元时序数据分析是一个广泛的问题。今天和大家简单介绍多元时序预测、聚类、分类、时序图模型和相应的深度学习库。 图片来源&#xff1a;https://www.researchgate.net/publication/349207209_Multivariate_Time-Series_Anomaly_Detection_via…

QT二 QT使用generate form 生成常用UI,各种UI控件

一 。没有使用general form 和 使用 general form 后&#xff0c;file层面和代码层面的不同比较 file层面的不同 代码层面的不同&#xff0c; 在 使用了general form之后&#xff0c;在主界面的构造方法中&#xff0c;使用ui->setupUi(this),就完成了所有UI的处理。 而之…