您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>匯編編程>

矩陣鍵盤控制程序匯總(匯編語言)

大?。?/span>0.16 MB 人氣: 2017-09-06 需要積分:0
矩陣鍵盤控制程序匯總(匯編語言)

1、矩陣鍵盤控制數(shù)碼管移位顯示

;本程序按下矩陣鍵盤的按鈕實(shí)現(xiàn)數(shù)碼管的0123456789....移位顯示,并在按下矩陣鍵盤的"P1.3*1.6"鍵后個位實(shí)現(xiàn)閃爍功能
;按鍵行列值表示如下:
;----P1.7---P1.6---P1.5---P1.4-------
;----03H----02H----01H----00H----P1.0
;----07H----06H----05H----04H----P1.1
;----0BH----0AH----09H----08H----P1.2
;----0FH----0EH----0DH----0CH----P1.3
;///////////////////////////////////////////
?
org?0000h
ajmp?main
org?0030h

CLR P3.3
setb p2.4;
setb p2.5;
setb p2.6;
setb p2.7;
MOV P2,#0001111B
?
main:
?mov?dptr,#tab??????????????? ? ;將表頭位置送入DPT
?mov?? 30h,#00h?????????????????? ? ;將30顯示單元清零?
?mov?? 31h,#00h?????????????????? ? ;將30顯示單元清零?
?mov?? 32h,#00h?????????????????? ? ;將30顯示單元清零?
?mov?? 33h,#00h?????????????????? ? ;將30顯示單元清零?
?mov?35h,#00h???????????????? ? ;將30顯示單元清零???
loop:??????????????????????????????????? ?
?jb?f0,kk1?????????????????? ? ;f0若等于一則跳到KK1處
?mov?35h,#00h???????????????? ?
kk2:???????????????????????????????????? ?
?lcall display?????????? ? ;調(diào)用顯示程序????????????????????
?lcall?key?????????? ? ;調(diào)用鍵盤描程序??????????????????
?cpl?a??????????????????????? ? ;將A的值取反?????????????????????
?jz??loop???????????? ? ;無鍵按下則返回????????????????
?mov?a,34h??????????????????? ? ;有鍵按下將鍵值送入ACC???????????
?cjne a,#0ah,norp???????????????? ? ;若A鍵未按下則返回到LOOP處???????
?setb?f0?????????????????????? ? ;若A鍵按下則將F0值1???
?ljmp loop??????????????????????? ? ;返回LOOP處不斷的循環(huán)??
kk1:???????????????????????????????????? ?
?inc?35h????????????????????? ? ;將35H向上加一
?mov?a,35h??????????????????? ? ;將35H中的值送入ACC
?cjne?a,#10,kk2??????????????? ? ;ACC中的值與10相等則跳轉(zhuǎn)至KK2
?mov?35h,#00h???????????????? ? ;若ACC等于零則將35H清零
?cpl?00h????????????????????? ? ;將00H位取反
?ajmp?kk2????????????????????? ? ;跳轉(zhuǎn)至KK2處
???????????????????????????????????????? ?
norp:??????????????????????????????????? ?
?mov?33h,32h????????????????? ? ;將32H顯示單元的內(nèi)容送入33H??
?mov 32h,31h????????????????????? ? ;將31H顯示單元的內(nèi)容送入32H??
?mov 31h,30h????????????????????? ? ;將30H單元的內(nèi)容送入31H??????
?mov?a,34h??????????????????? ? ;將鍵值送入ACC???????????????
?mov?30h,a??????????????????? ? ;將ACC的值送入30H????????????
?ljmp?loop???????????????????? ? ;返回主程序循環(huán)??????????????
display:
???mov? p2,#0ffh??????????? ;將P2口置高電平???????????????????????????
???mov r7,#100????????????? ;軟件計數(shù)器賦值???????????????????????????
dd1:???????????????????????????????????????????????????????????????????????????????????????
???jnb?00h,dd1d???????? ;若00H等0跳至DD1D
???ajmp?dd1b???????????? ;若00H等于1則跳轉(zhuǎn)至DD1B
dd1d:????????? mov a,30h??????????????? ;將顯示緩沖區(qū)30H中的值送入ACC??????????????
???movc a,@a+dptr?????????? ;查表取要顯示的數(shù)并把查表的結(jié)果送入ACC?????
???mov p0,a???????????????? ;將要顯示的數(shù)送入P0口??????????????????????
???clr p2.3???????????????? ;開個位顯示單元????????????????????????????
???lcall delay100us???????? ;延時100US?????????????????????????????????
???setb p2.3??????????????? ;關(guān)個位顯示單??????????????????????????????
???ajmp?dd1c????????????????????????????????????????????????????????
dd1b:????????????????????????????????????????????????
???mov a,30h??????????????? ;將顯示緩沖區(qū)30H中的值送入ACC??????????????
???movc a,@a+dptr?????????? ;查表取要顯示的數(shù)并把查表的結(jié)果送入ACC?????
???mov p0,a???????????????? ;將要顯示的數(shù)送入P0口??????????????????????
???setb p2.3??????????????? ;開個位顯示單元????????????????????????????
???lcall delay100us???????? ;延時100US?????????????????????????????????
???setb p2.3??????????????? ;開個位顯示單元???????????????????????????
dd1c:??????????????????????????????????????????????????????????????????????????????????????
???mov a,31h??????????????? ;將顯示緩沖區(qū)別31H中的值送入A?????????????
???movc a,@a+dptr?????????? ;查表取要顯示的數(shù)并把查表的結(jié)果送入ACC????
???mov p0,a???????????????? ;將要顯示的數(shù)送入P0口?????????????????????
???clr p2.2???????????????? ;開十位顯示單元???????????????????????????
???lcall delay100us???????? ;延時100US????????????????????????????????
???setb p2.2??????????????? ;關(guān)十位顯示單元???????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????
???mov a,32h??????????????? ;將顯示緩沖區(qū)32H中的值送入ACC????????????
???movc a,@a+dptr?????????? ;查表取要顯示的數(shù)并把查表的結(jié)果送入ACC???
???mov p0,a???????????????? ;將要顯示的數(shù)送入P0口????????????????????
???clr p2.1???????????????? ;開百位顯示單元??????????????????????????
???lcall delay100us???????? ;延時100US???????????????????????????????
???setb p2.1??????????????? ;關(guān)百位顯示單元?????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????
???mov a,33h??????????????? ;將顯示緩沖區(qū)33H中的值送入ACC??????????????????????????????????????????????????
???movc a,@a+dptr?????????? ;查表取要顯示的數(shù)并把查表的結(jié)果送入ACC?
???mov p0,a???????????????? ;將要顯示的數(shù)送入P0口??????????????????
???clr p2.0???????????????? ;開千位顯示單元????????????????????????
???lcall delay100us???????? ;延時100US?????????????????????????????
???setb p2.0??????????????? ;關(guān)千位顯示單元????????????????????????
???djnz r7,dd1????????????? ;R7不等于0返回至DD1處??????????????????
???ret????????????????????? ;R7等于0子程序返回?????????????????????
?
KEY: ?LCALL KS??????????? ;調(diào)用檢測按鍵子程序???????????????????????????
???? ?JNZ K1?????????????????????????????????? ;有鍵按下繼續(xù)????????????????????????????
?ljmp?key_exit???????????????????????? ;無鍵按下退出KEY子程序???????????????????
K1:? LCALL delay4ms????????????????????????????? ;返回繼續(xù)檢測有無按鍵按下????????????????
???? LCALL delay4ms???????????????????????????????????????????????????????????????????????
???? LCALL KS??????????????????????????????????? ;有鍵按下繼續(xù)延時去抖動??????????????????
???? JNZ K2????????????????????????????????????? ;再一次調(diào)用檢測按鍵程序??????????????????
?ljmp?key_exit???????????????????????? ;無鍵按下退出KEY子程序???????????????????
K2:?MOV R2,#0EFH???????????????????????????? ;將掃描值送入 R2暫存?????????????????????
???? ?MOV R4,#00H????????????????????????????? ;將第一列的列值00H送入R4暫存,R4用于存放列
K3:?MOV P1,R2??????????????????????????????? ;將R2的值送入P1口????????????????????????
L6:?JB P1.0,L1?????????????????????????????? ;P1.0等于1跳轉(zhuǎn)到L1???????????????????????
???? ?MOV A,#00H?????????????????????????????? ;將第一行的行值00H送入ACC????????????????
???? ?AJMP LK????????????????????????????????? ;跳轉(zhuǎn)到鍵值處理程序??????????????????????
L1:?JB P1.1,L2?????????????????????????????? ;P1.1等于1跳轉(zhuǎn)到L2???????????????????????
???? MOV A,#04H????????????????????????????????? ;將第二行的行值04H送入ACC???????????????????
???? AJMP LK???????????????????????????????????? ;跳轉(zhuǎn)到鍵值理程序進(jìn)行鍵值處理????????????
L2: JB P1.2,L3?????????????????????????????????? ;P1.2等于1跳轉(zhuǎn)到L3???????????????????????
???? MOV A,#08H????????????????????????????????? ;將第三行的行值08H送入ACC???????????????????
???? AJMP LK???????????????????????????????????? ;跳轉(zhuǎn)到鍵值處理程序??????????????????????
L3:?JB P1.3,NEXT???????????????????????????? ;P1.3等于1跳轉(zhuǎn)到NEXT處???????????????????
???? MOV A,#0cH????????????????????????????????? ;將第四行的行值0CH送入ACC???????????????????
LK:?ADD A,R4???????????????????????????????? ;行值與列值相加后的鍵值送入A?????????????
??mov?34h,a??????????????????? ;將A中的值送入34h暫存????????????????????
K4:?;LCALL delay4ms????????????????????????? ;????????????????????????????????????????
??lcall display??????????????????? ;調(diào)用動態(tài)顯示子程序??????????????????????
???? LCALL KS??????????????????????????????????? ;????????????????????????????????????????
???? JNZ K4????????????????????????????????????? ;按鍵沒有松開繼續(xù)返回檢測????????????????
???? RET???????????????????????????????????????? ;按鍵松開返回????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????
NEXT:?????????????????????????????????????????????????????????????????????????????????????
??? INC? R4????????????????????????????????????? ;將列值加一??????????????????????????????
??? MOV A,R2???????????????????????????????????? ;將R2的值送入A???????????????????????????
??? JNB ACC.7,key_exit?????????????????????????? ;掃描完成跳至KEY處進(jìn)行下一回合的掃描?????
??? RL A???????????????????????????????????????? ;掃描未完成將A中的值右移一位進(jìn)行下一列的掃描??
??? MOV R2,A???????????????????????????????????? ;將ACC的值送入R2暫存?????????????????????
??? AJMP K3????????????????????????????????????? ;跳轉(zhuǎn)到K3繼續(xù)????????????????????????????
key_exit:?????????????????????????????????????????????????????????????????????????????????
??mov a,#0ffh????????????????????? ;無鍵按下則將A賦成0FFH。?????????????????
??ret???????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????
KS:?MOV P1,#0FH????????????????????????????? ;將P1口高四位置0低四位值1????????????????
???? MOV A,P1??????????????????????????????????? ;讀P1口??????????????????????????????????
???? XRL A,#0FH????????????????????????????????? ;將A中的值與A中的值相異或????????????????
???? RET???????????????????????????????????????? ;子程序返回??????????????????????????????
delay4ms:???????????? ;4ms延時
????? MOV R5,#08H
L7:?MOV R6,#0FAH
L8:?DJNZ R6,L8
???? DJNZ R5,L7
???? RET
delay100us:????????????????????????????????????? ;100us延時
???mov r5,#50
???djnz?r5,$
???ret
tab:?db?0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh
end

