矩阵键盘FPGA实现(含消抖)

在文章之前还是推一下公众号(FPGA之旅 ),回复“矩阵键盘”,即可获得完整代码矩阵键盘FPGA实现(含消抖)_第1张图片

矩阵键盘FPGA实现(含消抖)_第2张图片

一. 简介

  1. 我使用的矩阵键盘的原理图,如上,以防不一样,造成不必要的麻烦。
  2. 通过原理图可以看出,Column上面默认的是高电平,当对应的按键按下后,其电平为对应Row上的电平。
  3. 其中,Column是input端口,Row是Output端口,这是一个非常值得注意的点

二. 实现原理

  1. 首先将Row全部输出为低电平。
  2. 确定列,当某一列有按键按下的时候,其值会由高电平变为低电平。
  3. 消抖。
  4. 确定行,分别将Row上面的低电平变为高电平,如果Column上的电平也由低电平变为了高电平,那么按键按下的所在行,既为这一行。
  5. 将Row全部拉低,等待Column变为高电平。
  6. 完成 (按下松开为一次,其他的方式可自行修改)。

三. 详细步骤

  1. 将Column信号变成一个信号,用于检测是否有矩阵键盘按下.
//判断是否有按键按下
assign down = key_C == 4'b1111 ? 1'b1 : 1'b0; //1 为没有, 0 为有
  1. 将down信号,作为按键输入到消抖模块中(上篇文章所写的消抖模块)进行消抖,同时消抖模块需要进行对应的修改,将S_UP修改为如下。这里将松开的检测放到外面。
S_UP:
		//if(key_uedge == 1'b1)
			next_state <= S_DOWN;
		//else
		//	next_state <= S_UP;
  1. 消抖完成后,依次拉高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;
  1. 将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,FPGA,矩阵键盘,消抖)