#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: 处理按键按下的逻辑
            }
        }
    }
}

}

STM32F429IGT6 矩阵键盘按键检测 - For循环实现

原文地址: https://www.cveoy.top/t/topic/pjzl 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录