STM32F429IGT6 矩阵键盘按键检测 - For循环实现
#include "stm32f429xx.h"
// 定义矩阵键盘的行和列数 #define ROWS 4 #define COLS 4
// 定义矩阵键盘的行和列引脚 #define ROW1_PIN GPIO_PIN_0 #define ROW1_PORT GPIOA #define ROW2_PIN GPIO_PIN_1 #define ROW2_PORT GPIOA #define ROW3_PIN GPIO_PIN_2 #define ROW3_PORT GPIOA #define ROW4_PIN GPIO_PIN_3 #define ROW4_PORT GPIOA
#define COL1_PIN GPIO_PIN_4 #define COL1_PORT GPIOA #define COL2_PIN GPIO_PIN_5 #define COL2_PORT GPIOA #define COL3_PIN GPIO_PIN_6 #define COL3_PORT GPIOA #define COL4_PIN GPIO_PIN_7 #define COL4_PORT GPIOA
int main(void) { // 初始化GPIO引脚为输入模式 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pin = ROW1_PIN;
HAL_GPIO_Init(ROW1_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = ROW2_PIN;
HAL_GPIO_Init(ROW2_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = ROW3_PIN;
HAL_GPIO_Init(ROW3_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = ROW4_PIN;
HAL_GPIO_Init(ROW4_PORT, &GPIO_InitStruct);
// 初始化GPIO引脚为输出模式
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pin = COL1_PIN;
HAL_GPIO_Init(COL1_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = COL2_PIN;
HAL_GPIO_Init(COL2_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = COL3_PIN;
HAL_GPIO_Init(COL3_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = COL4_PIN;
HAL_GPIO_Init(COL4_PORT, &GPIO_InitStruct);
// 矩阵键盘按键布局
uint8_t keys[ROWS][COLS] = {
{1, 2, 3, 'A'},
{4, 5, 6, 'B'},
{7, 8, 9, 'C'},
{'*', 0, '#', 'D'}
};
while (1)
{
// 扫描矩阵键盘
for (int row = 0; row < ROWS; row++)
{
// 设置当前行为低电平,其他行为高电平
switch (row)
{
case 0:
HAL_GPIO_WritePin(ROW1_PORT, ROW1_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(ROW2_PORT, ROW2_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(ROW3_PORT, ROW3_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(ROW4_PORT, ROW4_PIN, GPIO_PIN_SET);
break;
case 1:
HAL_GPIO_WritePin(ROW1_PORT, ROW1_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(ROW2_PORT, ROW2_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(ROW3_PORT, ROW3_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(ROW4_PORT, ROW4_PIN, GPIO_PIN_SET);
break;
case 2:
HAL_GPIO_WritePin(ROW1_PORT, ROW1_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(ROW2_PORT, ROW2_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(ROW3_PORT, ROW3_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(ROW4_PORT, ROW4_PIN, GPIO_PIN_SET);
break;
case 3:
HAL_GPIO_WritePin(ROW1_PORT, ROW1_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(ROW2_PORT, ROW2_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(ROW3_PORT, ROW3_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(ROW4_PORT, ROW4_PIN, GPIO_PIN_RESET);
break;
}
// 判断当前行的列是否有按键按下
for (int col = 0; col < COLS; col++)
{
if (HAL_GPIO_ReadPin(COL1_PORT, COL1_PIN << col) == GPIO_PIN_RESET)
{
// 按键被按下
// 处理按键按下的逻辑,例如发送按键事件等
uint8_t key = keys[row][col];
// TODO: 处理按键按下的逻辑
}
}
}
}
}
原文地址: https://www.cveoy.top/t/topic/pjzl 著作权归作者所有。请勿转载和采集!