SYSTEMSET:
PUSHR0 EQU 0060H
PUSHR1 EQU 0061H
PUSHR2 EQU 0062H
PUSHR3 EQU 0063H
PUSHR4 EQU 0064H
PUSHR5 EQU 0065H
PUSHR6 EQU 0066H
PUSHR7 EQU 0067H
LCDCMDRAM EQU 70H // LCD12864写子令程序暂存器
LCDDATRAM EQU 71H // LCD12864写数据程序暂存器
KEYTONG0 EQU 72H // 键盘通码存放地址
KEYDUAN EQU 73H // 键盘断码存放地址
KEYASCI EQU 74H // 键盘ASCII码存放地址
KEYPAN EQU 75H // 键盘有无输入ASCII判断地址 有则0X02
KEYCMDPAN EQU 76H // 键盘有无命令判断地址
KEYRAMPAN EQU 77H // 键盘值是否被转换判断地址,有则
KEYSHIFT0 EQU 78H // shift键值存放地址
KEYTONG1 EQU 79H
这里开始,键值已经在ACC中
keydat:
MOV PUSHR7,R7
MOV R7,KEYDUAN
KEYREA00:
CJNE A,#0XF0,KEYREA01
MOV KEYDUAN,#0XF0
LJMP KEYREAD1
KEYREA01:
CJNE R7,#0XF0,KEYREAD0
MOV KEYTONG1,A
MOV KEYDUAN,#0X00
LJMP KEYREAD1
KEYREAD0:
MOV KEYTONG0,A
MOV KEYPAN,#0X02
KEYREAD1:
MOV R7,PUSHR7
POP ACC
RETI
KEYASCMD:
MOV PUSHR5,R5
MOV PUSHR6,R6
MOV PUSHR7,R7
MOV R5,KEYTONG1
MOV R6,KEYCMDPAN
MOV R7,KEYTONG0
MOV KEYPAN,#0X00
CJNE R6,#0X02,SHIFT
CJNE R5,#0X12,KEYMING
MOV KEYTONG1,#0X00
MOV KEYCMDPAN,#0X00
MOV KEYDUAN,#0X00
LJMP OUT
SHIFT: CJNE R7,#0X12,KEYX
MOV KEYCMDPAN,#0X02
LJMP OUT
KEYX: CJNE R7,#0X22,KEYY
MOV KEYASCI,#0X58
AJMP OUT1
KEYY: CJNE R7,#0X35,KEYZ
MOV KEYASCI,#0X59
AJMP OUT1
KEYZ: CJNE R7,#0X1A,KEY0
MOV KEYASCI,#0X5A
AJMP OUT1
KEY0: CJNE R7,#0X45,KEY1
MOV KEYASCI,#0X30
AJMP OUT1
KEY1: CJNE R7,#0X16,KEY2
MOV KEYASCI,#0X31
AJMP OUT1
KEY2: CJNE R7,#0X1E,KEY3
MOV KEYASCI,#0X32
AJMP OUT1
KEY3: CJNE R7,#0X26,KEY4
MOV KEYASCI,#0X33
AJMP OUT1
KEY4: CJNE R7,#0X25,KEY5
MOV KEYASCI,#0X34
AJMP OUT1
KEY5: CJNE R7,#0X2E,KEY6
MOV KEYASCI,#0X35
AJMP OUT1
KEY6: CJNE R7,#0X36,KEY7
MOV KEYASCI,#0X36
AJMP OUT1
KEY7: CJNE R7,#0X3D,KEY8
MOV KEYASCI,#0X37
AJMP OUT1
KEY8: CJNE R7,#0X3E,KEY9
MOV KEYASCI,#0X38
AJMP OUT1
KEY9: CJNE R7,#0X46,OUT1
MOV KEYASCI,#0X39
AJMP OUT1
KEYMING: ;键盘命令处理程序 SHIFT组合键处理程序
SHIFT1: CJNE R7,#0X16,SHIFT2 ;!
MOV KEYASCI,#0X21
AJMP OUT0
SHIFT2: CJNE R7,#0X1E,SHIFT3 ;@
MOV KEYASCI,#0X40
AJMP OUT0
SHIFT3: CJNE R7,#0X26,SHIFT4 ;#
MOV KEYASCI,#0X23
AJMP OUT0
SHIFT4: CJNE R7,#0X25,SHIFT5 ;$
MOV KEYASCI,#0X24
AJMP OUT0
SHIFT5: CJNE R7,#0X2E,SHIFT6 ;%
MOV KEYASCI,#0X25
AJMP OUT0
SHIFT6: CJNE R7,#0X36,SHIFT7 ;^
MOV KEYASCI,#0X5E
AJMP OUT0
SHIFT7: CJNE R7,#0X3D,SHIFT8 ;&
MOV KEYASCI,#0X26
AJMP OUT0
SHIFT8: CJNE R7,#0X3E,SHIFT9 ;*
MOV KEYASCI,#0X2A
AJMP OUT0
SHIFT9: CJNE R7,#0X46,OUT1 ;(
MOV KEYASCI,#0X28
AJMP OUT0
OUT0: CJNE R5,#0X12,OUT
MOV KEYCMDPAN,#0X00
MOV KEYTONG1,#0X00
MOV KEYPAN,#0X00
LJMP OUT
OUT1:
OUT: MOV KEYPAN,#0X00
MOV R5,PUSHR5
MOV R6,PUSHR6
MOV R7,PUSHR7
RET
MAIN: //主程序
LCALL INIT
LCALL SYSTEMSET
D1:
MOV PUSHR4,R4
MOV R4,KEYPAN
CJNE R4,#0X02,D3
MOV R4,PUSHR4
LJMP D2
D2:
LCALL KEYASCMD
D3:
MOV DPTR,#1700H
MOV A,KEYASCI
MOVX @DPTR,A
INC DPTR
MOV A,KEYTONG0
MOVX @DPTR,A
INC DPTR
MOV A,KEYTONG1
MOVX @DPTR,A
LCALL LCD12864REDRAMADDR
LJMP D1
RET
程序调试到,按下shift,再按其他的都正常。但松开shift,需要多按一次其他键,才能按其他键 |