STM32控制矩阵按键,HAL库,cubeMX配置

STM32控制矩阵按键,HAL库,cubeMX配置



前言

我使用的是STM32F103RCT6这款单片机,HAL库,使用cubeMX配置。

使用矩阵按键实现功能的方法为轮询法

cubeMX中的配置·

1.首先矩阵键盘原理图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5TKPCzRp-1655352433290)(C:\Users\wangyin\AppData\Roaming\Typora\typora-user-images\image-20220615163312205.png)]

2.实物图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qdK50ugy-1655352433292)(C:\Users\wangyin\AppData\Roaming\Typora\typora-user-images\image-20220616113621657.png)]

按照矩阵键盘接法,16个按键需要8个io口,我选择了PC口的0~7号引脚,前四个依次接矩阵键盘的行,后四个依次接矩阵键盘的列;矩阵键盘的每一个按键都是接了两个io口,也就是一端必须是输出高电平或者低电平,另一端去检测是否是高电平或者低电平;所以只需要配置行线或者列线为输出,则另外一端就配置为输入检测。

3.cubeMX的配置图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-itrcFIVU-1655352433293)(C:\Users\wangyin\AppData\Roaming\Typora\typora-user-images\image-20220616113915873.png)]

PC0-PC3配置为推挽输出低电平:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L3bGQemx-1655352433294)(C:\Users\wangyin\AppData\Roaming\Typora\typora-user-images\image-20220616114116476.png)]

PC4~PC7配置为输入模式,上拉:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YRDwBZnR-1655352433295)(C:\Users\wangyin\AppData\Roaming\Typora\typora-user-images\image-20220616114219022.png)]

推挽输出(英语:Push–pull output)是一种使用一对选择性地从相连负载灌电流或者拉电流的器件的电路。它常常使用一对参数相同的功率三极管或MOSFET管,以推挽方式存在于电路中。

**开漏输出:**开漏输出就是不输出电压,控制输出低电平时引脚接地,控制输出高电平时引脚既不输出高电平,也不输出低电平,为高阻态。

PA4-PA7配置为外部中断,下降沿触发,上拉,之所以这样配置,是因为我们PA0-PA3配置的是输出低电平,所以我们需要先上拉,让他那个引脚默认输入高电平,只有按下按键,两引脚想通才会由高电平变为低电平,所以我们需要按下按键触发的话也就是由高到低的时候,也就是下降沿触发。

keil程序中的编写

首先创建一个key.c文件和一个key.h文件

key.c

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bU260TB5-1655352433296)(C:\Users\wangyin\AppData\Roaming\Typora\typora-user-images\image-20220616115209288.png)]

GPIO->IDR和0xf7相与, 若是0xe7 则二进制位1110 0111,说明PC4变为了0,所以第一列的按键s1按下

注意PC7对应二进制数中的最高位 PC0对应最低位

后面以此类推


注意,可能出现有些行未扫描,有些行的按键按下没有通过串口返回信息
解决方法是,在每一行的扫描之前,将行所对应的引脚清空,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qmJkCfyW-1655352433297)(C:\Users\wangyin\AppData\Roaming\Typora\typora-user-images\image-20220616115245044.png)]

key.h

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2asttusv-1655352433298)(C:\Users\wangyin\AppData\Roaming\Typora\typora-user-images\image-20220616115908932.png)]

测试结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zTaiqdNV-1655352433299)(C:\Users\wangyin\AppData\Roaming\Typora\typora-user-images\image-20220616115331548.png)]

结果显示正确,成功运行

程序代码链接

https://download.csdn.net/download/cubejava/85656823
追求卓越,成功才会在不经意间追上你!

### 关于STM32CubeMax中实现矩形键盘的方法 在嵌入式开发领域,使用STM32控制器通过外设接口控制矩阵键盘是一种常见的需求。然而,在官方文档和教程中并未直接提及“矩形键盘”的具体实现方式[^1]。通常情况下,“矩形键盘”可以理解为一种特殊的矩阵键盘布局,其设计可能涉及更多的行或列以适应特定的应用场景。 以下是基于现有资源和技术背景整理的解决方案: #### 1. 矩阵键盘的工作原理 矩阵键盘利用行列扫描技术来检测按键状态。对于一个N×M的矩阵键盘,可以通过配置GPIO端口作为输入和输出引脚来实现扫描功能。例如,设置前几根引脚为输出(用于驱动行),其余引脚为输入(用于读取列的状态)。当某个键被按下时,对应的行和列会产生电平变化,从而识别按键位置[^4]。 #### 2. 配置GPIO端口 在STM32CubeMX工具中,可以通过以下步骤配置GPIO端口: - 打开STM32CubeMX软件并加载目标芯片型号。 - 进入Pinout & Configuration界面,选择合适的GPIO引脚分配给矩阵键盘的行和列。 - 将这些引脚分别配置为推挽输出模式(用于行)以及上拉/下拉输入模式(用于列)[^5]。 #### 3. 编写初始化代码 生成工程文件后,需编写相应的初始化函数以完成硬件准备阶段的任务。下面是一个简单的示例代码片段展示如何定义行与列的关系: ```c // 假设有44列的矩阵键盘 #define ROWS 4 #define COLS 4 uint16_t rowPins[ROWS] = { GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3 }; // 行引脚 uint16_t colPins[COLS] = { GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7 }; // 列引脚 void MatrixKeypad_Init(void){ HAL_GPIO_WritePin(GPIOA, rowPins[0], GPIO_PIN_RESET); // 初始化行为低电平 HAL_GPIO_WritePin(GPIOA, rowPins[1], GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, rowPins[2], GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, rowPins[3], GPIO_PIN_RESET); /* 设置列为高阻态 */ HAL_GPIO_ReadPin(GPIOA, colPins[0]); HAL_GPIO_ReadPin(GPIOA, colPins[1]); HAL_GPIO_ReadPin(GPIOA, colPins[2]); HAL_GPIO_ReadPin(GPIOA, colPins[3]); } ``` #### 4. 实现扫描逻辑 为了有效获取当前按下的键值,需要周期性执行扫描操作。这一步骤可通过定时器中断或者主循环内的轮询机制触发。下面是基本算法框架: ```c int ScanMatrixKey(){ int keyVal=-1; for(int i=0;i<ROWS;i++){ // 当前行激活 HAL_GPIO_WritePin(GPIOA, rowPins[i], GPIO_PIN_SET); for(int j=0;j<COLS;j++){ if(HAL_GPIO_ReadPin(GPIOA, colPins[j]) == GPIO_PIN_SET){ keyVal=i*COLS+j; // 计算唯一编号表示该按键 break; } } // 复位当前行至未选通状态 HAL_GPIO_WritePin(GPIOA, rowPins[i], GPIO_PIN_RESET); if(keyVal>=0){return keyVal;} } return -1; // 如果无任何按键被按下则返回负数标志符 } ``` 上述代码实现了基础的功能模块,实际应用过程中还需要考虑去抖动处理等问题[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值