Stm32F103C8T6检测矩阵按键

1目的

通过stm32检测4*4矩阵案件。

// 定义键值映射,具体值可以根据实际键盘标识配置
const char keymap[4][4] = {
    {'1', '2', '3', 'A'},
    {'4', '5', '6', 'B'},
    {'7', '8', '9', 'C'},
    {'*', '0', '#', 'D'}
};
 

2实现方式

2.1遍历方式

将4个端口配置为输入,4个端口配置为输出,然后依次将输出的列拉低,检测行。


void Matrix_Keypad_Init(void) {
    // 初始化列引脚为输出并设置为高
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin = C0_Pin | C1_Pin | C2_Pin | C3_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
    HAL_GPIO_WritePin(GPIOx, C0_Pin | C1_Pin | C2_Pin | C3_Pin, GPIO_PIN_SET); // 初始设为高电平

    // 初始化行引脚为输入并启用上拉
    GPIO_InitStruct.Pin = R0_Pin | R1_Pin | R2_Pin | R3_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
}

char Matrix_Keypad_Scan(void) {
    // 遍历每一列
    for (uint8_t col = 0; col < 4; ++col) {
        // 将当前列设置为低电平
        HAL_GPIO_WritePin(GPIOx, C0_Pin | C1_Pin | C2_Pin | C3_Pin, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOx, (C0_Pin << col), GPIO_PIN_RESET);
        
        // 扫描每一行
        for (uint8_t row = 0; row < 4; ++row) {
            if (HAL_GPIO_ReadPin(GPIOx, (R0_Pin << row)) == GPIO_PIN_RESET) {
                // 返回键值
                return keymap[row][col];
            }
        }
    }
    return '\0'; // 如果没有检测到按键按下,返回空字符
}

2.2拼接方式

将4个端口设置为高,4个端口设置为低,端口电平0X0f 读4个端口数据,然后将高的4个端口设置低,4个低端口设为高,端口电平0Xf0。然后将2次读到的电平&,得到唯一值,如0x62。

注意要将端口模式也变才行。

### STM32F103C8T6 矩阵按键驱动方法 对于STM32F103C8T6单片机而言,矩阵键盘通过将按键按照行列形式排列并连接到微控制器的不同引脚上来工作。具体来说,矩阵按键的每一行和每列都连接至不同的GPIO引脚,在这些引脚之间形成交叉点即代表各个独立的按键位置。 为了识别哪个具体的按钮被按下,程序会依次设置某一行的状态为高电平而其余行为低电平;接着读取各列状态来确定是否有任何一列表现出高电平——这表明该交点处有键闭合[^1]。此过程需循环遍历所有行以覆盖整个矩阵中的每一个可能的位置。 下面给出一段用于初始化以及获取当前按下的键值的简单代码示例: ```c #include "stm32f1xx_hal.h" #define ROWS 4 #define COLS 4 // 定义行和列的 GPIO 引脚配置 static const uint16_t rowPins[] = {GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3}; static const uint16_t colPins[] = {GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7}; void KEY_Init(GPIO_TypeDef *port){ // 初始化端口模式 (推挽输出/浮空输入) GPIO_InitTypeDef GPIO_InitStruct = {0}; // 行设为输出 GPIO_InitStruct.Pin = rowPins[0]|rowPins[1]|rowPins[2]|rowPins[3]; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(port, &GPIO_InitStruct); // 列设为输入 GPIO_InitStruct.Pin = colPins[0]|colPins[1]|colPins[2]|colPins[3]; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLDOWN; // 使用下拉电阻防止悬空 HAL_GPIO_Init(port, &GPIO📐⚗ ⚗
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪法师解剖鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值