一. 简介
我使用的矩阵键盘的原理图,如上,以防不一样,造成不必要的麻烦。
通过原理图可以看出,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 !!!!!
公众号:FPGA之旅