📄 key.v
字号:
/*扫描原理:column作为列线为输入线,row作为行线为输出线
当无键按下时候,所有的列线被置为高电平,当有键按下时候,对应的列线就
为低电平,即row!=1111,证明有键按下,然后去抖动,然后让行线依次为0
进行扫描以确定按键的位置。
*/
//module key1(clk1,rst1,column1,scan_key1,key_flag1,row1,beep1);
module key1(clk1,rst1,column1,scan_key1,row1,beep1);
input clk1,rst1;
input[3:0] column1;//列线
output[3:0] row1;
output[3:0] scan_key1;
output beep1;
reg beep1;
reg[3:0] row1;
reg[3:0] scan_key1; //扫描码寄存器
reg[23:0] cnt_scan1;//扫描频率计数
reg[15:0] beep_time;
reg [18:0] delay_time;
//reg[3:0] scan_key1;
//定义键值
parameter KEY_0=4'B0000,KEY_1=4'B0001,KEY_2=4'B0010,KEY_3=4'B0011,
KEY_4=4'B0100,KEY_5=4'B0101,KEY_6=4'B0110,KEY_7=4'B0111,
KEY_8=4'B1000,KEY_9=4'B1001,KEY_UP=4'B1010,KEY_DOWN=4'B1011,
KEY_CLR=4'B1100,KEY_ENTER=4'B1101,KEY_DP=4'B1110,KEY_F=4'B1111;
always@(posedge clk1 or negedge rst1)
begin
if(!rst1)
begin
cnt_scan1<=0; //扫描频率计数器清0
delay_time<=0; //延时寄存器清0
beep1<=0;
row1=4'b1110;
end
else
begin
if(cnt_scan1==24'h4fffff) //200MS扫描一次
begin
if(column1!=4'b1111) //有键按下
begin
if(delay_time==19'h7ffff) //延时14ms,去抖动
begin
if(column1!=4'b1111)
begin
row1[3:1]<=row1[2:0];
row1[0]<=row1[3]; //4根行线循环送出低电平
beep1<=1; //蜂鸣器发声标志为1
cnt_scan1<=0;
end
else //无键按下
begin
row1=4'b1110;
cnt_scan1<=0; //扫描频率计数器清0
delay_time<=0; //延时寄存器清0
beep1<=0;
end
end
else delay_time<=delay_time+1;
end
else
begin //无键按下
row1=4'b1110;
cnt_scan1<=0; //扫描频率计数器清0
delay_time<=0; //延时寄存器清0
beep1<=0;
end
end
else cnt_scan1<=cnt_scan1+1; //扫描频率计数器自加1
if (cnt_scan1==24'h0fffff) beep1<=0; //关闭蜂鸣器
end
end
always@(posedge clk1 or negedge rst1)
begin
if(!rst1)begin
scan_key1<=4'b0000; //清键值寄存器
end
else begin
// if(!key_flag1)
case (row1) //键值译码
4'b1110:
case (column1)
4'b1110:
scan_key1<=KEY_0;
4'b1101:
scan_key1<=KEY_1;
4'b1011:
scan_key1<=KEY_2;
4'b0111:
scan_key1<=KEY_3;
endcase
4'b1101:
case (column1)
4'b1110:
scan_key1<=KEY_4;
4'b1101:
scan_key1<=KEY_5;
4'b1011:
scan_key1<=KEY_6;
4'b0111:
scan_key1<=KEY_7;
endcase
4'b1011:
case (column1)
4'b1110:
scan_key1<=KEY_8;
4'b1101:
scan_key1<=KEY_9;
4'b1011:
scan_key1<=KEY_UP;
4'b0111:
scan_key1<=KEY_DOWN;
endcase
4'b0111:
case (column1)
4'b1110:
scan_key1<=KEY_CLR;
4'b1101:
scan_key1<=KEY_ENTER;
4'b1011:
scan_key1<=KEY_DP;
4'b0111:
scan_key1<=KEY_F;
endcase
/* default:
begin
key_flag1<=1;
end */
endcase
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -