基于VHDL 的矩阵键盘及显示电路设计
限于篇幅,在此不详述所设计矩阵键盘及显示电路的全部V HDL 代码,只对部分重要代码段落进行详细说明。
如图1 所示,全部代码由7 个进程(process) 组成。其中,进程P1 和P2 用于对列扫描输入信号kbrow 进行读取,并通过或非运算产生行扫描使能控制信号en 对行扫描输出信号kbcol 进行控制,并生成一个与kbcol 对应的状态信号state。若没有按键被按下( 即kbrow =“0000”) ,则en =‘1’,行扫描输出信号kbcol 不断循环扫描各行;若有按键被按下,en =‘0’,则行扫描停止,并锁存当前kbcol 的值。进程P1 和P2 的代码如下:
进程P3 使用“case ?when”语句,根据状态信号state 的值(即kbcol 的值) 和列扫描输入信号kbrow 的值进行按键值译码, 生成一个4 位二进制按键数值信号dat ,用以记录当前按键值。例如,当kbcol =“0010”,kbrow =“0001 ”时“B”键按下, dat =“1011”。进程P3 的代码在此不再赘述。进程P4 和P5 用于按键的防抖和按键值的移位寄存。通过将行扫描使能控制信号en 不断赋给一个8 位二进制变量reg8 ,再将reg8 赋给8 位二进制信号key ,实现对按键状态的记录,然后通过对key的各位数值进行与运算,生成防抖控制信号f nq。一旦有按键按下,en =‘0’,则即便是按键在抖动,key 中至少也有1 位数值为‘0’,从而使f nq =‘0’。只有当按键再次弹起,并且在连续8 个时钟周期内不再有新的按键按下,key 的数值全为‘1’,则f nq =‘1’,f nq产生一个上升沿,从而触发按键数值信号dat 进入数值寄存信号temp (32 位二进制数) 的第0 ~ 3 位, 并将temp 原来的第0~27 位左移到第4~31 位,实现1 次按键按下的数值存储。进程P4 和P5 的代码如下:
进程P6 用于将数值寄存信号temp 的32 位二进制数分配给8 个数码管,从而生成数码管地址扫描输出scan ,以及数码管数值信号data (4 位2 进制数) 。进程P6 代码如下:
DIY机械键盘相关社区:机械键盘DIY
评论