?

?
?
?
?
?
?
?

2、矩陣鍵盤控制數(shù)碼管移位顯示

;本程序按下矩陣鍵盤的按鈕實(shí)現(xiàn)數(shù)碼管的0123456789....移位顯示,并在按下矩陣鍵盤的"P1.3*1.6"鍵后個位實(shí)現(xiàn)閃爍功能
;按鍵行列值表示如下:
;----P1.7---P1.6---P1.5---P1.4-------
;----03H----02H----01H----00H----P1.0
;----07H----06H----05H----04H----P1.1
;----0BH----0AH----09H----08H----P1.2
;----0FH----0EH----0DH----0CH----P1.3
;///////////////////////////////////////////
?
org?0000h
ajmp?main
org?0030h

CLR P3.3
setb p2.4;
setb p2.5;
setb p2.6;
setb p2.7;
MOV P2,#0001111B
?
main:
?mov?dptr,#tab??????????????? ? ;將表頭位置送入DPT
?mov?? 30h,#00h?????????????????? ? ;將30顯示單元清零?
?mov?? 31h,#00h?????????????????? ? ;將30顯示單元清零?
?mov?? 32h,#00h?????????????????? ? ;將30顯示單元清零?
?mov?? 33h,#00h?????????????????? ? ;將30顯示單元清零?
?mov?35h,#00h???????????????? ? ;將30顯示單元清零???
loop:??????????????????????????????????? ?
?jb?f0,kk1?????????????????? ? ;f0若等于一則跳到KK1處
?mov?35h,#00h???????????????? ?
kk2:???????????????????????????????????? ?
?lcall display?????????? ? ;調(diào)用顯示程序????????????????????
?lcall?key?????????? ? ;調(diào)用鍵盤描程序??????????????????
?cpl?a??????????????????????? ? ;將A的值取反?????????????????????
?jz??loop???????????? ? ;無鍵按下則返回????????????????
?mov?a,34h??????????????????? ? ;有鍵按下將鍵值送入ACC???????????
?cjne a,#0ah,norp???????????????? ? ;若A鍵未按下則返回到LOOP處???????
?setb?f0?????????????????????? ? ;若A鍵按下則將F0值1???
?ljmp loop??????????????????????? ? ;返回LOOP處不斷的循環(huán)??
kk1:???????????????????????????????????? ?
?inc?35h????????????????????? ? ;將35H向上加一
?mov?a,35h??????????????????? ? ;將35H中的值送入ACC
?cjne?a,#10,kk2??????????????? ? ;ACC中的值與10相等則跳轉(zhuǎn)至KK2
?mov?35h,#00h???????????????? ? ;若ACC等于零則將35H清零
?cpl?00h????????????????????? ? ;將00H位取反
?ajmp?kk2????????????????????? ? ;跳轉(zhuǎn)至KK2處
???????????????????????????????????????? ?
norp:??????????????????????????????????? ?
?mov?33h,32h????????????????? ? ;將32H顯示單元的內(nèi)容送入33H??
?mov 32h,31h????????????????????? ? ;將31H顯示單元的內(nèi)容送入32H??
?mov 31h,30h????????????????????? ? ;將30H單元的內(nèi)容送入31H??????
?mov?a,34h??????????????????? ? ;將鍵值送入ACC???????????????
?mov?30h,a??????????????????? ? ;將ACC的值送入30H????????????
?ljmp?loop???????????????????? ? ;返回主程序循環(huán)??????????????
display:
???mov? p2,#0ffh??????????? ;將P2口置高電平???????????????????????????
???mov r7,#100????????????? ;軟件計數(shù)器賦值???????????????????????????
dd1:???????????????????????????????????????????????????????????????????????????????????????
???jnb?00h,dd1d???????? ;若00H等0跳至DD1D
???ajmp?dd1b???????????? ;若00H等于1則跳轉(zhuǎn)至DD1B
dd1d:????????? mov a,30h??????????????? ;將顯示緩沖區(qū)30H中的值送入ACC??????????????
???movc a,@a+dptr?????????? ;查表取要顯示的數(shù)并把查表的結(jié)果送入ACC?????
???mov p0,a???????????????? ;將要顯示的數(shù)送入P0口??????????????????????
???clr p2.3???????????????? ;開個位顯示單元????????????????????????????
???lcall delay100us???????? ;延時100US?????????????????????????????????
???setb p2.3??????????????? ;關(guān)個位顯示單??????????????????????????????
???ajmp?dd1c????????????????????????????????????????????????????????
dd1b:????????????????????????????????????????????????
???mov a,30h??????????????? ;將顯示緩沖區(qū)30H中的值送入ACC??????????????
???movc a,@a+dptr?????????? ;查表取要顯示的數(shù)并把查表的結(jié)果送入ACC?????
???mov p0,a???????????????? ;將要顯示的數(shù)送入P0口??????????????????????
???setb p2.3??????????????? ;開個位顯示單元????????????????????????????
???lcall delay100us???????? ;延時100US?????????????????????????????????
???setb p2.3??????????????? ;開個位顯示單元???????????????????????????
dd1c:??????????????????????????????????????????????????????????????????????????????????????
???mov a,31h??????????????? ;將顯示緩沖區(qū)別31H中的值送入A?????????????
???movc a,@a+dptr?????????? ;查表取要顯示的數(shù)并把查表的結(jié)果送入ACC????
???mov p0,a???????????????? ;將要顯示的數(shù)送入P0口?????????????????????
???clr p2.2???????????????? ;開十位顯示單元???????????????????????????
???lcall delay100us???????? ;延時100US????????????????????????????????
???setb p2.2??????????????? ;關(guān)十位顯示單元???????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????
???mov a,32h??????????????? ;將顯示緩沖區(qū)32H中的值送入ACC????????????
???movc a,@a+dptr?????????? ;查表取要顯示的數(shù)并把查表的結(jié)果送入ACC???
???mov p0,a???????????????? ;將要顯示的數(shù)送入P0口????????????????????
???clr p2.1???????????????? ;開百位顯示單元??????????????????????????
???lcall delay100us???????? ;延時100US???????????????????????????????
???setb p2.1??????????????? ;關(guān)百位顯示單元?????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????
???mov a,33h??????????????? ;將顯示緩沖區(qū)33H中的值送入ACC??????????????????????????????????????????????????
???movc a,@a+dptr?????????? ;查表取要顯示的數(shù)并把查表的結(jié)果送入ACC?
???mov p0,a???????????????? ;將要顯示的數(shù)送入P0口??????????????????
???clr p2.0???????????????? ;開千位顯示單元????????????????????????
???lcall delay100us???????? ;延時100US?????????????????????????????
???setb p2.0??????????????? ;關(guān)千位顯示單元????????????????????????
???djnz r7,dd1????????????? ;R7不等于0返回至DD1處??????????????????
???ret????????????????????? ;R7等于0子程序返回?????????????????????
?
KEY: ?LCALL KS??????????? ;調(diào)用檢測按鍵子程序???????????????????????????
???? ?JNZ K1?????????????????????????????????? ;有鍵按下繼續(xù)????????????????????????????
?ljmp?key_exit???????????????????????? ;無鍵按下退出KEY子程序???????????????????
K1:? LCALL delay4ms????????????????????????????? ;返回繼續(xù)檢測有無按鍵按下????????????????
???? LCALL delay4ms???????????????????????????????????????????????????????????????????????
???? LCALL KS??????????????????????????????????? ;有鍵按下繼續(xù)延時去抖動??????????????????
???? JNZ K2????????????????????????????????????? ;再一次調(diào)用檢測按鍵程序??????????????????
?ljmp?key_exit???????????????????????? ;無鍵按下退出KEY子程序???????????????????
K2:?MOV R2,#0EFH???????????????????????????? ;將掃描值送入 R2暫存?????????????????????
???? ?MOV R4,#00H????????????????????????????? ;將第一列的列值00H送入R4暫存,R4用于存放列
K3:?MOV P1,R2??????????????????????????????? ;將R2的值送入P1口????????????????????????
L6:?JB P1.0,L1?????????????????????????????? ;P1.0等于1跳轉(zhuǎn)到L1???????????????????????
???? ?MOV A,#00H?????????????????????????????? ;將第一行的行值00H送入ACC????????????????
???? ?AJMP LK????????????????????????????????? ;跳轉(zhuǎn)到鍵值處理程序??????????????????????
L1:?JB P1.1,L2?????????????????????????????? ;P1.1等于1跳轉(zhuǎn)到L2???????????????????????
???? MOV A,#04H????????????????????????????????? ;將第二行的行值04H送入ACC???????????????????
???? AJMP LK???????????????????????????????????? ;跳轉(zhuǎn)到鍵值理程序進(jìn)行鍵值處理????????????
L2: JB P1.2,L3?????????????????????????????????? ;P1.2等于1跳轉(zhuǎn)到L3???????????????????????
???? MOV A,#08H????????????????????????????????? ;將第三行的行值08H送入ACC???????????????????
???? AJMP LK???????????????????????????????????? ;跳轉(zhuǎn)到鍵值處理程序??????????????????????
L3:?JB P1.3,NEXT???????????????????????????? ;P1.3等于1跳轉(zhuǎn)到NEXT處???????????????????
???? MOV A,#0cH????????????????????????????????? ;將第四行的行值0CH送入ACC???????????????????
LK:?ADD A,R4???????????????????????????????? ;行值與列值相加后的鍵值送入A?????????????
??mov?34h,a??????????????????? ;將A中的值送入34h暫存????????????????????
K4:?;LCALL delay4ms????????????????????????? ;????????????????????????????????????????
??lcall display??????????????????? ;調(diào)用動態(tài)顯示子程序??????????????????????
???? LCALL KS??????????????????????????????????? ;????????????????????????????????????????
???? JNZ K4????????????????????????????????????? ;按鍵沒有松開繼續(xù)返回檢測????????????????
???? RET???????????????????????????????????????? ;按鍵松開返回????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????
NEXT:?????????????????????????????????????????????????????????????????????????????????????
??? INC? R4????????????????????????????????????? ;將列值加一??????????????????????????????
??? MOV A,R2???????????????????????????????????? ;將R2的值送入A???????????????????????????
??? JNB ACC.7,key_exit?????????????????????????? ;掃描完成跳至KEY處進(jìn)行下一回合的掃描?????
??? RL A???????????????????????????????????????? ;掃描未完成將A中的值右移一位進(jìn)行下一列的掃描??
??? MOV R2,A???????????????????????????????????? ;將ACC的值送入R2暫存?????????????????????
??? AJMP K3????????????????????????????????????? ;跳轉(zhuǎn)到K3繼續(xù)????????????????????????????
key_exit:?????????????????????????????????????????????????????????????????????????????????
??mov a,#0ffh????????????????????? ;無鍵按下則將A賦成0FFH。?????????????????
??ret???????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????
KS:?MOV P1,#0FH????????????????????????????? ;將P1口高四位置0低四位值1????????????????
???? MOV A,P1??????????????????????????????????? ;讀P1口??????????????????????????????????
???? XRL A,#0FH????????????????????????????????? ;將A中的值與A中的值相異或????????????????
???? RET???????????????????????????????????????? ;子程序返回??????????????????????????????
delay4ms:???????????? ;4ms延時
????? MOV R5,#08H
L7:?MOV R6,#0FAH
L8:?DJNZ R6,L8
???? DJNZ R5,L7
???? RET
delay100us:????????????????????????????????????? ;100us延時
???mov r5,#50
???djnz?r5,$
???ret
tab:?db?0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh
end
?
?
?
?
?
?
?
?
?
?

