昨天帮同学修改一个不知道从哪里Ctrl+C、Ctrl+V来的矩阵键盘检测代码,没有分频、没有消抖,直接拿来用就别指望了,呵呵…在这里拿出来主要是想说明一个隐藏的时序问题。废话不多说,直接上代码,注意看。
/*************************************************/
//row为输入
//col 为输出
//按键按下为低电平
此处省略xxx字……………….
…………………………………
parameter NO_KEY_PRESSED=6'b000_001;//没有键按下
parameter SCAN_COL0 =6'b000_010;//扫描第 0 列
parameter SCAN_COL1 =6'b000_100;//扫描第 1 列
parameter SCAN_COL2 =6'b001_000;//扫描第 2 列
parameter SCAN_COL3 =6'b010_000;//扫描第 3 列
parameter KEY_PRESSED =6'b100_000;//有键按下
reg [5:0]current_state,next_state; //现态和次态
/*********************************/
//状态转移
always @(posedge key_clk or negedge rst_n)
if(!rst_n)
current_state<=NO_KEY_PRESSED;
else
current_state<=next_state;
/*************************************************/
//状态逻辑
always @ (current_state) //根据条件转移状态
case (current_state)
NO_KEY_PRESSED:
if(row!=4'hf) //有键按下
next_state=SCAN_COL0;
else //没有键按下
next_state=NO_KEY_PRESSED;
SCAN_COL0: //扫描第 0 列
if(row!=4'hf)
next_state=KEY_PRESSED;
else
next_state=SCAN_COL1;
SCAN_COL1: //扫描第 1 列
if(row!=4'hf)
next_state=KEY_PRESSED;
else
next_state=SCAN_COL2;
SCAN_COL2: //扫描第 2 列
if(row!=4'hf)
next_state=KEY_PRESSED;
else
next_state=SCAN_COL3;
SCAN_COL3: //扫描第 3 列
if(row!=4'hf)
next_state=KEY_PRESSED;
else
next_state=NO_KEY_PRESSED;
KEY_PRESSED: //有按键按下
if(row!=4'hf)
next_state=KEY_PRESSED;
else
next_state=NO_KEY_PRESSED;
endcase
/*************************************************/
reg key_pressed_flag; //按键按下标志
reg [3:0]col_val; //列值
reg [3:0]row_val; //行值
/*************************************************/
//根据次态,给相应的寄存器赋值
/*************************************************/
always @(posedge key_clk or negedge rst_n)
if(!rst_n) begin //复位
col<=4'h0;
key_pressed_flag<=0;
end
else begin
case (next_state)
NO_KEY_PRESSED:
begin
col<=4'h0;
key_pressed_flag<=0;
end
SCAN_COL0: //扫描第 0 列
col<=4'b1110;
SCAN_COL1: //扫描第 1 列
col<=4'b1101;
SCAN_COL2: //扫描第 2 列
col<=4'b1011;
SCAN_COL3: //扫描第 3 列
col<=4'b0111;
KEY_PRESSED: //有按键按下
begin
col_val<=col; // 锁存列值
row_val<=row; // 锁存行值
key_pressed_flag<=1; // 置键盘按下标志
end
endcase
此处省略xxx字……………………
……………………………………….
/*************************************************/
介位看官,有何感想,是不是觉得So easy ?状态划分很清晰,逻辑上也很顺畅,顺着代码看一切都是那么美好!
用户401816 2012-5-26 11:52
用户419124 2012-5-25 22:42