4*4矩陣鍵盤有4行與4列,在按鍵按下時一行與一列即導通。其驅動方法非常簡單。本設計中以一定的時間頻率分別將每一行的引腳電平拉高,並在拉高某個引腳的同時檢測每一列的電平變化,當檢測到某列引腳有上公升沿跳變時,即為該行與該列導通對應的那個按鍵被按下。
例如上圖中,拉高pd4,此時檢測到pd2引腳有上公升沿電平跳變,則按鍵s5被按下。其餘同理。
//
// company: nanjing university of information science & technology
// engineer: yang cheng yu
// // create date: 2020/01/13 20:01:50
// design name: keyboard_4_4
// module name: keyboard_4_4
// project name: clock
// target devices:
// tool versions:
// description:
// // dependencies:
// // revision:
// revision 0.01 - file created
// additional comments:
// //
module keyboard_4_4
( input clk,
//時鐘
input rst,
//復位
output reg[3:
0] c_pin,
//行引腳
input[3:
0] r_pin,
//列引腳
output reg[3:
0] key_out//按鍵編號輸出);
reg[15:
0] div_cnt;
//分頻計數器
reg[2:
0] state;
reg cnt_full;
//分頻計數器計滿邏輯
localparam check_r1=
3'b000;
//檢測r1
localparam check_r2=
3'b001;
//檢測r2
localparam check_r3=
3'b011;
//檢測r3
localparam check_r4=
3'b010;
//檢測r4
//分頻計數器邏輯
always@(posedge clk or negedge rst)begin//此處設計每次拉高一行時間為1msif(
!rst)begin
div_cnt <=
16'd0;
cnt_full <=
1'b0;
endelse
if(div_cnt==
16'd49999)begin
div_cnt <=
16'd0;
cnt_full <=
1'b1;
endelse begin
div_cnt <= div_cnt +
1'b1;
cnt_full <=
1'b0;
endend
//狀態組合判斷
always@(posedge cnt_full or negedge rst)begin
if(!rst)
state <= check_r1;
else
case
(state)
check_r1:
if(cnt_full)
state <= check_r2;
else
state <= check_r1;
check_r2:
if(cnt_full)
state <= check_r3;
else
state <= check_r2;
check_r3:
if(cnt_full)
state <= check_r4;
else
state <= check_r3;
check_r4:
if(cnt_full)
state <= check_r1;
else
state <= check_r4;
default
: state <= state;
endcase
end//狀態機輸出邏輯
always@(posedge clk or negedge rst)begin
if(!rst)
c_pin <=
4'b0000;
else
case
(state)
check_r1:begin
c_pin <=
4'b1000;
case
(r_pin)
4'b1000:key_out <= 4'd0;
4'b0100:key_out <= 4'd1;
4'b0010:key_out <= 4'd2;
4'b0001:key_out <= 4'd3;
endcase
endcheck_r2:begin
c_pin <=
4'b0100;
case
(r_pin)
4'b1000:key_out <= 4'd4;
4'b0100:key_out <= 4'd5;
4'b0010:key_out <= 4'd6;
4'b0001:key_out <= 4'd7;
endcase
endcheck_r3:begin
c_pin <=
4'b0010;
case
(r_pin)
4'b1000:key_out <= 4'd8;
4'b0100:key_out <= 4'd9;
4'b0010:key_out <= 4'd10;
4'b0001:key_out <= 4'd11;
endcase
endcheck_r4:begin
c_pin <=
4'b0001;
case
(r_pin)
4'b1000:key_out <= 4'd12;
4'b0100:key_out <= 4'd13;
4'b0010:key_out <= 4'd14;
4'b0001:key_out <= 4'd15;
endcase
end
default
:begin
c_pin <=
4'b0000;
key_out <=
4'd0;
endendcase
endendmodule
狀態轉移圖
4 4矩陣鍵盤的實現方式
在網上看了些4 4矩陣鍵盤的程式,哥們自己也想寫乙個,首先是初始化就是p0口賦初值,這是數碼管的i o口,然後就是p3口的賦初值,這個是選通有幾個數碼管的,就是這個意思吧,最重要的是p1口這是連線鍵盤的i o口。首先說說它的原理 我是依據我自己的圖來寫的,我的圖是p1.0 p1.3是行,p1.4 p...
矩陣鍵盤驅動原理
矩陣鍵盤驅動原理 矩陣鍵盤由行訊號和列訊號組成矩陣。每個按鍵連線到行訊號和列訊號的交叉點。通過矩陣鍵盤控制器行訊號線順序逐行輸出掃瞄脈衝,列訊號線作為輸入訊號線。如果沒有按鍵按下,列訊號線不會產生中斷,沒有對按鍵的處理。如果有按鍵按下去,對應的行輸出掃瞄脈衝就會在對應的列訊號線產生變化,就會觸發鍵盤...
4 4 矩陣式鍵盤電路的改進
本文向大家推薦乙個精簡io介面的4 4鍵盤電路,該鍵盤電路僅僅使用4條io介面引線,即可完成一般需要8位介面才能完成的功能。在51微控制器系統中,經常使用4 4鍵盤,一般情況下,都是使用乙個8位的介面,外接16個按鍵。下圖就是乙個常規的4 4鍵盤電路圖。這種常規的矩陣鍵盤電路,相信大家都司空見慣了,...