STM32单片机矩阵键盘
STM32单片机矩阵键盘
更多
在STM32单片机中实现矩阵键盘的步骤如下,采用常见的扫描方式(行扫描、列检测):
1. 硬件连接
- 4x4矩阵键盘:16个按键,4行 + 4列。
- 行线:连接到STM32的输出引脚(如PA0-PA3)。
- 列线:连接到STM32的输入引脚(如PA4-PA7),启用内部上拉电阻(默认高电平)。
2. 初始化GPIO
// 行引脚配置:推挽输出,初始高电平
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟
// 设置行(ROW0-ROW3: PA0-PA3)
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(GPIOA, &GPIO_InitStruct);
// 设置列(COL0-COL3: PA4-PA7),输入带上拉
GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 输入模式
GPIO_InitStruct.Pull = GPIO_PULLUP; // 启用上拉电阻
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
3. 键盘扫描函数
#define ROWS 4
#define COLS 4
// 定义行对应的GPIO引脚
uint16_t rowPins[ROWS] = {GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3};
// 定义列对应的GPIO引脚
uint16_t colPins[COLS] = {GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7};
// 扫描函数,返回按键值(0-15表示按键,-1表示无按键)
int8_t MatrixKey_Scan() {
for (uint8_t i = 0; i < ROWS; i++) {
// 当前行置低电平,其他行置高
for (uint8_t j = 0; j < ROWS; j++) {
HAL_GPIO_WritePin(GPIOA, rowPins[j], (j == i) ? GPIO_PIN_RESET : GPIO_PIN_SET);
}
HAL_Delay(1); // 稳定信号
// 检查列状态
for (uint8_t k = 0; k < COLS; k++) {
if (HAL_GPIO_ReadPin(GPIOA, colPins[k]) == GPIO_PIN_RESET) {
HAL_Delay(10); // 消抖
if (HAL_GPIO_ReadPin(GPIOA, colPins[k]) == GPIO_PIN_RESET) {
// 计算按键位置:行号 * 列数 + 列号
return (i * COLS + k);
}
}
}
}
return -1; // 无按键按下
}
4. 主循环调用
while (1) {
int8_t key = MatrixKey_Scan();
if (key != -1) {
printf("Key Pressed: %d\n", key); // 输出按键编号(0-15)
while (MatrixKey_Scan() != -1); // 等待释放
}
HAL_Delay(50); // 降低扫描频率
}
5. 关键点说明
- 消抖处理:检测到按键后延时10ms再次确认,避免机械抖动。
- 内部上拉:列引脚启用内部上拉,按键未按下时保持高电平。
- 等待释放:检测到按键后循环等待松开,避免重复触发。
- 按键编码:返回的键值(0~15)对应键盘位置:
0: (0,0) 1: (0,1) 2: (0,2) 3: (0,3) 4: (1,0) 5: (1,1) 6: (1,2) 7: (1,3) 8: (2,0) 9: (2,1) 10:(2,2) 11:(2,3) 12:(3,0) 13:(3,1) 14:(3,2) 15:(3,3)
6. 优化建议
- 中断扫描:若需低功耗,可用外部中断检测列线变化,再启动扫描。
- 状态机消抖:用定时器实现非阻塞式消抖,提高系统效率。
- 多键支持:改进算法支持组合键(需避免“幽灵键”问题)。
通过以上步骤,即可在STM32上实现稳定的矩阵键盘扫描功能。实际应用中需根据硬件连接调整引脚定义。
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机