3、矩陣鍵盤按鈕=液晶1602流動顯示預(yù)定字符

;按壓矩陣鍵盤按鈕=液晶1602顯示預(yù)定字符
;按鍵行列值表示如下:?????????????????????
;----P1.7---P1.6---P1.5---P1.4-------?????
;----03H----02H----01H----00H----P1.0?????
;----07H----06H----05H----04H----P1.1?????
;----0BH----0AH----09H----08H----P1.2????
;----0FH----0EH----0DH----0CH----P1.3??
;///////////////////////////////////////////???????
RS EQU P2.0 ????;決定要傳送的是命令還是數(shù)據(jù)???
RW EQU P2.1???????????????? ;決定要讀還是寫,一般寫的時候多.?????
E? EQU P2.2???????????????? ;時鐘信號???????????????????????????
SJ EQU P0?????????????????? ;數(shù)據(jù)線?????????????????????????????
org?00h
ajmp main
org 030h????????????
main:
mov sp,#60h????
main1:???????????
lcall delay????????????????????????????? ;延時一段時間??????????????????
MOV SJ,#38H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;寫指令38H?????????????????????
MOV SJ,#38H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;寫指令38H?????????????????????
MOV SJ,#38H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;寫指令38H?????????????????????
MOV SJ,#38H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;寫指令38H?????????????????????
MOV SJ,#08H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;寫指令08H?????????????????????
MOV SJ,#01H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;寫指令01H????????????????????
MOV SJ,#06H????????????????????????????? ;
ACALL ENABLE???????????????????????????? ;寫指令06H?????????????????????
MOV SJ,#0cH????????????????????????? ;
ACALL ENABLE???????????????????????????? ;寫指令0CH????????????????????
?mov?dptr,#table????????????? ;將表頭地址送入DPTR
?lcall?key????????????????????? ;調(diào)用鍵盤描程序
?mov?b,#02h?????????????????? ;將立即數(shù)送入寄存器B
?mul?ab?????????????????????? ;將鍵值與B中的數(shù)相乘
?mov?30h,a??????????????????? ;將相乘后的結(jié)果送入30H暫存
?movc?a,@a+dptr??????????????? ;查表并將所查得結(jié)果送入ACC中
?mov??31h,a??????????? ;將ACC中的數(shù)送入31H
?mov??a,30h??????????? ;送30H中的數(shù)至ACC
?inc??a??????????????? ;將ACC中的值加一
?movc?a,@a+dptr??????????????? ;查表并所查到的低半字節(jié)送入ACC中
?mov??dpl,a??????????? ;將ACC中的值送入數(shù)據(jù)指針的低8位?
mov ?dph,31h????????????????????????? ;將ACC中的值送入數(shù)據(jù)指針的高8位
?
MOV SJ,#80H;wei zhi????????????????????? ;第一行位置???????????
ACALL ENABLE???????????????????????????? ;調(diào)用寫時序
call write1????????????????????????????? ;調(diào)用寫子程序
jmp main1??????????????????????????????? ;返回主程序循環(huán)
ENABLE:?????;寫指令時序子程序????
CLR RS
CLR RW?
CLR E?
ACALL DELAY?
SETB E?
RET
write1:?????;寫字符串 子程序?
mov r1,#00h??????????????????????????????
a1:mov a,r1????????????????????????
movc a,@a+dptr?????????????????????
call write2????????????????????????
inc r1?????????????????????????????
cjne r1,#10h,a1????????????????????
ret????????????????????????????????
???????????????????????????????????
write2:????????????????????????????????? ;寫單個字符子程序????????????
mov SJ,a????????????????
setb rs????????????????????????????
clr rw
clr e
call delay
setb e
ret

delay:??????????????????????????????? ;130ms延時子程序
mov r7,#255
d1:mov r6,#255
d2:djnz r6,d2
djnz r7,d1
ret
KEY: LCALL KS?????????????????????????? ;調(diào)用檢測按鍵子程序????????????????????????????????????????????
???? JNZ K1???????????????????????????? ;有鍵按下繼續(xù)?????????????????????????????????????
???? LCALL DELAY2?????????????????????? ;無鍵按下調(diào)用延時去抖動程序???????????????????????
???? AJMP KEY?????????????????????????? ;返回繼續(xù)檢測有無按鍵按下?????????????????????????
K1:? LCALL DELAY2?????????????????????????????????????????????????????????????????????????
???? LCALL DELAY2?????????????????????? ;有鍵按下繼續(xù)延時去抖動???????????????????????????
???? LCALL KS?????????????????????????? ;再一次調(diào)用檢測按鍵程序???????????????????????????
???? JNZ K2???????????????????????????? ;確認(rèn)有按下進(jìn)行下一步?????????????????????????????
???? AJMP KEY?????????????????????????? ;無鍵按下返回繼續(xù)檢測?????????????????????????????
K2:?MOV R2,#0EFH??????????????????? ;將掃描值送入 R2暫存??????????????????????????????
???? MOV R4,#00H??????????????????????? ;將第一列的列值00H送入R4暫存,R4用于存放列值。?????
K3:?MOV P1,R2?????????????????????? ;將R2的值送入P1口?????????????????????????????????
L6:?JB P1.0,L1????????????????????? ;P1.0等于1跳轉(zhuǎn)到L1????????????????????????????????
???? MOV A,#00H???????????????????????? ;將第一行的行值00H送入ACC?????????????????????????
???? AJMP LK??????????????????????????? ;跳轉(zhuǎn)到鍵值處理程序???????????????????????????????
L1:?JB P1.1,L2????????????????????? ;P1.1等于1跳轉(zhuǎn)到L2????????????????????????????????
???? MOV A,#04H???????????????????????? ;將第二行的行值送入ACC????????????????????????????
???? AJMP LK??????????????????????????? ;跳轉(zhuǎn)到鍵值理程序進(jìn)行鍵值處理?????????????????????
L2: JB P1.2,L3????????????????????????? ;P1.2等于1跳轉(zhuǎn)到L3????????????????????????????????
???? MOV A,#08H???????????????????????? ;將第三行的行值送入ACC????????????????????????????
???? AJMP LK??????????????????????????? ;跳轉(zhuǎn)到鍵值處理程序???????????????????????????????
L3:?JB P1.3,NEXT??????????????????? ;P1.3等于1跳轉(zhuǎn)到NEXT處????????????????????????????
???? MOV A,#0cH???????????????????????? ;將第四行的行值送入ACC????????????????????????????
LK:?ADD A,R4??????????????????????? ;行值與列值相加后的鍵值送入A??????????????????????
???? PUSH ACC?????????????????????????? ;將A中的值送入堆棧暫存????????????????????????????
K4:?LCALL DELAY2??????????????????? ;調(diào)用延時去抖動程序???????????????????????????????
???? LCALL KS?????????????????????????? ;調(diào)用按鍵檢測程序?????????????????????????????????
???? JNZ K4???????????????????????????? ;按鍵沒有松開繼續(xù)返回檢測?????????????????????????
???? POP ACC??????????????????????????? ;將堆棧的值送入ACC????????????????????????????????
???? RET??????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????
NEXT:?????????????????????????????????????????????????????????????????????????????????????
??? INC? R4???????????????????????????? ;將列值加一???????????????????????????????????????
??? MOV A,R2??????????????????????????? ;將R2的值送入A????????????????????????????????????
??? JNB ACC.7,KEY?????????????????????? ;掃描完成跳至KEY處進(jìn)行下一回合的掃描??????????????
??? RL A??????????????????????????????? ;掃描未完成將A中的值右移一位進(jìn)行下一列的掃描??????
??? MOV R2,A??????????????????????????? ;將ACC的值送入R2暫存??????????????????????????????
??? AJMP K3???????????????????????????? ;跳轉(zhuǎn)到K3繼續(xù)?????????????????????????????????????
KS:?MOV P1,#0FH???????????????????? ;將P1口高四位置0低四位值1?????????????????????????
???? MOV A,P1?????????????????????????? ;讀P1口???????????????????????????????????????????
???? XRL A,#0FH???????????????????????? ;將A中的值與A中的值相異或?????????????????????????
???? RET??????????????????????????????? ;子程序返回???????????????????????????????????????
DELAY2:???????????????????????????????? ;40ms延時去抖動子程序8*FA*2=40ms??????????????????
????? MOV R5,#08H?????????????????????????????????????????????????????????????????????????
L7:?MOV R6,#0FAH
L8:?DJNZ R6,L8
???? DJNZ R5,L7
???? RET
table:?dw?table0,table1,table2,table3,table4,table5,table6,table7,table8??????
?dw?table9,table10,table11,table12,table13,table14,table15
table0: db "? 0451-82314775 "? ;矩陣鍵盤P1.0*1.4
table1: db "? www.pp51.com? "? ;矩陣鍵盤P1.0*1.5
table2: db "pp51com@163.com "? ;矩陣鍵盤P1.0*1.6
table3: db "pp51com@tom.com "? ;矩陣鍵盤P1.0*1.7
table4: db "the 4th key???? "? ;矩陣鍵盤P1.1*1.4
table5: db "the 5th key???? "? ;矩陣鍵盤P1.1*1.5
table6: db "the 6th key???? "? ;矩陣鍵盤P1.1*1.6
table7: db "the 7th key???? "? ;矩陣鍵盤P1.1*1.7
table8: db "the 8th key???? "? ;矩陣鍵盤P1.2*1.4
table9: db "the 9th key???? "? ;矩陣鍵盤P1.2*1.5
table10: db "the 10th key??? " ;矩陣鍵盤P1.2*1.6
table11: db "the 11th key??? " ;矩陣鍵盤P1.2*1.7
table12: db "the 12th key??? " ;矩陣鍵盤P1.3*1.4
table13: db "the 13th key??? " ;矩陣鍵盤P1.3*1.5
table14: db "the 14th key??? " ;矩陣鍵盤P1.3*1.6
table15: db "the 15th key??? " ;矩陣鍵盤P1.3*1.7
end
?

