<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è) > 嵌入式系統 > 設計應用 > 單片機鍵盤(pán)掃描程序(匯編)

單片機鍵盤(pán)掃描程序(匯編)

作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò ) 收藏
;這個(gè)相對起來(lái)比較難,如果理解不了的話(huà),可以(返回日志目錄,或者是本日志的右上角,你也可以看到)看上篇(課程設計:矩陣鍵盤(pán),相對來(lái)說(shuō),非常簡(jiǎn)單了)

;鍵盤(pán)掃描程序;此程序比較復雜,不過(guò)如果你堅持的理解下去的話(huà),還是能夠理解的,比較經(jīng)典
;最終是按鍵的值輸出到數碼管中(接在P2口)
ORG0000H
START:MOVR0,#00H;初始化程序,開(kāi)始的延時(shí)是為了使硬件能夠準備好
DJNZR0,$
LOOP: MOVSP,#60H
CALLKEY
DISPLAY:
MOV A,R4
MOV DPTR,#TABLE ;定義字形表的起始地址
MOVC A,@A+DPTR ;TABLE為表的起始地址
MOV P2,A
SJMPLOOP

本文引用地址:http://dyxdggzs.com/article/201611/315813.htm


;子程序內容,P1口的第四位為行線(xiàn),高四位為列線(xiàn)
KEY: PUSHPSW
PUSHACC
MOVP1,#0F0H ;令所有的行為低電平,全掃描字-P1.0-P1.3,列為輸入方式
;這一段只是驗證有鍵按下,并不能判斷是哪一行
MOVR7,#0FFH;設置計數常數,作為延時(shí)

KEY1:DJNZR7,KEY1

MOVA,P1;讀取P1口的列值
ANLA,#0F0H;判別有鍵值按下嗎(當有鍵按下時(shí),P1口的高四位就不全為1了,底四位還是都為0的)
;這個(gè)地方進(jìn)行相或的原因,是因為要把底四位的0000變成1111,以便下一步進(jìn)行求反
ORLA,#0FH //這個(gè)地方原版上沒(méi)有,這是又加了,如果不加的的話(huà),是不對的********

CPLA;求反后,有高電平就有鍵按下
JZEKEY;累加器為0則轉移(意為求反后本來(lái)全為0的,如果有鍵按下時(shí),求反后高四位就有1了),退出
LCALLDEL20ms ;有鍵按下,進(jìn)行處理

;下面進(jìn)行行行掃描,1行1行掃
SKEY:MOVA,#00H
MOVR0,A ;R0作為行計數器,開(kāi)始初值為0
MOVR1,A ;R1作為列計數器,開(kāi)始初值為0
MOVR2,#0FEH ;R2作為掃描暫存字,開(kāi)始初值為1111 1110,(第四位作為行掃描字)

SKEY2:MOVA,R2
MOVP1,A ;輸出行掃描字,1111 1110
NOP

NOP
NOP ;3個(gè)NOP操作使P1口輸出穩定
MOVA,P1 ;讀列值(和開(kāi)始一樣)
MOVR1,A ;暫存列值(第一次為**** 1110,既高四位有一位"可能"會(huì )為0)
ANLA,#0F0H ;取高四位,
ORLA,#0FH ;使第四位全部置1
CPLA
BIAOZHI:JNZSKEY3;累加器為非0則轉移指令(意思是判斷到按鍵在這一行),轉去處理

INCR0;如果按鍵沒(méi)在這一行,行計數器加1
SETBC;進(jìn)位標志位加1,為了在左移的時(shí)候開(kāi)始的低位0不在出現在低(循環(huán)一圈后)
MOVA,R2
RLCA;帶進(jìn)位左移1位(形成下一行掃描字,再次掃描)
MOVR2,A
MOVA,R0
;把加1后的行計數器R0和總共掃描次數(4次比較)
CJNEA,#04H,SKEY2 ;(掃描完了么)書(shū)本上這個(gè)地方也有錯誤,書(shū)本上寫(xiě)的是:SKEY1
AJMPEKEY ;如果沒(méi)有的話(huà),退出

;有鍵按下后行掃描過(guò)后,此為確列行
SKEY3:MOVA,R1 ;
JNBACC.4,SKEY5 ;直接尋址位為0咋轉移指令
JNBACC.5,SKEY6
JNBACC.6,SKEY7
JNBACC.7,SKEY8
AJMPEKEY //我自己感覺(jué)到這命令沒(méi)有用處

SKEY5:MOVA,#00H ;存0列號
MOVR3,A
AJMPDKEY

SKEY6:MOVA,#01H ;存1列號
MOVR3,A
AJMPDKEY

SKEY7:MOVA,#02H ;存2列號
MOVR3,A
AJMPDKEY

SKEY8:MOVA,#03H ;存3列號
MOVR3,A
AJMPDKEY

;取出具體的行號,再加上列號,最終確認按鍵的號碼
DKEY://MOVR4,#00H
MOVA,R0
MOVB,#04H
MULAB;讓行號*4,第四位放在A(yíng)中(總共就4行,相乘后一定<16,也就是只有第四位有值)
ADDA,R3;讓行號和列號相加,最終確認任按鍵的具體號
MOVR4,A

EKEY:POPACC
POPPSW

RET ;按鍵掃描處理函數

DEL20ms:
MOVR7,#2
DL2: MOVR6,#18
DL1: MOVR5,#255
DJNZR5,$
DJNZR6,DL1
DJNZR7,DL2

RET
;此為共陰極數碼管的數字表
TABLE: DB 3FH ;0
DB 06H ;1
DB 5BH ;2
DB 4FH ;3
DB 66H ;4
DB 6DH ;5
DB 7DH ;6
DB 27H ;7
DB 7FH ;8
DB 6FH ;9
DB77H
DB7CH
DB39H
DB5EH
DB79H
DB71H

END



關(guān)鍵詞: 單片機鍵盤(pá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>