;;...............................
鍵盤掃描子程序---16鍵,D口低四位輸出,高四位輸入
;...............................
JIANPAN MOVLW 00H
?? MOVWF PORTD
?? MOVLW 0F0H
?? ANDWF PORTD,W
?? SUBLW 0F0H
?? BTFSC STATUS,Z;判斷D口高四位是否全為“1”
?? RETURN?????????? ;是,無鍵輸入,返回
?? CALL DELAY10MS;否,有鍵輸入,延時20ms
?? CALL DELAY10MS
?? CALL DELAY10MS
?? MOVLW 00H?????? ;再判斷一次
?? MOVWF PORTD
?? MOVLW 0F0H
?? ANDWF PORTD,W
?? SUBLW 0F0H
?? BTFSC STATUS,Z;判斷D口高四位是否全為“1”
?? RETURN?????????? ;是虛假輸入,返回
?? MOVLW 0FEH??? ;確定有鍵輸入,逐行判斷,首先RD0=0
?? MOVWF PORTD
?? BTFSS PORTD,4?? ;判鍵“0”
?? GOTO JIAN0
?? BTFSS PORTD,5?? ;判鍵“1”
?? GOTO JIAN1
?? BTFSS PORTD,6?? ;判鍵“2”
?? GOTO JIAN2
?? BTFSS PORTD,7?? ;判鍵“3”
?? GOTO JIAN3
?? MOVLW 0FDH??? ;確定有鍵輸入,逐行判斷,首先RD1=0
?? MOVWF PORTD
?? BTFSS PORTD,4?? ;判鍵“4”
?? GOTO JIAN4
?? BTFSS PORTD,5?? ;判鍵“5”
?? GOTO JIAN5
?? BTFSS PORTD,6?? ;判鍵“6”
?? GOTO JIAN6
?? BTFSS PORTD,7?? ;判鍵“7”
?? GOTO JIAN7
?? MOVLW 0FBH??? ;確定有鍵輸入,逐行判斷,首先RD0=2
?? MOVWF PORTD
?? BTFSS PORTD,4?? ;判鍵“8”
?? GOTO JIAN8
?? BTFSS PORTD,5?? ;判鍵“9”
?? GOTO JIAN9
?? BTFSS PORTD,6?? ;判鍵“A”
?? GOTO JIANA
?? BTFSS PORTD,7?? ;判鍵“B”
?? GOTO JIANB
?? MOVLW 0F7H??? ;確定有鍵輸入,逐行判斷,首先RD0=3
?? MOVWF PORTD
?? BTFSS PORTD,4?? ;判鍵“C”
?? GOTO JIANC
?? BTFSS PORTD,5?? ;判鍵“D”
?? GOTO JIAND
?? BTFSS PORTD,6?? ;判鍵“E”
?? GOTO JIANE
?? BTFSS PORTD,7?? ;判鍵“F”
?? GOTO JIANF
?? RETURN
;.................
;10 ms延時子程序
;.................
DELAY10MS MOVLW 0FH
??? MOVFW 20H
LP2??? MOVLW 0FFH
??? MOVWF 21H
LP1??? DECFSZ 21H,F
??? GOTO LP1
??? DECFSZ 22H,F
??? GOTO LP2
??? RETURN
;........................
;鍵‘0’子程序,可自定義
;........................
JIAN0 CALL SFANG;調用鍵盤釋放子程序
?? .
?? .
?? .
?? RETURN
;...................
;鍵盤釋放等待子程序
;...................
SFANG MOVLW 00H
?? MOVWF PORTD
?? MOVLW 0F0H
?? ANDWF PORTD,W
?? SUBLW 0F0H
?? BTFSS STATUS,Z
?? GOTO SFANG;鍵未釋放
?? CALL DELAY10MS; 已釋放,延時
?? CALL DELAY10MS
?? CALL DELAY10MS
?? MOVLW 0F0H;再判斷一次
?? ANDWF PORTD,W
?? SUBLW 0F0H
?? BTFSS STATUS,Z
?? GOTO SFANG;剛才為虛假釋放,等待進一步判斷
?? RETURN
以上為所有程序代碼
另外一個匯編語言源代碼:
我的鍵盤掃描程序:
?
key equ p2
disp equ p0
;7------+--+--+--+
;6------+--+--+--+
;5------+--+--+--+
;4------+--+--+--+
;3______|? |? |? |
;2_________|? |? |
;1____________|? |
;0_______________|
??????
?????? org 0000h
?????? ajmp start
?????? org 0100h
start: mov disp,#0
?????? mov dptr,#tab
loopscan:acall keyin
?????? acall keyoff
?????? mov a,r0
?????? movc a,@a+dptr
?????? mov disp,a
?????? ajmp loopscan
keyin:? mov key,#0fh
??????? mov a,key
??????? cjne a,#0fh,select
??????? sjmp keyin
select: mov a,key??
??????? cjne a,#0eh,next1
??????? ajmp row1
next1:? cjne a,#0dh,next2
??????? ajmp row2
next2:? cjne a,#0bh,next3
??????? ajmp row3
next3:? ajmp row4
row1:?? mov key,#0feh
??????? mov a,key
??????? cjne a,#0feh,row1scan
??????? ajmp row2
row1scan:cjne a,#0eeh,row11
???????? mov r0,#12
???????? acall delay20ms
???????? ajmp scanend
row11:?? cjne a,#0deh,row12
???????? mov r0,#13
???????? acall delay20ms
???????? ajmp scanend???????
row12:?? cjne a,#0beh,row13
???????? mov r0,#14
???????? acall delay20ms
???????? ajmp scanend
row13:?? mov r0,#15
???????? acall delay20ms
???????? ajmp scanend
????????
row2:?? mov key,#0fdh
??????? mov a,key
??????? cjne a,#0fdh,row2scan
??????? ajmp row3
row2scan:cjne a,#0edh,row21
???????? acall delay20ms
???????? mov r0,#8
???????? ajmp scanend
row21:?? cjne a,#0ddh,row22
???????? mov r0,#9
???????? acall delay20ms
???????? ajmp scanend???????
row22:?? cjne a,#0bdh,row23
???????? mov r0,#10
???????? acall delay20ms
???????? ajmp scanend
row23:?? mov r0,#11
???????? acall delay20ms
???????? ajmp scanend
row3:?? mov key,#0fbh
??????? mov a,key
??????? cjne a,#0fbh,row3scan
??????? ajmp row4
row3scan:cjne a,#0ebh,row31
???????? mov r0,#4
???????? acall delay20ms
???????? ajmp scanend
row31:?? cjne a,#0dbh,row32
???????? mov r0,#5
???????? acall delay20ms
???????? ajmp scanend???????
row32:?? cjne a,#0bbh,row33
???????? mov r0,#6
???????? acall delay20ms
???????? ajmp scanend
row33:?? mov r0,#7
???????? acall delay20ms
???????? ajmp scanend
row4:??? mov key,#0f7h
???????? mov a,key
???????? cjne a,#0e7h,row41
???????? mov r0,#0
???????? acall delay20ms
???????? ajmp scanend
row41:?? cjne a,#0d7h,row42
???????? mov r0,#1
???????? acall delay20ms
???????? ajmp scanend???????
row42:?? cjne a,#0b7h,row43
???????? mov r0,#2
???????? acall delay20ms
???????? ajmp scanend
row43:?? mov r0,#3
???????? acall delay20ms
???????? ajmp scanend
scanend:ret
;判斷是否松開
keyoff:? mov key,#0fh
???????? mov a,key
???????? cjne a,#0fh,keyret
???????? sjmp keyoff
keyret:? acall delay20ms
???????? ret
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;12Mhz Crystal!!!!!!!!!!!!!!!!!!!!!!!12周期單片機
delay20ms:mov r7,#250
delay20msd0:mov r6,#60
delay20msd1:djnz r6,$
??????????? djnz r7,delay20msd0
??????????? ret
???????????
tab:db 11100111b,10000100b,11010011b,11010110b,10110100b,
01110110b,01110111b,11000100b,11110111b,11110110b
db 11110101b,00110111b,01100011b,10010111b,01110011b,
01110001b,01100111b,10110101b,00100001b,10000111b
db 00100011b,00010101b,00010111b,11110001b,11110100b,10110110b
???????? end
評論