4、矩陣鍵盤數(shù)碼管顯示鍵值

? ? ? ? ? ?RELAY? EQU? P1.3
?????????? BEEP?? EQU? P3.7
;------------------------------------------------------
?????????? ORG? 0000H
?????????? JMP? MAIN
;------------------------------------------------------
MAIN:????? MOV? SP,#60H
?????????? MOV? 30H,#00H??????????
LOOP1:
?????????? CALL? KEY_IN
?????????? CALL? KEY_PLAER
?????????? JMP? LOOP1
;-----------------------------------------------------
KEY_IN:??? MOV? P1,#0F0H????????? ;置列線為0,行線為1
?????????? MOV? A,P1
?????????? ANL? A,#0F0H
?????????? MOV? B,A
?????????? MOV? P1,#0FH?????????? ;置列線為1,行線為0
?????????? MOV? A,P1
?????????? ANL? A,#0FH
?????????? ORL? A,B?????????????? ;高四位與低四位重新組合
?????????? CJNE? A,#0FFH,KEY_IN1? ;0FFH為末按鍵
?????????? RET
KEY_IN1:?? MOV? B,A
?????????? MOV? DPTR,#KEYTABLE
?????????? MOV? R3,#0FFH?????????? ;
KEY_IN2:?? INC? R3
?????????? MOV? A,R3
?????????? MOVC? A,@A+DPTR
?????????? CJNE? A,B,KEY_IN3
?????????? MOV? A,R3???????????? ;找到,取順序碼????????????
?????????? MOV? 30H,A
?????????? CALL? BEEP_BL
?????????? RET
KEY_IN3:?? CJNE? A,#0FFH,KEY_IN2? ;末完,繼續(xù)查
?????????? RET??????????????????? ;0FFH為結(jié)束碼
;----------------------------------------------
;蜂鳴器響一聲子程序
;----------------------------------------------
BEEP_BL:
?????????? MOV? R6,#100
? BL1:???? CALL? DEX1
?????????? CPL? BEEP
?????????? DJNZ? R6,BL1
?????????? MOV? R5,#25
?????????? CALL? DELAY
?????????? RET
?DEX1:???? MOV? R7,#180
?DEX2:???? NOP
?????????? DJNZ? R7,DEX2
?????????? RET
DELAY:??????????????????? ;延時R5×10MS
?????????? MOV? R6,#50
DELAY1:??? MOV? R7,#100
?????????? DJNZ? R7,$
?????????? DJNZ? R6,DELAY1
?????????? DJNZ? R5,DELAY
?????????? RET
;-----------------------------------------------------
KEYTABLE:
??? DB? 0EEH,0EDH,0EBH,0E7H,0DEH? ;0,1,2,3,4,? 順序碼
??? DB? 0DDH,0DBH,0D7H,0BEH,0BDH? ;5,6,7,8,9,
??? DB? 0BBH,0B7H,07EH,07DH,07BH? ;A,B,C,D,E,
??? DB? 077H,0FFH???????????????? ;F????? 0FF為結(jié)束碼
;-----------------------------------------------------
;鍵值顯示子程序
;使用一個數(shù)碼管顯示
;-----------------------------------------------------
KEY_PLAER:
????????????
???????????? MOV? A,30H
???????????? MOV? DPTR,#TAB????? ;取段碼表地址
???????????? MOVC? A,@A+DPTR???? ;查顯示數(shù)據(jù)對應(yīng)段碼
???????????? MOV? P0,A?????????? ;段碼放入P0口
???????????? CLR? P2.7?????????? ;第一個數(shù)碼管亮
???????????? RET???????????????
;-----------------------------------------------------
TAB:
?DB? 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
?DB? 80H,90H,88h,83h,0c6h,0a1h,86h,8eh
;-----------------------------------------------------
??? END
?

