實現矩陣鍵盤按鍵鍵值在LCD1602上顯示出來,基于普中51單片機開發板
代碼如下:
RS EQU P1.0
RW EQU P1.1
E EQU P2.5
LCDDATA EQU P0
dula bit P2.0;
wela bit P2.1;
CS88 EQU P2.2
ORG 0000H
AJMP START
ORG 0033H
KEYBUF EQU 30H
SETB CS88
START: MOV KEYBUF,#2
MOV SP,#60H
LCALL DELAY ;延時一段時間
MOV LCDDATA,#01H ;寫指令01H,清屏
LCALL ENABLE
MOV LCDDATA,#38H ;寫指令38H,設定LCD為16*2顯示,5*7 點陣,8位數據接口
LCALL ENABLE
MOV LCDDATA,#0FH ;寫指令0FH,顯示ON,光標ON,閃爍ON
LCALL ENABLE
MOV LCDDATA,#06H ;寫指令06H,光標輸入方式增量移位
LCALL ENABLE
MOV LCDDATA,#80H ;第一行起始字符地址
MOV R1,#14
;LCALL ENABLE
;MOV DPTR,#TABLE1 ;第一行顯示字符表頭地址
;LCALL DISP ;顯示第一行數據
;MOV R1,#5
;MOV LCDDATA,#0C0H ;第二行起始字符地址
;LCALL ENABLE
;MOV DPTR,#TABLE2 ;第二行顯示字符表頭地址
;LCALL DISP ;顯示第二行數據
WAIT:
MOV P3,#0FFH
CLR P3.4
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK1
MOV KEYBUF,#0
mov p1,#11111110b
LJMP DK1
NK1: CJNE A,#0DH,NK2
MOV KEYBUF,#4
mov p1,#11111100b
LJMP DK1
NK2: CJNE A,#0BH,NK3
MOV KEYBUF,#8
mov p1,#11111000b
LJMP DK1
NK3: CJNE A,#07H,NK4
MOV KEYBUF,#12
mov p1,#11110000b
LJMP DK1
NK4: NOP
DK1:
call display
DK1A: MOV A,P3 ;等待釋放
ANL A,#0FH
XRL A,#0FH
JNZ DK1A
NOKEY1:
MOV P3,#0FFH
CLR P3.5
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK5
MOV KEYBUF,#1
mov p1,#11111110b
LJMP DK2
NK5: CJNE A,#0DH,NK6
MOV KEYBUF,#5
mov p1,#11111100b
LJMP DK2
NK6: CJNE A,#0BH,NK7
MOV KEYBUF,#9
mov p1,#11111000b
LJMP DK2
NK7: CJNE A,#07H,NK8
MOV KEYBUF,#13
mov p1,#11110000b
LJMP DK2
NK8: NOP
DK2:
call display
DK2A: MOV A,P3 ;釋放
ANL A,#0FH
XRL A,#0FH
JNZ DK2A
NOKEY2:
MOV P3,#0FFH
CLR P3.6
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK9
MOV KEYBUF,#2
mov p1,#11111110b
LJMP DK3
NK9: CJNE A,#0DH,NK10
MOV KEYBUF,#6
mov p1,#11111100b
LJMP DK3
NK10: CJNE A,#0BH,NK11
MOV KEYBUF,#10
mov p1,#11111000b
LJMP DK3
NK11: CJNE A,#07H,NK12
MOV KEYBUF,#14
mov p1,#11110000b
LJMP DK3
NK12: NOP
DK3:
call display
DK3A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK3A
NOKEY3:
MOV P3,#0FFH
CLR P3.7
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK13
MOV KEYBUF,#3
mov p1,#11111110b
LJMP DK4
NK13: CJNE A,#0DH,NK14
MOV KEYBUF,#7
mov p1,#11111100b
LJMP DK4
NK14: CJNE A,#0BH,NK15
MOV KEYBUF,#11
mov p1,#11111000b
LJMP DK4
NK15: CJNE A,#07H,NK16
mov p1,#11110000b
MOV KEYBUF,#15
LJMP DK4
NK16: NOP
DK4:
call display
DK4A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK4A
NOKEY4:
LJMP WAIT
DELY10MS: ;@12.000MHz
PUSH 30H
PUSH 31H
MOV 30H,#20
MOV 31H,#108
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
display:
MOV LCDDATA,#01H ;寫指令01H,清屏
LCALL ENABLE
MOV LCDDATA,#80H ;第一行起始字符地址
LCALL ENABLE
MOV A,KEYBUF
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
LCALL DISP1
ds1ms: mov r1,#1
ds1lo: mov r2,#200
ds2lo: mov r3,#200
djnz r3,$
djnz r2,ds2lo
djnz r1,ds1lo
ret ;延時返回
;-----------------
ENABLE: CLR RS ;寫指令子程序(請參照1602LCD使用說 明書)
CLR RW
CLR E
LCALL DELAY
SETB E
RET
;-----------------
;DISP: MOV R1,#16 ;準備顯示一行16個字符
DISP: MOV A,#00H ;將ACC清零
MOVC A,@A+DPTR ;查表取得要顯示的數據
LCALL DISP1 ;寫入一個數據
INC DPTR ;數據表指針加1,準備取下一個數據
DJNZ R1,DISP ;一行沒有顯示完就繼續
RET
;-----------------
DISP1: MOV LCDDATA,#01H ;寫指令01H,清屏
MOV LCDDATA,#80H ;第一行起始字符地址
MOV LCDDATA,A ;寫1字節數據到顯示端口
SETB RS ;寫數據時序(請參照1602LCD使用說明 書)
CLR RW
CLR E
LCALL DELAY
SETB E
RET
;-----------------
;;-----------------
DELAY: MOV R7,#255 ;延時子程序
D1: MOV R6,#255
D2: DJNZ R6,D2
DJNZ R7,D1
RET
TABLE1: DB "0123456789ABCDEF"
|