STM32F103 实现 4x4 矩阵键盘的扫描(行列扫描法)
创作时间:
作者:
@小白创作中心
STM32F103 实现 4x4 矩阵键盘的扫描(行列扫描法)
引用
CSDN
1.
https://blog.csdn.net/m0_72123696/article/details/136783421
本文将详细介绍如何使用STM32F103微控制器实现4x4矩阵键盘的扫描功能。通过行列扫描法,可以有效地检测键盘上的按键输入。文章包含了详细的硬件接线图、源代码以及主函数的调用示例,适合对嵌入式开发感兴趣的读者学习参考。
实物图
硬件接线图
STM32F103C8T6 | 4x4 |
|---|---|
A0 | C4 |
A1 | C3 |
A2 | C2 |
A3 | C1 |
A4 | R1 |
A5 | R2 |
A6 | R3 |
A7 | R4 |
实现原理
遍历矩阵的每一行,开始时将当前遍历的行设置为低电平,再扫描每一列并判断找出为低电平的列号,符合要求时记录行号和列号。结束当前行时再将当前行设置为高电平。
源代码
matrix_key.h
#ifndef __MATRIX_KEY__
#define __MATRIX_KEY__
#include <stm32f10x.h>
#define ROW_PINS (GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7) // 定义行引脚为GPIOA的4、5、6、7
#define COL_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3) // 定义列引脚为GPIOA的0、1、2、3
// 第1行
#define MATRIX_KEY_S1 0x18 // 0001 1000
#define MATRIX_KEY_S2 0x14 // 0001 0100
#define MATRIX_KEY_S3 0x12 // 0001 0010
#define MATRIX_KEY_S4 0x11 // 0001 0001
// 第2行
#define MATRIX_KEY_S5 0x28 // 0010 1000
#define MATRIX_KEY_S6 0x24 // 0010 0100
#define MATRIX_KEY_S7 0x22 // 0010 0010
#define MATRIX_KEY_S8 0x21 // 0010 0001
// 第3行
#define MATRIX_KEY_S9 0x48 // 0100 0100
#define MATRIX_KEY_S10 0x44 // 0100 0100
#define MATRIX_KEY_S11 0x42 // 0100 0010
#define MATRIX_KEY_S12 0x41 // 0100 0001
// 第4行
#define MATRIX_KEY_S13 0x88 // 1000 1000
#define MATRIX_KEY_S14 0x84 // 1000 0100
#define MATRIX_KEY_S15 0x82 // 1000 0010
#define MATRIX_KEY_S16 0x81 // 1000 0001
void Init_Matrix_Key(void);
void Scan_Matrix_Key(void (*Call_Back)(uint8_t));
#endif
matrix_key.c
#include <stm32f10x.h>
#include <Delay.h>
#include <matrix_key.h>
void Init_Matrix_Key(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
// 设置行引脚为推挽输出
GPIO_InitStructure.GPIO_Pin = ROW_PINS;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 设置列引脚为上拉输入
GPIO_InitStructure.GPIO_Pin = COL_PINS;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Scan_Matrix_Key(void (*Call_Back)(uint8_t)) {
uint8_t row, col;
uint8_t keyDetected = 0;
for (row = 0; row < 4; row++) { // 遍历行
GPIO_ResetBits(GPIOA, 1 << (row + 4)); // 将当前行置为低电平,注意这里使用1 << (row + 4)来选中行
Delay_us(10); // 短暂延时以稳定电平
for (col = 0; col < 4; col++) { // 遍历列
if (GPIO_ReadInputDataBit(GPIOA, 1 << col) == Bit_RESET) { // 判断该列是否为低电平
Delay_ms(100); // 延时去抖动
if (GPIO_ReadInputDataBit(GPIOA, 1 << col) == Bit_RESET) { // 再次检查,确认按键被按下
keyDetected = (1 << col) | (1 << (row + 4)); // 记录按键位置
Call_Back(keyDetected);
break; // 跳出列循环,因为同一时间只能有一个按键被按下
}
while(GPIO_ReadInputDataBit(GPIOA, 1 << col) == Bit_RESET);// 等待弹起
}
}
GPIO_SetBits(GPIOA, 1 << (row + 4)); // 恢复该行至高电平
if (keyDetected) {
break; // 如果检测到按键,跳出行循环
}
}
}
main.c
void Matrix_Key_Callback(uint8_t key) {
switch(key) {
case MATRIX_KEY_S1:
// TODO
break;
}
}
int main(void) {
Init_Matrix_Key(); // 初始化
while (1) {
Scan_Matrix_Key(Matrix_Key_Callback);
}
}
你可以在串口中输出按键的号码,以便进行调试和验证。
热门推荐
老年人真的需要每天万步走吗?
Swift开发实战:两种方式精准计算跑步距离
糖尿病并发症多,日常饮食作息6要诀!中医师推荐喝「这汤」降血糖
控烟推进面临挑战, 女性和青少年或为破局关键
中医治疗糖尿病的五种方法
一旅客带30万美元现金出境,无申报通关被大兴机场海关查获
李燕画家作品最新价格,李燕画作市场最新估价解析
一周艺术人物|曾成钢解读雕塑艺术,复旦呈现“文武生智”
哈尔滨冰雪大世界:《宇宙护卫队》亲子互动新体验
《漫威银河护卫队》:超英题材改编游戏新标杆?
清代宫廷御制:乾隆时期的鼻烟壶艺术
冀派内画鼻烟壶:方寸之间的艺术传奇
乾隆鼻烟壶:收藏界的潜力股!
手机漏电问题解析:识别原因、处理方法和预防措施
《咬文嚼字》发布2024年十大流行语 2024年网络流行词出炉
好虫or坏虫?全国生态日,来了解虫虫~
软件开发遇到bug,一般如何处理
猫咪需要洗澡吗?日常清洁4大重点部位全解析
猫咪的鼻子为什么总是湿湿的,是流鼻涕吗?资深猫奴:当然不是
猫咪鼻子湿湿的正常吗?从猫咪鼻子看健康状况
古诗词取名:文化传承与现代审美的平衡
弗洛伊德教你如何用本能拍出恐怖片
白姓女孩取名攻略:从古诗词中寻找诗意与文化
《京城81号》:一座古宅的百年传奇与文化密码
周末打卡:南浔古镇&仙山湖
打卡湖州古韵:衣裳街&小西街
牛接种什么疫苗?保护我们的农场动物健康不可或缺
智慧养牛:如何通过数据分析提升养殖效益
淘宝禁止销售香烟的背后:烟草专卖制度与电商平台监管
福州茉莉花茶:千年技艺的传承与创新