先前发过USB键盘的帖子:
【外设移植】USB设备之USB键盘+M61开发板 - DIY 经验分享 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)
按照园长的要求,需要补充上矩阵键盘的代码。这里使用小美送我的DSL板子来接矩阵键盘。因为DSL板子上正好有引出来的IO,插上杜邦线就能用,简直不要太美好。
硬件接线上只接接印出来的排针左边的一排。手头上用的是3*4的矩阵键盘,所有需要7个IO.
就是上图这样子的。
矩阵键盘的扫描原理很简单,就是逐个的拉低行线,然后读取对应一列的列线来判断按键是否有响应。代码也非常的简单:
#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);
}
}
这样矩阵键盘的扫描就实现好了,是不是很简单!赶紧来试一把吧。 |