在文章之前还是推一下公众号(FPGA之旅 ),回复“矩阵键盘”,即可获得完整代码
一. 简介
- 我使用的矩阵键盘的原理图,如上,以防不一样,造成不必要的麻烦。
- 通过原理图可以看出,Column上面默认的是高电平,当对应的按键按下后,其电平为对应Row上的电平。
- 其中,Column是input端口,Row是Output端口,这是一个非常值得注意的点。
二. 实现原理
- 首先将Row全部输出为低电平。
- 确定列,当某一列有按键按下的时候,其值会由高电平变为低电平。
- 消抖。
- 确定行,分别将Row上面的低电平变为高电平,如果Column上的电平也由低电平变为了高电平,那么按键按下的所在行,既为这一行。
- 将Row全部拉低,等待Column变为高电平。
- 完成 (按下松开为一次,其他的方式可自行修改)。
三. 详细步骤
- 将Column信号变成一个信号,用于检测是否有矩阵键盘按下.
//判断是否有按键按下
assign down = key_C == 4'b1111 ? 1'b1 : 1'b0; //1 为没有, 0 为有
- 将down信号,作为按键输入到消抖模块中(上篇文章所写的消抖模块)进行消抖,同时消抖模块需要进行对应的修改,将S_UP修改为如下。这里将松开的检测放到外面。
S_UP:
//if(key_uedge == 1'b1)
next_state <= S_DOWN;
//else
// next_state <= S_UP;
- 消抖完成后,依次拉高Row上面的信号,然后判断Column上是否全部恢复为高电平,并且进行判断按下的按键是那一个。
key_R <= key_R + 1'b1; //依次加一就可以了
//判断是矩阵键盘的那个按键按下了
if(key_R == 'd1 && key_C == 4'b1111)
key_D <= 'd7;
else if(key_R == 4'b0010 && key_C == 4'b1111)
key_D <= 'd4;
else if(key_R == 4'b0100 && key_C == 4'b1111)
key_D <= 'd1;
else if(key_R == 4'b1000 && key_C == 4'b1111)
key_D <= 'd10;
else
key_D <= 'd0;
- 将Row全部置为低电平,等待Column全部为高电平,然后模块输出按下的信号和对的数字.
模块接口信息。我这里没有弄按下信号,全部包含在key_D里面了,如果key_D为0,则表示没有按键按下,为其他的任意值时,均表示有按键按下。(缺点,舍弃了一个按键)
module Matrix_keyboard(
input clk,
input rst,
//矩阵键盘输入行列
input[3:0] key_C,
output reg[3:0] key_R,
output reg[3:0] key_D
);
以上就是整个矩阵按键的检测的工程。
Thank for your reading !!!!!