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

本文介绍了矩阵键盘的工作原理和Verilog实现方法。首先,通过拉低Row端口并检测Column的变化来确定按键是否被按下。接着,使用消抖模块确保稳定信号。然后,逐行扫描并识别按下的是哪个按键。最后,将Row置低,等待下一次检测。整个过程详述了矩阵键盘的检测逻辑,并提供了相应的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在文章之前还是推一下公众号(FPGA之旅 ),回复“矩阵键盘”,即可获得完整代码在这里插入图片描述

在这里插入图片描述

一. 简介

  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 !!!!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值