好久不见,因为博主最近两个月有点事情,加上接着考试,考完试也有点事情要处理,最近才稍微闲了一些,这才赶紧记录分享一篇博文。FPGA驱动4x4矩阵键盘。这个其实原理是十分简单,但是由于博主做的时候遇到了一些有意思的情况,所以我个人觉得值得记录分享一下。
首先找了本书看了下矩阵键盘的驱动原理,一般来说4x4矩阵键盘的原理图如下,有四根行线和四根列线,行选通和列选通可以确定键盘上的一个位置。从原理图上看出,在没有操作的情况下,行线上接了一个10K的上拉电阻接vcc,这使得键盘在没有按下时,四根行线始终是高电平。
列线是由处理器输入给矩阵键盘,空闲状态下保持为0。也就是行空闲时输出给处理器为四个1,列空闲时由处理器输入给四个0。
当按下按键时,比如第一行第一个按键,对应的那一行导通输出为0,即row_data = 0111,此时由处理器逐渐输入列扫描信号由col_data = 0111——1110,当所按下按键为对应的那一行列的按键,矩阵键盘的行才会导通输出为0,否则会回到1111。其他按键类似,就是利用这个原理来驱动矩阵键盘。
最后FPGA部分模块引脚设计如图,我们需要对按键进行消抖,和普通按键一样,采用20ms的延时对按键进行消抖,分为按下消抖和松开消抖,中间的状态转移,因为列信号需要输出判断行信号的变化,所以状态机状态转移用两个系统时钟周期跳转。采用状态机进行描述,状态转移图如下。
代码如下:(点击阅读原文查看博客)
1 `timescale 1ns/1ps 2 // ********************************************************************************* 3 // Project Name : 4 // Author : NingHeChuan 5 // Email : ninghechuan@foxmail.com 6 // Blogs : http://www.cnblogs.com/ninghechuan/ 7 // File Name : Matrix_Key_Scan.v 8 // Module Name : 9 // Called By : 10 11 // Abstract : 12 // 13 // CopyRight(c) 2018, NingHeChuan Studio.. 14 // All Rights Reserved 15 // 16 // ********************************************************************************* 17 // Modification History: 18 // Date By Version Change Description 19 // ----------------------------------------------------------------------- 20 // 2018/7/28 NingHeChuan 1.0 Original 21 // 22 // ********************************************************************************* 23 24 module Matrix_Key_Scan( 25 input clk, //50Mhz 26 input rst_n, 27 input [3:0] row_data, 28 output key_flag, 29 output reg [3:0] key_value, 30 output reg [3:0] col_data 31 ); 32 33 //FSM state 34 parameter SCAN_IDLE = 8'b0000_0001; 35 parameter SCAN_JITTER1 = 8'b0000_0010; 36 parameter SCAN_COL1 = 8'b0000_0100; 37 parameter SCAN_COL2 = 8'b0000_1000; 38 parameter SCAN_COL3 = 8'b0001_0000; 39 parameter SCAN_COL4 = 8'b0010_0000; 40 parameter SCAN_READ =