always@(posedge clk)
begin
if(cnt<4000)
cnt=cnt+1;
else
begin
cnt=0;
clk0=~clk0;
end
end
always@(posedge clk0)
begin
case(current_state)
NO_KEY_PRESSED:
if(row!=4'b1111)
next_state=SCAN_COL0;
else
begin
next_state=NO_KEY_PRESSED;
end
SCAN_COL0:
begin
if(row!=4'b1111)
next_state=KEY_PRESSED;
else
next_state=SCAN_COL1;
end
SCAN_COL1:
begin
if(row!=4'b1111)
next_state=KEY_PRESSED;
else
next_state=SCAN_COL2;
end
SCAN_COL2:
begin
if(row!=4'b1111)
next_state=KEY_PRESSED;
else
next_state=SCAN_COL3;
end
SCAN_COL3:
begin
if(row!=4'b1111)
next_state=KEY_PRESSED;
else
next_state=NO_KEY_PRESSED;
end
KEY_PRESSED:
if(row!=4'b1111)
next_state=KEY_PRESSED;
else
next_state=NO_KEY_PRESSED;
default:
next_state=NO_KEY_PRESSED;
endcase
end always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
col<= 4'b0000;
key_pressed_flag<=0;
end
else
case(next_state)
NO_KEY_PRESSED:
begin
col=4'b0000;
key_pressed_flag=0;
end
SCAN_COL0:
col=4'b1110;
SCAN_COL1:
col=4'b1101;
SCAN_COL2:
col=4'b1011;
SCAN_COL3:
col=4'b0111;
KEY_PRESSED:
begin
col_reg=col;
row_reg=row;
key_pressed_flag=1;
end
endcase
end always@(posedge clk0 or negedge rst_n)
begin
if(!rst_n)
key_val<=4'h0;
else if(key_pressed_flag)
begin
case({col_reg,row_reg})
8'b1110_1110: key_val=4'h0; //显示"0"
8'b1110_1101: key_val=4'h1; //显示"4"
8'b1110_1011: key_val=4'h2; //显示"8"
8'b1110_0111: key_val=4'h3; //显示"C"
always@(posedge clk)
begin
if(cnt<4000)
cnt=cnt+1;
else
begin
cnt=0;
clk0=~clk0;
end
end
always@(posedge clk0)
begin
case(current_state)
NO_KEY_PRESSED:
if(row!=4'b1111)
next_state=SCAN_COL0;
else
begin
next_state=NO_KEY_PRESSED;
end
SCAN_COL0:
begin
if(row!=4'b1111)
next_state=KEY_PRESSED;
else
next_state=SCAN_COL1;
end
SCAN_COL1:
begin
if(row!=4'b1111)
next_state=KEY_PRESSED;
else
next_state=SCAN_COL2;
end
SCAN_COL2:
begin
if(row!=4'b1111)
next_state=KEY_PRESSED;
else
next_state=SCAN_COL3;
end
SCAN_COL3:
begin
if(row!=4'b1111)
next_state=KEY_PRESSED;
else
next_state=NO_KEY_PRESSED;
end
KEY_PRESSED:
if(row!=4'b1111)
next_state=KEY_PRESSED;
else
next_state=NO_KEY_PRESSED;
default:
next_state=NO_KEY_PRESSED;
endcase
end always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
col<= 4'b0000;
key_pressed_flag<=0;
end
else
case(next_state)
NO_KEY_PRESSED:
begin
col=4'b0000;
key_pressed_flag=0;
end
SCAN_COL0:
col=4'b1110;
SCAN_COL1:
col=4'b1101;
SCAN_COL2:
col=4'b1011;
SCAN_COL3:
col=4'b0111;
KEY_PRESSED:
begin
col_reg=col;
row_reg=row;
key_pressed_flag=1;
end
endcase
end always@(posedge clk0 or negedge rst_n)
begin
if(!rst_n)
key_val<=4'h0;
else if(key_pressed_flag)
begin
case({col_reg,row_reg})
8'b1110_1110: begin key_val_flag=1; key_val=4'h0; end
8'b1110_1101: begin key_val_flag=1; key_val=4'h1; end
8'b1110_1011: begin key_val_flag=1; key_val=4'h2; end
8'b1110_0111: begin key_val_flag=1; key_val=4'h3; end
8'b1101_1110: begin key_val_flag=1; key_val=4'h4; end
8'b1101_1101: begin key_val_flag=1; key_val=4'h5; end
8'b1101_1011: begin key_val_flag=1; key_val=4'h6; end
8'b1101_0111: begin key_val_flag=1; key_val=4'h7; end
8'b1011_1110: begin key_val_flag=1; key_val=4'h8; end
8'b1011_1101: begin key_val_flag=1; key_val=4'h9; end
8'b1011_1011: begin key_val_flag=1; key_val=4'ha; end
8'b1011_0111: begin key_val_flag=1; key_val=4'hb; end
8'b0111_1110: begin key_val_flag=1; key_val=4'hc; end
8'b0111_1101: begin key_val_flag=1; key_val=4'hd; end
8'b0111_1011: begin key_val_flag=1; key_val=4'he; end
8'b0111_0111: begin key_val_flag=1; key_val=4'hf; end
default: begin key_val_flag=0; key_val=4'h0; end
endcase
end
end
reg [3:0] num; always@(posedge clk0 or negedge rst_n)
begin
if(!rst_n)
key_data=20'd0;
else if(key_val_flag)
begin
num=key_val;
key_data=(key_data)*10+num;
if(key_data>9999)
key_data=key_data%10;
end
end
endmodule