DIY一把属于自己的机械键盘(四)
软件篇(一)—— 按键扫描
回顾一下硬件篇矩阵键盘部分,为了方便软件扫描、提高扫描效率,我在每一行增加了一个上拉电阻,如图:
首先分析一下原理,经过电阻上拉,每一行的初始状态为高电平,那么要检测到按键事件对应行 K_ROWx 就应该出现低电平或下降沿才能检测。从图中可以看出产生低电平或下降沿由 COLx 控制,对应的只有软件逐列拉低 COLx 即可。这样一来只需要循环拉低 COLx,获取 K_ROWx 状态,扫描一次即可实现键值读取。例如,拉低 COL3,此时 K_ROW4 检测到下降沿,说明坐标 (4,3) 的按键被按下。
为了进一步提高扫描速率,我把 K_ROWx 和 COLx 分别接入一组 IO 口,这样就可以通过寄存器移位实现按键扫描,提升效率。弄清原理之后,写代码就轻松多了。下面看一下代码:
- 相关定义
#define COL_NUM 14
#define ROW_NUM 5#define KEY_PRESSED 0
#define KEY_UNPRESSED 1#define KEY_ROW_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY_ROW_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd
#define KEY_ROW_PORT GPIOA
#define KEY_ROW_PIN 0x001F#define KEY_COL_GPIO_CLK RCC_APB2Periph_GPIOB
#define KEY_COL_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd
#define KEY_COL_PORT GPIOB
#define KEY_COL_PIN 0x3FFF#define KEY_ROW_READ GPIOA->IDR & 0x001F // 取低5位
#define KEY_COL_OUT GPIOB->ODRconst u16 COL_Scan_Table[COL_NUM] = {0x3FFE, 0x3FFD, 0x3FFB, 0x3FF7,0x3FEF, 0x3FDF, 0x3FBF,
0x3F7F, 0x3EFF, 0x3DFF, 0x3BFF, 0x37FF,0x2FFF, 0x1FFF,
};u8 KeyBoard_KeyStatus_New[5][14] = {KEY_UNPRESSED};
- IO初始化
void Key_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;KEY_ROW_GPIO_APBxClkCmd(KEY_ROW_GPIO_CLK, ENABLE);KEY_COL_GPIO_APBxClkCmd(KEY_COL_GPIO_CLK, ENABLE);/* 这里用到了JTAG接口的IO,需要重定义 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);/* 行输入,外部上拉,低电平有效 */GPIO_InitStructure.GPIO_Pin = KEY_ROW_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(KEY_ROW_PORT, &GPIO_InitStructure); /* 列输出,低电平有效 */GPIO_InitStructure.GPIO_Pin = KEY_COL_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(KEY_COL_PORT, &GPIO_InitStructure); KEY_COL_OUT = 0x3FFF; // 全部列拉高
}
这里重点说明一下列输出 IO 的配置。首先讨论一下推挽输出的情况:当按下某一行的一个按键,此时该行电平被拉低,能够正常检测。但当这一行同时按下两个及以上按键时,由于列扫描是逐列移位拉低(即同一时刻有且只有一列为低电平),那么其他列如果也按下去的话,该行就会被多次上拉,导致无法完全拉低该行电平,进而导致无法识别同一行的多个按键。
该如何解决这个问题,从上面的分析可以得出同一行多个按键无法识别的根本原因是其他列的高电平导致了电平无法完全拉低。那么如果其他列也保持低电平呢? 显然是不行的,这样就无法检测到这一行到底是哪个按键被按下。因此,可以明确一点,同一时刻有且只能有一列为低电平。
那么除了高、低电平两个状态还有什么? 就是高阻态。将 IO 配置为开漏输出,就能保证同一时刻有且只有一列为低电平,同时其他列为高阻态,不会影响按键行电平。
- 按键扫描
void Key_Scan(void)
{u8 i,j;u8 row_data;for(i=0;i<COL_NUM;i++){KEY_COL_OUT = COL_Scan_Table[i]; // 列输出Delay_us(10);row_data = KEY_ROW_READ; // 获取行按键状态for(j=0;j<ROW_NUM;j++){KeyBoard_KeyStatus_New[j][i] = row_data & 0x01; // 获取按键状态row_data = row_data >> 1; // 行切换}}
}
程序中 i 的值为当前列,j 为当前行。每切换一次列输出读一组行,再将读出的行值按位更新到数组中。
DIY一把属于自己的机械键盘(四)相关推荐
- DIY一把属于自己的机械键盘(二)
键盘配列 前面说到由于外壳的限制,所以选择60%的键盘配列,那么怎么确定键盘的键位,这里有两个在线网站可以生成键盘丝印dxf文件,然后导入PCB即可. 1. 键盘布局 这是键盘在线布局链接:K ...
- DIY一把属于自己的机械键盘(三)
硬件篇 上篇讲完键盘配列,这篇更新下我的硬件电路.首先,明确一下需要的功能:(需求明确是一个项目最重要的开端,可以说是项目的指导纲领,在需求合理的情况下一切按需求办事,不仅能避开不必要的问题和责任 ...
- DIY一把属于自己的机械键盘(一)
两年前深深被网上一些DIY大神的作品迷住,例如严泽远老师的辉光钟,第一次发现原来这也是一门艺术,就打算发散以下自己的艺术细胞.期间收集了很多前辈的作品资料,也开始着手做一款属于自己的作品,但是由于种种 ...
- DIY一把属于自己的机械键盘(五)
软件篇(二)-- USB-HID USB HID全称为USB Human Interface Devices,即USB人机接口设备,顾名思义HID设备是直接与人交互的设备,例如键盘.鼠标.游戏杆等 ...
- 程序员们,挑一把适合自己的机械键盘吧。。
唔-总之先介绍一下我自己... ...果然还是算了 恩好,不开玩笑了.我是 Z-Shang,中文圈常用 ID 是开源哥,目前在美国上大二,业余机械键盘玩家,经常在微博被人黑是 "键盘专业&q ...
- filco蓝牙不好用_2020双十二机械键盘选购 牌子推荐 附雷柏/ikbc/akko/杜伽/FILCO热销机械键盘品牌...
一.机械键盘选购需要注意啥 二.机械键盘有哪些品牌 三.2020双十二机械键盘推荐 文章篇幅较长 可以关注点赞慢慢看 另双十二期间有红包可以领,每天可以领三次 一.机械键盘选购需要注意啥 机械键盘选购 ...
- windowfullscreen后键盘布局顶上去_什么才是第一生产力-2.4G高斯83G双模机械键盘终入囊...
都说RGB是第一生产力,在不差钱的情况下这一点我也是承认的,但在我这种只配用小米的DS内心中第一生产力的概念就是好用.方便.性价比.随着越来越多厂家进入了小键盘领域,我也被小键盘深深地吸引,入手一把小 ...
- Keychron Q1对于初入机械键盘改装领域的玩家,是非常适合的键盘
因为你不需要自己组装这个键盘,键盘出厂就是已经是一把完整的成品,这对于初学者和键盘爱好者来说都是一个很棒的出厂配置. 当我在刚打开Keychron Q1使用时,这是迄今为止我使用过的最简单的客制化机械 ...
- 樱桃键盘驱动在哪下_双十一这四款性价比樱桃轴机械键盘值得一看_搜狐汽车...
如今机械键盘都已经开始普及了,工艺的不断成熟,功能也越发丰富,最最最重要就是价格越来越接近普通玩家都能消费得起的水平,一些樱桃轴机械键盘相比几年前动不动就上五六百的价格如今变得更加亲民,日常的价格在双 ...
最新文章
- windows计算器
- python 驱动级鼠标_Python介绍、安装
- Kafka、RabbitMQ、RocketMQ等消息中间件的对比 —— 消息发送性能和区别
- 消息中间件系列(八):Kafka、RocketMQ、RabbitMQ等的优劣势比较
- 求职干货:再也不怕面试官问斐波那契数列了!
- 计算机网络—数据链路层设备与两种域的区别
- PyTorch学习—6.PyTorch数据读取机制Dataloader与Dataset
- FPGA代码规则检查工具
- 各种泵的图形符号_泵的图形符号
- 百度搜索框代码,实现回车点击,跳转到新页面,简单
- java反序加密_对java程序加密防止反编译
- 使用Nordic芯片的手环OTA(android)
- vue : 无法加载文件 C:\Users\lenovo\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。解决方法
- 线性回归-----标准方程法实现线性回归方程
- 通达信资金净流入公式_通达信主力资金净流入公式是什么?
- matlab如何编写网页,[转载]如何使用matlab在网页中作图
- 如何设置软件开机自启
- Linux特殊权限命令
- 自创计算机语言,【图片】【自创语言教程】———创造属于自己的语言!(上)【那些漫长岁月吧】_百度贴吧...
- 公开密钥基础设施PKI
热门文章
- 管理信息系统和计算机信息系统的关系,管理信息系统(MIS)与其他学科的关系...
- recyclerview 软键盘_RecyclerView中解决EditText的各种异常 终极无BUG版
- 手机操作系统进入混战状态
- Python3 tkinter 界面布局(转自https://blog.csdn.net/junjun5156/article/details/72510927)
- 基于滑模观测器估计误差反馈的永磁同步电机转速控制策略
- 026、163邮箱验证
- (华中师范大学网络教育)2021春季课程作业大学语文
- 关于LT分发系统的设计构想
- 关于佛氏软件(Flexsystem)及其Thin Client技术的介绍
- 计算机组成原理之控制器