FPGA实现按键消抖及短时间按键和长时间按键不同动作

XILINX 专栏收录该内容
2 篇文章 0 订阅
module key_test2(
	clk,			//时钟信号:50Mhz
	rst,			//按键复位
	key,			//用户按键
	led			//LED0~LED2
    );

//端口定义
	input clk;
	input rst;
	input key;
	output[2:0] led;

//寄存器类型声明
	reg[2:0] led;		
	reg[19:0] timer;	//定时10ms,按键扫描
	//测量按键按下的时间长度,区分长按和短按
	//三种模式:大于20ms小于1s为短按,大于1s小于2s为中长按,2s以上为长按
	//根据实际情况而定
	reg[31:0] count;	
	reg new_key;  //新扫描按键电平
	reg last_key; //旧扫描按键电平
	wire flag_up; //上升沿检测标志
/*
**	10ms按键扫描一次
*/	
always @(posedge clk or negedge rst)
	begin
		if (!rst)
			begin
				timer <= 20'd0;
			end
		else if (timer == 20'd499_999)
			begin
				timer <= 20'd0;
				new_key <= key;
			end
		else
			timer <= timer +1'b1;
	end
/*
** 按键状态保存一个时钟周期	
*/
always @(posedge clk)
	begin
		last_key <= new_key;
	end

assign flag_up = (~last_key) & new_key; 	   //检测按键松开产生的上升沿

/*
**	count计数,测量按键按下时间长度
*/
always @(posedge clk or negedge rst)
	begin 
		if (!rst)
			count <= 32'd0;
		else if (new_key == 0)
			count <= count +1'b1;
		else if (new_key == 1)
			count <= 32'd0;
	end
/*
**	根据按键按下时间的长短进行相应的动作
*/
always @(posedge clk or negedge rst)
	begin 
		if (!rst)
			led <= 3'b0;
		else if (flag_up == 1)
			begin
				if (count >= 32'd99_999_999)
					led[2] <= ~led[2];  		//按下时间超过2s,LED2状态取反
				else if (count >= 32'd49_999_999)
					led[1] <= ~led[1];		//按下时间超过1s且小于2s,LED1状态取反
				else if (count >= 32'd999_999)
					led[0] <= ~led[0];		//短按,LED0状态取反
			end
	end
	
endmodule

 

  • 1
    点赞
  • 2
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值