实现矩阵键盘按键键值在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"
|