📄 keyscan.v
字号:
//4X4键盘扫描防抖电路
module keyScan( rst, //异步复位
clk, //1k时钟输入
keyIn, //键盘读入
scan, //扫描输出
keyPressed, //按键有?输出
code); //编码输出0-f 对应SW0--SWF
input rst,clk;
input [3:0] keyIn;
output [3:0] scan,code;
output keyPressed;
reg [3:0] scan,code,
deDitherCounter; //去抖计数器
reg keyPressed;
wire keyDown;
wire [3:0] keyCodeInitial;
assign keyDown=(keyIn==4'b0000)?0:1; //如果有键被按下keyDown=1
//扫描线处理
always @(posedge clk or posedge rst)
begin
if(rst)
scan<=4'b0001;
else if(!keyDown) //如果有键按下,便停止扫描
casex(scan)
4'b0001:scan<=4'b0010;
4'b0010:scan<=4'b0100;
4'b0100:scan<=4'b1000;
4'b1000:scan<=4'b0001;
default:scan<=4'b0001;
endcase
end
//去抖处理
//键一旦被按下,deDitherCounter计数开始
//计数5ms时将键盘编码值(处理前)赋给code,计数到15ms时比较当前的键盘码与10ms前的码是否相同
//如果相同,输出keyPressed信号,如果不同不做任何处理
//keyPressed信号在1ms后(计数到15)重新拉低
//而输出的键盘码code在第5毫秒时就变为有?的值,直到下一次按键后的5ms才会重新变为新的值,从而
//保证在keyPressed信号输出有?时code信号是有?的
always @(posedge clk or negedge keyDown)
begin
if(!keyDown)
begin
deDitherCounter<=4'd0;
code<=4'd0;
keyPressed<=0;
end
else
if(deDitherCounter<4'd15)
begin //注意非阻塞语句先后顺序无所谓
deDitherCounter<=deDitherCounter+1;
if(deDitherCounter==4'd4)
code<=keyCodeInitial;
else if(deDitherCounter==4'd14)
if(code==keyCodeInitial)
keyPressed<=1;
end
else //deDitherCounter==15
keyPressed<=0;
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -