【外设移植】【矩阵键盘】USB设备之USB键盘 补充篇

[复制链接]
查看2005 | 回复18 | 2024-1-22 11:41:20 | 显示全部楼层 |阅读模式

先前发过USB键盘的帖子:

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

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

Snipaste_2024-01-22_10-43-58.png

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

image.png

就是上图这样子的。

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

#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[i], GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
        bflb_gpio_set(gpio, rows[i]);
    }

    // 列线设置为输入模式,上拉输入模式
    for(uint8_t i=0; i<cols_cnt; i++)
    {
        bflb_gpio_init(gpio, cols[i], 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[i]);
        // 读取列线
        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[i]);   
    }
    return val;
}

在主函数中:

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);
    }
}

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

本帖被以下淘专辑推荐:

选择去发光,而不是被照亮
回复

使用道具 举报

曹县 | 2024-1-22 11:46:01 | 显示全部楼层
回复

使用道具 举报

1084504793 | 2024-1-22 11:51:29 | 显示全部楼层
回复

使用道具 举报

bzhou830 | 2024-1-22 12:19:51 | 显示全部楼层
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

WangChong | 2024-1-22 13:32:17 | 显示全部楼层
不公平 太简单了
回复 支持 反对

使用道具 举报

bzhou830 | 2024-1-22 13:42:21 | 显示全部楼层

哈哈,这这个是和前面一起的,全部一起是一个
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

WT_0213 | 2024-1-22 13:42:23 | 显示全部楼层
回复

使用道具 举报

bzhou830 | 2024-1-22 13:43:22 | 显示全部楼层
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

WT_0213 | 2024-1-22 13:44:09 | 显示全部楼层

摸鱼刚好看到 ,赶进给顶以下。
回复 支持 反对

使用道具 举报

爱笑 | 2024-1-22 13:46:39 | 显示全部楼层
补充到一篇里去,不要分散几个帖子了。
用心做好保姆工作
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则