📄 keyboard.v
字号:
/*
矩阵键盘实验1:向用户介绍矩阵键盘扫描实现的方法,没有考虑去抖和判断键弹起的问题;把相应的键值显示在数码管上
*/
module keyboard(clk,rst,row,column,dataout,dataout_7,dataout3) ;
input clk,rst;
input[3:0] column;//列线
output[3:0] row;//行线
output[7:0] dataout,dataout_7,dataout3;//led,数码管显示数据
//output[7:0] en;//数码管显示使能
//scan_row
reg[3:0] row;
reg[15:0] cnt_scan;//扫描频率计数器
always@(posedge clk or negedge rst)
begin
if(!rst) begin
row<=4'b1110;
cnt_scan<=0;
end
else if(scan_en)
begin
cnt_scan<=cnt_scan+1;
if(cnt_scan==16'hffff) begin
cnt_scan<=16'h0000;
row[3:1]<=row[2:0];
row[0]<=row[3]; //4根行线循环送出低电平
end
end
end
//key_press
reg scan_en; /*判断键是否弹起*/
always@(posedge clk or negedge rst)
begin
if(!rst) scan_en<=1'b1;
else
begin
if(column==4'b1111)
scan_en<=1'b1;
else
scan_en<=1'b0;
end
end
//key_value
reg[4:0] scan_key; //扫描码寄存器
always@(posedge clk or negedge rst)
begin
if(!rst) begin
scan_key<=16;
end
else begin
case(row) //该case结果检测何处有键按下
4'b1110:
case(column)
4'b1110: begin
scan_key<=0;
end
4'b1101: begin
scan_key<=1;
end
4'b1011: begin
scan_key<=2;
end
4'b0111: begin
scan_key<=3;
end
default:
scan_key<=16;
endcase
4'b1101:
case(column)
4'b1110: begin
scan_key<=4;
end
4'b1101: begin
scan_key<=5;
end
4'b1011: begin
scan_key<=6;
end
4'b0111: begin
scan_key<=7;
end
default:
scan_key<=16;
endcase
4'b1011:
case(column)
4'b1110: begin
scan_key<=8;
end
4'b1101: begin
scan_key<=9;
end
4'b1011: begin
scan_key<=10;
end
4'b0111: begin
scan_key<=11;
end
default:
scan_key<=16;
endcase
4'b0111:
case(column)
4'b1110: begin
scan_key<=12;
end
4'b1101: begin
scan_key<=13;
end
4'b1011: begin
scan_key<=14;
end
4'b0111: begin
scan_key<=15;
end
default:
scan_key<=16;
endcase
default:
scan_key<=16;
endcase
end
end
//output
reg[7:0] dataout,dataout_7,dataout3;
always@(scan_key)
begin
case(scan_key)
5'b00000:begin
dataout=8'b0000_0000;//"1"
dataout_7=8'b0110_0000;end
5'b00001:begin
dataout=8'b0000_0001;//"2"
dataout_7=8'b1101_1010;end
5'b00010:begin
dataout=8'b0000_0010;//"3"
dataout_7=8'b1111_0010;end
5'b00011:begin
dataout=8'b0000_0011;//"A"
dataout_7=8'b1110_1110;end
5'b00100:begin
dataout=8'b0000_0100;//"4"
dataout_7=8'b0110_0110;end
5'b00101:begin
dataout=8'b0000_0101;//"5"
dataout_7=8'b1011_0110;end
5'b00110:begin
dataout=8'b0000_0110;//"6"
dataout_7=8'b1011_1110;end
5'b00111:begin
dataout=8'b0000_0111;//"B"
dataout_7=8'b0011_1110;end
5'b01000:begin
dataout=8'b0000_1000;//"7"
dataout_7=8'b1110_0000;end
5'b01001:begin
dataout=8'b0000_1001;//"8"
dataout_7=8'b1111_1110;end
5'b01010:begin
dataout=8'b0000_1010;//"9"
dataout_7=8'b1111_0110;end
5'b01011:begin
dataout=8'b0000_1011;//"C"
dataout_7=8'b0001_1010;end
5'b01100:begin
dataout=8'b0000_1100;//"*"
dataout_7=8'b0000_0001;end
5'b01101:begin
dataout=8'b0000_1101;//"0"
dataout_7=8'b1111_1100;end
5'b01110:begin
dataout=8'b0000_1110;//"#"
dataout_7=8'b0110_1110;end
5'b01111:begin
dataout=8'b0000_1111;//"D"
dataout_7=8'b0111_1010;end
default:begin
dataout=8'b1111_1111;
dataout_7=8'b0000_0000;end
endcase
dataout3<=dataout_7;
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -