基于FPGA的 矩阵键盘按键识别 【原理+源码】


引言

最近了解了矩阵键盘扫描的原理,动手实现了一下,在这里做一个简单的总结。



原理阐述

矩阵键盘典型电路:

FPGA的应用电路:

其中,行信号为FPGA输入信号,列信号为FPGA输出信号。

原理解释:

起始状态,FPGA的列信号输出 全0 低电平; 没有任何按键按下时,FPGA接收到的 行信号 为 全1 高电平; 当有按键按下时,被按下的按键所在行变为低电平,此时便可以开启一次检测行为; 由于机械按键固有的振动特性,需要延迟约20毫秒后再次确认是否有按键按下; 如果20毫秒延迟后,依然检测到有按键按下,则认为按键按下有效,开始逐列扫描; 逐列扫描时,当前正在扫描的列,FPGA需输出低电平,其他列则输出高电平; 列扫描完毕就可以确定按键所在行列,进一步确定按键的数值; 列输出信号输出全0低电平,等待按键释放(条件是行输入信号全为高电平)。释放后回归空闲状态。完成一次按键检测。

实现方法

对于这种程序化的检测流程,状态机很适合做这个事情。我选择的状态机实现。代码贴在下面,可以仔细阅读~

源码分享

一般来说,矩阵键盘通常没有上拉电阻,所以需要在FPGA的约束中对行输入引脚添加上拉约束。例:
以上的代码中,没有对按键释放的过程做震动延迟处理,稳妥起见还是在按键松起释放时,增加一个20毫秒的延迟,读者可以自行改进。

板级调试演示

点击链接进入观看:



经验分享 程序员 微信小程序 职场和发展