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。
注意要将端口模式也变才行。