距陣鍵盤

矩陣鍵盤是單片機外部設備中所使用的排布類似於矩陣的鍵盤組。

矩陣鍵盤是單片機編程中所使用的鍵盤.
1.矩陣式鍵盤的結構與工作原理
在鍵盤中按鍵數量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連線。這樣,一個連線埠(如P1口)就可以構成4*4=16個按鍵,比之直接將連線埠線用於鍵盤多出了一倍,而且線數越多,區別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用連線埠線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數比較多時,採用矩陣法來做鍵盤是合理的。
矩陣式結構的鍵盤顯然比直接法要複雜一些,識別也要複雜一些,上圖中,列線通過電阻接正電源,並將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。具體的識別及編程方法如下所述。
2、矩陣式鍵盤的按鍵識別方法
確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。
行掃描法 行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。
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僅作一次處理,必須卻除鍵釋放時的抖動。
鍵盤掃描程式:
從以上分析得到鍵盤掃描程式的流程圖如圖2所示。程式如下
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
RET
KCODE: 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
鍵盤處理程式就作這么一個簡單的介紹,實際上,鍵盤、顯示處理是很複雜的,它往往占到一個應用程式的大部份代碼,可見其重要性,但說到,這種複雜並不來自於單片機的本身,而是來自於操作者的習慣等等問題,因此,在編寫鍵盤處理程式之前,最好先把它從邏輯上理清,然後用適當的算法表示出來,最後再去寫代碼,這樣,才能快速有效地寫好代碼。
鍵盤是由一組規則排列的按鍵組成,一個按鍵實際上是一個開關元件,也就是說鍵盤是一組規則排列的開關。
鍵盤工作原理
1.按鍵的分類
按鍵按照結構原理可分為兩類,一類是觸點式開關按鍵,如機械式開關、導電橡膠式開關等;另一類是無觸點開關按鍵,如電氣式按鍵,磁感應按鍵等。前者造價低,後者壽命長。目前,微機系統中最常見的是觸點式開關按鍵。
按鍵按照接口原理可分為編碼鍵盤與非編碼鍵盤兩類,這兩類鍵盤的主要區別是識別鍵符及給出相應鍵碼的方法。編碼鍵盤主要是用硬體來實現對鍵的識別,非編碼鍵盤主要是由軟體來實現鍵盤的定義與識別。
全編碼鍵盤能夠由硬體邏輯自動提供與鍵對應的編碼,此外,一般還具有去抖動和多鍵、竄鍵保護電路,這種鍵盤使用方便,但需要較多的硬體,價格較貴,一般的單片機套用系統較少採用。非編碼鍵盤只簡單地提供行和列的矩陣,其它工作均由軟體完成。由於其經濟實用,較多地套用於單片機系統中。下面將重點介紹非編碼鍵盤接口。
2.鍵輸入原理
在單片機套用系統中,除了復位按鍵有專門的復位電路及專一的復位功能外,其它按鍵都是以開關狀態來設定控制功能或輸入數據。當所設定的功能鍵或數字鍵按下時,計算機套用系統應完成該按鍵所設定的功能,鍵信息輸入是與軟體結構密切相關的過程。
對於一組鍵或一個鍵盤,總有一個接口電路與CPU相連。CPU可以採用查詢或中斷方式了解有無將鍵輸入並檢查是哪一個鍵按下,將該鍵號送入累加器ACC,然後通過跳轉指令轉入執行該鍵的功能程式,執行完後再返回主程式。
3.按鍵結構與特點
微機鍵盤通常使用機械觸點式按鍵開關,其主要功能是把機械上的通斷轉換成為電氣上的邏輯關係。也就是說,它能提供標準的TTL邏輯電平,以便與通用數字系統的邏輯電平相容。
機械式按鍵再按下或釋放時,由於機械彈性作用的影響,通常伴隨有一定時間的觸點機械抖動,然後其觸點才穩定下來。其抖動過程如圖7.2所示,抖動時間的長短與開關的機械特性有關,一般為5~10ms。
左圖 按鍵觸點的機械抖動
在觸點抖動期間檢測按鍵的通與斷狀態,可能導致判斷出錯。即按鍵一次按下或釋放被錯誤地認為是多次操作,這種情況是不允許出現的。為了克服按鍵觸點機械抖動所致的檢測誤判,必須採取去抖動措施,可從硬體、軟體兩方面予以考慮。在鍵數較少時,可採用硬體去抖,而當鍵數較多時,採用軟體去抖。
在硬體上可採用在鍵輸出端加R-S觸發器(雙穩態觸發器)或單穩態觸發器構成去抖動電路,圖7.3是一種由R-S觸發器構成的去抖動電路,當觸發器一旦翻轉,觸點抖動不會對其產生任何影響。
電路工作過程如下:按鍵未按下時,a = 0,b = 1,輸出Q = 1,按鍵按下時,因按鍵的機械彈性作用的影響,使按鍵產生抖動,當開關沒有穩定到達b端時,因與非門2輸出為0反饋到與非門1的輸入端,封鎖了與非門1,雙穩態電路的狀態不會改變,輸出保持為1,輸出Q不會產生抖動的波形。當開關穩定到達b端時,因a = 1,b = 0,使Q = 0,雙穩態電路狀態發生翻轉。當釋放按鍵時,在開關未穩定到達a端時,因Q = 0,封鎖了與非門2,雙穩態電路的狀態不變,輸出Q保持不變,消除了後沿的抖動波形。當開關穩定到達b端時,因a = 0,b = 0,使Q = 1,雙穩態電路狀態發生翻轉,輸出Q重新返回原狀態。由此 右圖 雙穩態去抖電路
可見,鍵盤輸出經雙穩態電路之後,輸出已變為規範的矩形方波。
軟體上採取的措施是:在檢測到有按鍵按下時,執行一個10ms左右(具體時間應視所使用的按鍵進行調整)的延時程式後,再確認該鍵電平是否仍保持閉合狀態電平,若仍保持閉合狀態電平,則確認該鍵處於閉合狀態;同理,在檢測到該鍵釋放後,也應採用相同的步驟進行確認,從而可消除抖動的影響。
4.按鍵編碼
一組按鍵或鍵盤都要通過I/O口線查詢按鍵的開關狀態。根據鍵盤結構的不同,採用不同的編碼。無論有無編碼,以及採用什麼編碼,最後都要轉換成為與累加器中數值相對應的鍵值,以實現按鍵功能程式的跳轉。
5.編制鍵盤程式
一個完善的鍵盤控制程式應具備以下功能:
(1)檢測有無按鍵按下,並採取硬體或軟體措施,消除鍵盤按鍵機械觸點抖動的影響。
(2)有可靠的邏輯處理辦法。每次只處理一個按鍵,其間對任何按鍵的操作對系統不產生影響,且無論一次按鍵時間有多長,系統僅執行一次按鍵功能程式。
(3)準確輸出按鍵值(或鍵號),以滿足跳轉指令要求。
獨立式按鍵
單片機控制系統中,往往只需要幾個功能鍵,此時,可採用獨立式按鍵結構。
1.獨立式按鍵結構
獨立式按鍵是直接用I/O口線構成的單個按鍵電路,其特點是每個按鍵單獨占用一根I/O
左圖 獨立式按鍵電路
口線,每個按鍵的工作不會影響其它I/O口線的狀態。獨立式按鍵的典型套用如圖7.4所示。
獨立式按鍵電路配置靈活,軟體結構簡單,但每個按鍵必須占用一根I/O口線,因此,在按鍵較多時,I/O口線浪費較大,不宜採用。
圖7.4中按鍵輸入均採用低電平有效,此外,上拉電阻保證了按鍵斷開時,I/O口線有確定的高電平。當I/O口線內部有上拉電阻時,外電路可不接上拉電阻。
2.獨立式按鍵的軟體結構
獨立式按鍵軟體常採用查詢式結構。先逐位查詢每根I/O口線的輸入狀態,如某一根I/O口線輸入為低電平,則可確認該I/O口線所對應的按鍵已按下,然後,再轉向該鍵的功能處理程式。圖7.4中的I/O口採用P1口,請讀者自行編制相應的軟體。
7.1.3 矩陣式按鍵
單片機系統中,若使按鍵較多時,通常採用矩陣式(也稱行列式)鍵盤。
1.矩陣式鍵盤的結構及原理
矩陣式鍵盤由行線和列線組成,按鍵位於行、列線的交叉點上,其結構如下圖所示。
由圖可知,一個4×4的行、列結構可以構成一個含有16個按鍵的鍵盤,顯然,在按鍵數量較多時,矩陣式鍵盤較之獨立式按鍵鍵盤要節省很多I/O口。
矩陣式鍵盤中,行、列線分別連線到按鍵開關的兩端,行線通過上拉電阻接到+5V上。當無鍵按下時,行線處於高電平狀態;當有鍵按下時,行、列線將導通,此時,行線電平將由與此行線相連的列線電平決定。這是識別按鍵是否按下的關鍵。然而,矩陣鍵盤中的行線、列線和多個鍵相連,各按鍵按下與否均影響該鍵所在行線和列線的電平,各按鍵間將相互影響,因此,必須將行線、列線信號配合起來作適當處理,才能確定閉合鍵的位置。
2.矩陣式鍵盤按鍵的識別
識別按鍵的方法很多,其中,最常見的方法是掃描法。下面以圖7.5中8號鍵的識別為例來說明掃描法識別按鍵的過程。
按鍵按下時,與此鍵相連的行線與列線導通,行線在無鍵按下時處在高電平,顯然,如果讓所有的列線也處在高電平,那么,按鍵按下與否不會引起行線電平的變化,因此,必須使所有列線處在低電平,只有這樣,當有鍵按下時,該鍵所在的行電平才會由高電平變為低電平。CPU根據行電平的變化,便能判定相應的行有鍵按下。8號鍵按下時,第2行一定為低電平,然而,第2行為低電平時,能否肯定是8號鍵按下呢?回答是否定的,因為9、10、11號鍵按下同樣使第2行為低電平。為進一步確定具體鍵,不能使所有列線在同一時刻都處在低電平,可在某一時刻只讓一條列線處於低電平,其餘列線均處於高電平,另一時刻,讓下一列處在低電平,依此循環,這種依次輪流每次選通一列的工作方式稱為鍵盤掃描。採用鍵盤掃描後,再來觀察8號鍵按下時的工作過程,當第0列處於低電平時,第2行處於低電平,而第1、2、3列處於低電平時,第2行卻處在高電平,由此可判定按下的鍵應是第2行與第0列的交叉點,即8號鍵。
3.鍵盤的編碼
對於獨立式按鍵鍵盤,因按鍵數量少,可根據實際需要靈活編碼。對於矩陣式鍵盤,按鍵的位置由行號和列號唯一確定,因此可分別對行號和列號進行二進制編碼,然後將兩值合成一個位元組,高4位是行號,低4位是列號。如圖7.5中的8號鍵,它位於第2行,第0列,因此,其鍵盤編碼應為20H。採用上述編碼對於不同行的鍵離散性較大,不利於散轉指令對按鍵進行處理。因此,可採用依次排列鍵號的方式對安排進行編碼。以圖7.5中的4×4鍵盤為例,可將鍵號編碼為:01H、02H、03H…0EH、0FH、10H等16個鍵號。編碼相互轉換可通過計算或查表的方法實現。
4.鍵盤的工作方式
在單片機套用系統中,鍵盤掃描只是CPU的工作內容之一。CPU對鍵盤的回響取決於鍵盤的工作方式,鍵盤的工作方式應根據實際套用系統中CPU的工作狀況而定,其選取的原則是既要保證CPU能及時回響按鍵操作,又不要過多占用CPU的工作時間。通常,鍵盤的工作方式有三種,即編程掃描、定時掃描和中斷掃描。
1)編程掃描方式
編程掃描方式是利用CPU完成其它工作的空餘調用鍵盤掃描子程式來回響鍵盤輸入的要求。在執行鍵功能程式時,CPU不再回響鍵輸入要求,直到CPU重新掃描鍵盤為止。
鍵盤掃描程式一般應包括以下內容:
(1)判別有無鍵按下。
(2)鍵盤掃描取得閉合鍵的行、列值。
(3)用計算法或查表法得到鍵值。
(4)判斷閉合鍵是否釋放,如沒釋放則繼續等待。
(5)將閉合鍵鍵號保存,同時轉去執行該閉合鍵的功能。
圖7.6 8155擴展I/O口組成的矩陣鍵盤
圖7.6是一個4×8矩陣鍵盤電路,由圖可知,其與單片機的接口採用8155擴展I/O晶片,鍵盤採用編程掃描方式工作,8155C口的低4位輸入行掃描信號,A口輸出8位列掃描信號,二者均為低電平有效。8155的IO/ 與P2.0相連, 與P2.1相連, 、 分別與單片機的 、 相連。由此可確定8155的口地址為:
命令/狀態口:0100H(P2未用口線規定為0)
A口:0101H
B口:0102H
C口:0103H
圖7.6中,A口為基本輸出口,C口為基本輸入口,因此,方式命令控制字應設定為43H。在編程掃描方式下,鍵盤掃描子程式應完成如下幾個功能:
(1)判斷有無鍵按下。其方法為:A口輸出全為0,讀C口狀態,若PC0~PC3全為1,則說明無鍵按下;若不全為1,則說明有鍵按下。
(2)消除按鍵抖動的影響。其方法為:在判斷有鍵按下後,用軟體延時的方法延時10ms後,再判斷鍵盤狀態,如果仍為有鍵按下狀態,則認為有一個按鍵按下,否則當作按鍵抖動來處理。
(3)求按鍵位置。根據前述鍵盤掃描法,進行逐列置0掃描。圖7.6中,32個鍵的鍵值分布如下(鍵值由4位16進制數碼組成,前兩位是列的值,即A口數據,後兩位是行的值,即C口數據,X為任意值):
FEXE FDXE FBXE F7XE EFXE DFXE BFXE 7FXE
FEXD FDXD FBXD F7XD EFXD DFXD BFXD 7FXD
FEXB FDXB FBXB F7XB EFXB DFXB BFXB 7FXB
FEX7 FDX7 FBX7 F7X7 EFX7 DFX7 BFX7 7FX7
按鍵鍵值確定後,即可確定按鍵位置。相應的鍵號可根據下述公式進行計算:鍵號=行首鍵號+列號。圖7.6中,每行的行首可給以固定的編號0(00H),8(08H),16(10H),24(18H),列號依列線順序為0~7。
(4)判別閉合的鍵是否釋放。按鍵閉合一次只能進行一次功能操作,因此,等按鍵釋放後才能根據鍵號執行相應的功能鍵操作。
鍵盤掃描程式流程圖請參閱實訓7圖7.1中的主程式流程圖。
鍵盤掃描程式請參閱實訓7源程式中的鍵盤查詢程式、鍵盤掃描程式和按鍵查詢子程式三部分。
實訓7是矩陣式鍵盤的一種典型套用,與圖7.6相比,8155入口地址不同,矩陣鍵盤列數不同,再就是為兼顧鍵盤和顯示,防抖所用的延時子程式由顯示子程式替代。
2)定時掃描方式:
定時掃描方式就是每隔一段時間對鍵盤掃描一次,它利用單片機內部的定時器產生一定時間(例如10ms)的定時,當定時時間到就產生定時器溢出中斷,CPU回響中斷後對鍵盤進行掃描,並在有鍵按下時識別出該鍵,再執行該鍵的功能程式。定時掃描方式的硬體電路與編程掃描方式相同,程式流程圖如下圖所示。
圖中,標誌1和標誌2是在單片機內部RAM的位定址區設定的兩個標誌位,標誌1為去抖動標誌位,標誌2為識別完按鍵的標誌位。初始化時將這兩個標誌位設定為0,執行中斷服務程式時,首先判別有無鍵閉合,若無鍵閉合,將標誌1和標誌2置0後返回;若有鍵閉合,先檢查標誌1,當標誌1為0時,說明還未進行去抖動處理,此時置位標誌1,並中斷返回。由於中斷返回後要經過10ms後才會再次中斷,相當於延時了10ms,因此,程式無須再延時。下次中斷時,因標誌1為1,CPU再檢查標誌2,如標誌2為0說明還未進行按鍵的識別處理,這時,CPU先置位標誌2,然後進行按鍵識別處理,再執行相應的按鍵功能子程式,最後,中斷返回。如標誌2已經為1,則說明此次按鍵已做過識別處理,只是還未釋放按鍵,當按鍵釋放後,在下一次中斷服務程式中,標誌1和標誌2又重新置0,等待下一次按鍵。
3)中斷掃描方式
採用上述兩種鍵盤掃描方式時,無論是否按鍵,CPU都要定時掃描鍵盤,而單片機套用系統工作時,並非經常需要鍵盤輸入,因此,CPU經常處於空掃描狀態,為提高CPU工作效率,可採用中斷掃描工作方式。其工作過程如下:當無鍵按下時,CPU處理自己的工作,當有鍵按下時,產生中斷請求,CPU轉去執行鍵盤掃描子程式,並識別鍵號。
左圖是一種簡易鍵盤接口電路,該鍵盤是由8051P1口的高、低位元組構成的4×4鍵盤。鍵盤的列線與P1口的高4位相連,鍵盤的行線與P1口的低4位相連,因此,P1.4~P1.7是鍵輸出線,P1.0~P1.3是掃描輸入線。圖中的4輸入與門用於產生按鍵中斷,其輸入端與各列線相連,再通過上拉電阻接至+5V電源,輸出端接至8051的外部中斷輸入端 。具體工作如下:當鍵盤無鍵按下時,與門各輸入端均為高電平,保持輸出端為高電平;當有鍵按下時,端為低電平,向CPU申請中斷,若CPU開放外部中斷,則會回響中斷請求,轉去執行鍵盤掃描子程式。
這是初學時寫的最簡單、最詳細、效率最高的矩陣鍵盤掃描程式,只用了四條常用命令(MOV/送數、JB/高電平轉移、JMP/直接轉移、RET/子程式返回),保證初學者一看就懂!本程式已經在本站電子實驗板上驗證通過,占用CPU時間少,效率高,被選作單片機的測試程式!
矩陣按鍵掃描程式是一種節省IO口的方法,按鍵數目越多節省IO口就越可觀,本程式的思路跟書上一樣:先判斷某一列(行)是否有按鍵按下,再判斷該行(列)是那一隻鍵按下。但是,在程式的寫法上,站長採用了最簡單的方法,使得程式效率最高。
本程式中,如果檢測到某鍵按下了,就不再檢測其它的按鍵,這完全能滿足絕大多數需要,又能節省大量的CPU時間。另外,本人認為鍵盤用延時程式來消除抖動,完全是浪費時間。試想,如果不用中斷執行(用中斷執行需要更多的硬體資源)的方法來掃描鍵盤,每秒鐘掃描20-100次,每次都要延時10-20MS的話,我們的單片機還有多少時間做正事呢?
其實,延時的這段時間,CPU可以做其它的事呀。所以,本鍵盤掃描程式的前面後面都可以加入少少代碼,既可以達到完美的消抖動效果,又可以擴展其它的功能(例如按鍵封鎖、按鍵長按等按鍵功能復用!)
本鍵盤掃描子程式名叫key,每次要掃描時用call key調用即可。以下子程式內容:
key:mov p0,#00001111b;上四位和下四位分別為行和列,所以送出高低電壓檢查有沒有按鍵按下
jmp k10;跳到K10處開始掃描,這裡可以改成其它條件轉移指令來決定本次掃描是否要繼續,例如減1為0轉移或者位為1或0才轉移,這主要用來增加功能,確認上一按鍵功能是否完成?是否相當於經過了延時?是否要封鎖鍵盤?
goend:jmp kend;如果上面判斷本次不執行鍵盤掃描程式,則立即轉到程式尾部,不要浪費CPU的時間
k10:jb p0.0,k20;掃描正式開始,先檢查列1四個鍵是否有鍵按下,如果沒有,則跳到K20檢查列2
k11:mov p0,#11101111b;列1有鍵按下時,P0.0變低,到底是那一個鍵按下?現在分別輸出各行低電平
jb p0.0,k12;該行的鍵不按下時,p0.0為高電平,跳到到K12,檢查其它的行
mov r1,#1;如果正好是這行的鍵按下,將暫存器R0寫下1,表示1號鍵按下了
k12:mov p0,#11011111b
jb p0.0,k13
mov r1,#2;如果正好是這行的鍵按下,將暫存器R0寫下2,表示2號鍵按下了
k13:mov p0,#10111111b
jb p0.0,k14
mov r1,#3;如果正好是這行的鍵按下,將暫存器R0寫下3,表示3號鍵按下了
k14:mov p0,#01111111b
jb p0.0,kend;如果現在四個鍵都沒有按下,可能按鍵鬆開或干擾,退出掃描(以後相同)
mov r1,#4如果正好是這行的鍵按下,將暫存器R0寫下4,表示4號鍵按下了
jmp kend;已經找到按下的鍵,跳到結尾吧
k20:jb p0.1,k30;列2檢查為高電平再檢查列3、4
k21:mov p0,#11101111b;列2有健按下時,P0.0會變低,到底是那一行的鍵按下呢?分別輸出行的低電平
jb p0.1,k22;該行的鍵不按下時p0.0為高電平,跳到到K22,檢查另外三行
mov r1,#5;如果正好是這行的鍵按下,將暫存器R0寫下5,表示5號鍵按下了(以後相同,不再重複了)
k22:mov p0,#11011111b
jb p0.1,k23
mov r1,#6
k23:mov p0,#10111111b
jb p0.1,k24
mov r1,#7
k24:mov p0,#01111111b
jb p0.1,kend
mov r1,#8
jmp kend;已經找到按下的鍵,跳到結尾吧(以後相同,不要重複了)
k30:jb p0.2,k40
k31:mov p0,#11101111b
jb p0.2,k32
mov r1,#9
k32:mov p0,#11011111b
jb p0.2,k33
mov r1,#10
k33:mov p0,#10111111b
jb p0.2,k34
mov r1,#11
k34:mov p0,#01111111b
jb p0.2,kend
mov r1,#12
jmp kend
k40:jb p0.3,kend
k41:mov p0,#11101111b
jb p0.3,k42
mov r1,#13
k42:mov p0,#11011111b
jb p0.3,k43
mov r1,#14
k43:mov p0,#10111111b
jb p0.3,k44
mov r1,#15
k44:mov p0,#01111111b
jb p0.3,kend
mov r1,#16
kend: ret
鍵盤掃描結束了,暫存器R1的值就直接表示了是那個鍵按下的,根據不同的鍵值去執行不同的程式,從而實現了十六個矩陣鍵盤掃描,同樣原理,最多可以識別255個按鍵的矩陣掃描。
我們可以每次鍵盤掃描開始時檢查R0的值是否為0,只有在為0才掃描鍵盤,不為0就證明剛剛掃描過鍵值,相應的按鍵工作還沒有完成。但是必須記得,每個按鍵命令執行完成後,要給R0寫上0,表示可以掃描鍵盤。
本鍵盤掃描程式的優點在於:不用專門的按鍵延時程式,提高了CPU效率,也不用中斷來掃描鍵盤,節省了硬體資源。另外,本鍵盤掃描程式,每次掃描占用CPU時最短,不論有鍵按下或者無鍵按下都可以在很短的時間完成一次掃描。
還有,本程式只使用幾條最常用的彙編命令,MOV/JB/JMP/RET,而這幾條命令是最常用、最易懂、最好學的命令!有的鍵盤掃描程式還用與呀、或呀、移位呀、查表呀,我都還沒有看懂。

相關詞條

相關搜尋

熱門詞條

聯絡我們