?? 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 + -