<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 從零開(kāi)始51單片機教程 —— 27 矩陣式鍵盤(pán)接口技術(shù)及程序設計

從零開(kāi)始51單片機教程 —— 27 矩陣式鍵盤(pán)接口技術(shù)及程序設計

作者: 時(shí)間:2012-02-16 來(lái)源:網(wǎng)絡(luò ) 收藏

矩陣式接口技術(shù)及程序設計

在單片機系統中中按鈕數量較多時(shí),為了減少I(mǎi)/O口的占用,常常將按鈕排列成矩陣形式,如圖1所示。在矩陣式中,每條水平線(xiàn)和垂直線(xiàn)在交叉處不直接連通,而是通過(guò)一個(gè)按鈕加以連接。這樣,一個(gè)端口(如P1口)就能組成4*4=16個(gè)按鈕,比之直接將端口線(xiàn)用于鍵盤(pán)多出了一倍,而且線(xiàn)數越多,區別越明顯,比如再多加一條線(xiàn)就能組成20鍵的鍵盤(pán),而直接用端口線(xiàn)則只能多出一鍵(9鍵)。由此可見(jiàn),在需要的鍵數比較多時(shí),采用矩陣法來(lái)做鍵盤(pán)是合理的。

點(diǎn)擊瀏覽下一頁(yè)
單片機矩陣式鍵盤(pán)接口技術(shù)及編程接口圖>

矩陣式結構的鍵盤(pán)顯然比直接法要復雜一些,識別也要復雜一些,上圖中,列線(xiàn)通過(guò)電阻接正電源,并將行線(xiàn)所接的單片機的I/O口作為輸出端,而列線(xiàn)所接的I/O口則作為輸入。這樣,當按鈕沒(méi)有按下時(shí),所有的輸出端都是高電平,代表無(wú)鍵按下。行線(xiàn)輸出是低電平,一旦有鍵按下,則輸入線(xiàn)就會(huì )被拉低,這樣,通過(guò)讀入輸入線(xiàn)的狀態(tài)就可得知是否有鍵按下了。具體的識別及編程辦法如下所述。

矩陣式鍵盤(pán)的按鈕識別辦法

確定矩陣式鍵盤(pán)上何鍵被按下介紹一種“行掃描法”。

行掃描法 行掃描法又稱(chēng)為逐行(或列)掃描查詢(xún)法,是一種最常用的按鈕識別辦法,如上圖所示鍵盤(pán),介紹過(guò)程如下。

判斷鍵盤(pán)中有無(wú)鍵按下 將全部行線(xiàn)Y0-Y3置低電平,然后檢測列線(xiàn)的狀態(tài)。只要有一列的電平為低,則表示鍵盤(pán)中有鍵被按下,而且閉合的鍵位于低電平線(xiàn)與4根行線(xiàn)相交叉的4個(gè)按鈕之中。若所有列線(xiàn)均為高電平,則鍵盤(pán)中無(wú)鍵按下。

判斷閉合鍵所在的位置 在確認有鍵按下后,即可進(jìn)入確定具體閉合鍵的過(guò)程。其辦法是:依次將行線(xiàn)置為低電平,即在置某根行線(xiàn)為低電平時(shí),其它線(xiàn)為高電平。在確定某根行線(xiàn)位置為低電平后,再逐行檢測各列線(xiàn)的電平狀態(tài)。若某列為低,則該列線(xiàn)與置為低電平的行線(xiàn)交叉處的按鈕就是閉合的按鈕。

下面給出一個(gè)具體的例程:

圖仍如上所示。8031單片機的P1口用作鍵盤(pán)I/O口,鍵盤(pán)的列線(xiàn)接到P1口的低4位,鍵盤(pán)的行線(xiàn)接到P1口的高4位。列線(xiàn)P1.0-P1.3分別接有4個(gè)上拉電阻到正電源+5V,并把列線(xiàn)P1.0-P1.3設置為輸入線(xiàn),行線(xiàn)P1.4-P.17設置為輸出線(xiàn)。4根行線(xiàn)和4根列線(xiàn)形成16個(gè)相交點(diǎn)。

檢測當前是否有鍵被按下。檢測的辦法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態(tài),若P1.0-P1.3為全“1”,則無(wú)鍵閉合,不然有鍵閉合。

去除鍵抖動(dòng)。當檢測到有鍵按下后,延時(shí)一段時(shí)間再做下一步的檢測判斷。

若有鍵被按下,應識別出是哪一個(gè)鍵閉合。辦法是對鍵盤(pán)的行線(xiàn)進(jìn)行掃描。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

在每組行輸出時(shí)讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒(méi)有鍵閉合,不然有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值

為了保證鍵每閉合一次CPU僅作一次處理,必須卻除鍵釋放時(shí)的抖動(dòng)。

點(diǎn)擊瀏覽下一頁(yè)

點(diǎn)擊瀏覽下一頁(yè)


《單片機矩陣式鍵盤(pán)接口技術(shù)及編程》

鍵盤(pán)掃描程序:

從以上分析得到單片機鍵盤(pán)掃描程序的流程圖如圖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

鍵盤(pán)處理程序就作這么一個(gè)簡(jiǎn)單的介紹,實(shí)際上,鍵盤(pán)、顯示處理是很復雜的,它一般占到一個(gè)應用程序的大部份代碼,可見(jiàn)其重要性,但說(shuō)到,這種復雜并不來(lái)自于單片機的本身,而是來(lái)自于操作者的習慣等等問(wèn)題,因此,在編寫(xiě)鍵盤(pán)處理程序之前,最好先把它從邏輯上理清,然后用適當的算法表示出來(lái),最后再去寫(xiě)代碼,這樣,才能快速有效地寫(xiě)好代碼。

DIY機械鍵盤(pán)相關(guān)社區:機械鍵盤(pán)DIY




關(guān)鍵詞: 鍵盤(pán)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>