Skip to content

由 bzhou830 贡献,Ai-Thinker 进行整理

先前发过USB键盘的帖子:

【外设移植】USB设备之USB键盘+M61开发板 - DIY 经验分享 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)

按照园长的要求,需要补充上矩阵键盘的代码。这里使用小美送我的DSL板子来接矩阵键盘。因为DSL板子上正好有引出来的IO,插上杜邦线就能用,简直不要太美好。

硬件接线上只接接印出来的排针左边的一排。手头上用的是3*4的矩阵键盘,所有需要7个IO.

就是上图这样子的。

矩阵键盘的扫描原理很简单,就是逐个的拉低行线,然后读取对应一列的列线来判断按键是否有响应。代码也非常的简单:

cpp
#include "bflb_gpio.h"
#include "board.h"

struct bflb_device_s *gpio;

// 矩阵键盘的行线和列线的定义
const uint8_t rows[] = {GPIO_PIN_33, GPIO_PIN_32, GPIO_PIN_31};
const uint8_t cols[] = {GPIO_PIN_30, GPIO_PIN_29, GPIO_PIN_27, GPIO_PIN_25};

const uint8_t rows_cnt = sizeof(rows) / sizeof(rows[0]);
const uint8_t cols_cnt = sizeof(cols) / sizeof(cols[0]);

// 初始化gpio状态
void matrix_keys_init()
{
    gpio = bflb_device_get_by_name("gpio");

    // 行线设置成输出模式,输出为低电平
    for (uint8_t i = 0; i < rows_cnt; i++) {
        bflb_gpio_init(gpio, rows, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
        bflb_gpio_set(gpio, rows);
    }

    // 列线设置为输入模式,上拉输入模式
    for (uint8_t i = 0; i < cols_cnt; i++) {
        bflb_gpio_init(gpio, cols, GPIO_INPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
    }
}

// 矩阵键盘扫描
uint16_t get_key_val()
{
    uint16_t val = 0;
    for (size_t i = 0; i < rows_cnt; i++) {
        // 拉低行线
        bflb_gpio_reset(gpio, rows);

        // 读取列线
        for (size_t j = 0; j < cols_cnt; j++) {
            if (bflb_gpio_read(gpio, cols[j]) == 0) {
                bflb_mtimer_delay_ms(10);
                if (bflb_gpio_read(gpio, cols[j]) == 0) {
                    val |= (1 << ((i * cols_cnt) + j));
                }
            }
        }

        // 拉高行线
        bflb_gpio_set(gpio, rows);
    }
    return val;
}

在主函数中:

cpp
void matrix_keys_task(void *params)
{
    int key_val = 0;
    matrix_keys_init();
    while (1)
    {
        key_val = get_key_val();
        printf("%x\r\n", key_val);
        bflb_mtimer_delay_ms(10);
    }
}

这样矩阵键盘的扫描就实现好了,是不是很简单!赶紧来试一把吧。

遇到问题?

如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

Released under the MIT License. Build Time 2026-09-11 14:52:23