1樓:罌粟素
矩陣式結構的鍵盤顯然比直接法要複雜一些,識別也要複雜一些,列線通過電阻接正電源,並將行線所接的微控制器的i/o口作為輸出端,而列線所接的i/o口則作為輸入。這樣,當按鍵沒有按下時,所有的輸入端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。
<1>確定矩陣式鍵盤上何鍵被按下介紹一種「行掃描法」。
行掃描法 行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。
1、判斷鍵盤中有無鍵按下 將全部行線y0-y3置低電平,然後檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位於低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。
2、判斷閉合鍵所在的位置 在確認有鍵按下後,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。
在確定某根行線位置為低電平後,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。
下面給出一個具體的例子:
圖仍如上所示。8031微控制器的p1口用作鍵盤i/o口,鍵盤的列線接到p1口的低4位,鍵盤的行線接到p1口的高4位。列線p1.
0-p1.3分別接有4個上拉電阻到正電源+5v,並把列線p1.0-p1.
3設定為輸入線,行線p1.4-p.17設定為輸出線。
4根行線和4根列線形成16個相交點。
1、檢測當前是否有鍵被按下。檢測的方法是p1.4-p1.
7輸出全「0」,讀取p1.0-p1.3的狀態,若p1.
0-p1.3為全「1」,則無鍵閉合,否則有鍵閉合。
2、去除鍵抖動。當檢測到有鍵按下後,延時一段時間再做下一步的檢測判斷。
3、若有鍵被按下,應識別出是哪一個鍵閉合。方法是對鍵盤的行線進行掃描。p1.4-p1.7按下述4種組合依次輸出:
p1.7 1 1 1 0
p1.6 1 1 0 1
p1.5 1 0 1 1
p1.4 0 1 1 1
在每組行輸出時讀取p1.0-p1.3,若全為「1」,則表示為「0」這一行沒有鍵閉合,否則有鍵閉合。
由此得到閉合鍵的行值和列值,然後可採用計演算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值
4、為了保證鍵每閉合一次cpu僅作一次處理,必須去除鍵釋放時的抖動。
鍵盤掃描程式:
從以上分析得到鍵盤掃描程式的流程圖所示。程式如下
scan: mov p1,#0fh
mov a,p1
anl a,#0fh
cjne a,#0fh,next1
sjmp next3
next1: acall d20ms
mov a,#0efh
next2: mov r1,a
mov p1,a
mov a,p1
anl a,#0fh
cjne a,#0fh,kcode;
mov a,r1
setb c
rlc a
jc next2
next3: mov r0,#00h
retkcode: mov b,#0fbh
next4: rrc a
inc b
jc next4
mov a,r1
swap a
next5: rrc a
inc b
inc b
inc b
inc b
jc next5
next6: mov a,p1
anl a,#0fh
cjne a,#0fh,next6
mov r0,#0ffh
ret<2>確定矩陣式鍵盤上何鍵被按下介紹一種「高低電平翻轉法」。
首先讓p1口高四位為1,低四位為0,。若有按鍵按下,則高四位中會有一個1翻轉為0,低四位不會變,此時即可確定被按下的鍵的行位置。
然後讓p1口高四位為0,低四位為1,。若有按鍵按下,則低四位中會有一個1翻轉為0,高四位不會變,此時即可確定被按下的鍵的列位置。
最後將上述兩者進行或運算即可確定被按下的鍵的位置。
鍵盤處理程式就作這麼一個簡單的介紹,實際上,鍵盤、顯示處理是很複雜的,它往往佔到一個應用程式的大部份**,可見其重要性,但說到,這種複雜並不來自於微控制器的本身,而是來自於操作者的習慣等等問題,因此,在編寫鍵盤處理程式之前,最好先把它從邏輯上理清,然後用適當的演算法表示出來,最後再去寫**,這樣,才能快速有效地寫好**。
2樓:好想好想你
這道題我放棄了,找不到答案
矩陣鍵盤掃描程式分析
3樓:開心紅茶杯
下的是s1鍵進行如下檢測(4*4鍵盤)
先在p3口輸出
p3 00001111
低四位 行會有變化
if !=00001111
延時0.1us
if !=00001111
p3再輸出11111110
p3 =00001110|11110000=11111110
輸出高四位
cord_l=p3&0xf0 //此時p3口就是輸入值01111110 而不是上面的11111110
cord_h+cord_l=00001110+01110000=01111110=0x7e //此編碼即為s1的編碼
#include //包含標頭檔案
#define uchar unsigned char
#define uint unsigned int
unsigned char const table=;//0-f
uchar keyscan(void);
void delay(uint i);
void main()}}
uchar keyscan(void)//鍵盤掃描函式,使用行列反轉掃描法
}return(0xff); //返回該值
}void delay(uint i)//延時函式
在p3口做的鍵盤
你的去抖檢測沒有做好
4樓:匿名使用者
假設按下的是s1鍵進行如下檢測(4*4鍵盤)
先在p3口輸出
p3 00001111
低四位 行會有變化
if !=00001111
延時0.1us
if !=00001111
p3再輸出11111110
p3 =00001110|11110000=11111110
輸出高四位
cord_l=p3&0xf0 //此時p3口就是輸入值01111110 而不是上面的11111110
cord_h+cord_l=00001110+01110000=01111110=0x7e //此編碼即為s1的編碼
#include //包含標頭檔案
#define uchar unsigned char
#define uint unsigned int
unsigned char const table=;//0-f
uchar keyscan(void);
void delay(uint i);
void main()}}
uchar keyscan(void)//鍵盤掃描函式,使用行列反轉掃描法
}return(0xff); //返回該值
}void delay(uint i)//延時函式
5樓:匿名使用者
uchar keyscan(void)//鍵盤掃描函式,使用行列反轉掃描法 比如:行為低電位,列為高四位
}return(0xff); //返回該值}好像你的程式解釋得很好了。但是好像這麼快,最好要延時下才準的。
我教你按鍵的原理吧
就是那根線如果是高電平的話,遇到底電平就會變為底電平的。所以如果有按鍵按下的話,高電平就會變為低電平了。所以就可以讀取了。
51微控制器如何用矩陣鍵盤輸入數值,最後賦值到變數上
你好!你做矩陣鍵盤檢測的時候,會觸發相關的io口的狀態,通過分析io口,就能知道那個鍵按下 定義一個變數,將按下的鍵值賦給變數就行了 1 用手 bai指頭按下矩陣鍵du 盤的0 9數字鍵即可輸入數zhi值。2 最後賦 dao值到一個變數上 unsigned char const str1 最後 這樣...
玉的識別方法,真假玉的鑑別方法
純天然的a貨翡翠玉石可以從一下幾個方面進行鑑別 光澤油亮 顏色不均勻 伴有色根 變斑晶交織結構 石花 黑色點狀包體和鐵質水跡。光澤油亮翡翠成品表面呈帶油感的玻璃光澤,當轉動成品時,表面的反光點快速移動,晶瑩而靈活 顏色不均勻 伴有色根天然翡翠中的綠色絲絮 條紋或斑點多呈長柱狀 釘子狀或點狀,而且綠色...
矩陣A的n次方怎麼求呢計算方法裡面矩陣A的n次方怎麼算
一般有以下幾種方法 1 計算a 2,a 3 找規律,然後用歸納法證明。2 若r a 1,則a t,a n t n 1 a 注 t t tr t 3 分拆法 a b c,bc cb,用二項式公式。適用於 b n 易計算,c的低次冪為零 c 2 或 c 3 04 用對角化 a p 1diagp a n ...