5、矩陣鍵盤聲音提示數(shù)碼管輸出

;本程序按下矩陣鍵盤的按鈕實(shí)現(xiàn)數(shù)碼管的0 1 2 3 4 5 6 7 8 9 A B C D E F,同時喇叭輸出聲音提示
;///////////////////////////////////////////
?org 0000h
?ajmp?main
?org?000bh
?ajmp?timer0
?org 0030h
main:
?mov?30h,#100
?mov tmod,#01h
?mov ie,#82h
?mov th0,#high(64536)
?mov tl0,#low(64536)
?mov?dptr,#tab
?lcall?key
?movc?a,@a+dptr
?mov?p0,a
?CLR P2.0
?ljmp?main
timer0:???;1ms timer
?mov th0,#high(64536)
?mov tl0,#low(64536)
?cpl?p3.7
?djnz?30h,t_e
?mov?30h,#100
?clr?tr0
t_e:?reti
??
KEY: LCALL KS
???? JNZ K1
???? LCALL DELAY2
???? AJMP KEY
K1:? LCALL DELAY2
???? LCALL DELAY2
???? LCALL KS
???? JNZ K2
???? AJMP KEY
K2:? setb?tr0
?MOV R2,#0EFH
???? MOV R4,#00H
K3:?MOV P1,R2
L6:?JB P1.0,L1?
???? MOV A,#00H
???? AJMP LK
L1:?JB P1.1,L2
???? MOV A,#04H
???? AJMP LK
L2: JB P1.2,L3??????????????
???? MOV A,#08H
???? AJMP LK
L3:?JB P1.3,NEXT
???? MOV A,#0cH
LK:?ADD A,R4
???? PUSH ACC
K4:?LCALL DELAY2
???? LCALL KS
???? JNZ K4
???? POP ACC
?????
???? RET
?????
NEXT:
??? INC? R4
??? MOV A,R2
??? JNB ACC.7,KEY
??? RL A
??? MOV R2,A
??? AJMP K3
KS:?MOV P1,#0FH
???? MOV A,P1
???? XRL A,#0FH
???? RET
DELAY2:
????? MOV R5,#08H
L7:?MOV R6,#0FAH
L8:?DJNZ R6,L8
???? DJNZ R5,L7
???? RET
tab:?db?0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh
end
?

6、最簡單的鍵盤控制

;當(dāng)按壓鍵盤P1.4,P1.5,P1.6,P1.7的時候會看到P2口作出的反映,此為平凡經(jīng)典入門教程范例之一
main:mov p1,#0ffh? ;把11111111(FF)移動到P1口,使P1的8個口在沒有鍵盤置低的情況下輸出高電
loop:mov a,p1? ;把P1的值移動到寄存器A
mov p2,a? ;把寄存器A的值移動到P2,就此完成在了P1輸入狀態(tài)控制P2輸出狀態(tài)的最簡過程
ljmp loop? ;這是個重要的命令,否則上面的語句將失去作用,詳解請參看平凡單片機(jī)入門教程
END
?

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發(fā)表評論

      用戶評論
      評價:好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關(guān)規(guī)定!

      ?