📄 noname1'.asm
字号:
KEYBUF EQU 35H ;/*键内码
KEY EQU 39H ;/*键显示码
rs BIT P2.2 ;/*LCD模块用*/
rw BIT P2.1 ;/*LCD模块用*/
enable BIT P2.0 ;/*LCD模块用*/
LCDADR EQU 3AH ;/*LCD显示地址
DB0_DB7 DATA P1
FLAG0 EQU 0
;******************************************************************
ORG 000H
AJMP START
ORG 100H
START:
MOV R0,#7FH
CLR A
CLRRAM: MOV @R0,A
DJNZ R0,CLRRAM
MOV SP,#7DH
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
;***************************************************************
MOV FLAG0,#0
;LCD初始化
LCALL InitialL ;LCD初始化
LCALL CLRLCD ;清LCD
;*******************************************************************************************
;主程序
;*******************************************************************************************
WAIT:
LCALL KEYINPUT ;是否有键按下?
MOV A,FLAG0
CJNE A,#1,WAIT
lcall tslcd
SJMP WAIT
;*****************************************************************
tslcd:
LOOP1: MOV A,#10000000B ;set the address
MOV R1,A
CALL Write_instruction
INC R1
LOOP2:
MOV A,KEY
ADD A,#30H
CALL WriteLCDData ;显示 第一行字符
;CJNE A,#1001000B,LOOP2
;LOOP3: MOV A,#11000010B ;set the address
;CALL Write_instruction
;LOOP4: MOV R5,#KEY ;显示密码
;CALL PR_KEY
;CJNE A,#11010010B,LOOP4
;LJMP LOOP1
RET
;*****************************************************************
;InitialInitial 子程序
;// 设定 字符型LCD模块, 使用DB0--DB7,显示两行,
;// 使用5*7字型 显示器要显示 光标要显示但不闪烁 */
;*****************************************************************
InitialL:
MOV A,#00111000B ;/*LCD功能设定,8位点阵数据传送,2行显示*/
CALL Write_instruction
MOV A,#00001110B ;/*屏幕设定开显示,游标ON,但不闪烁*/
CALL Write_instruction
MOV A,#00000110B ;/*加一状态,游标向右移*/
CALL Write_instruction
RET
;*****************************************************************
;CheckBusy
;等待LCM有空可以执行下一行命令
;*****************************************************************
CheckBusy:
PUSH ACC
;CheckBusyLoop:
CLR ENABLE
SETB RW
CLR RS
SETB ENABLE
MOV A,DB0_DB7
CLR ENABLE
; JB ACC.7,CheckBusyLoop
POP ACC
CALL DELAY
RET
;*****************************************************************
;Write_instruction
;将ACC内的资料输入到LCM的IR寄存器
;*****************************************************************
Write_instruction:
CALL CheckBusy
CLR ENABLE
CLR RW
CLR RS
SETB ENABLE
MOV DB0_DB7,A
CLR ENABLE
RET
;*****************************************************************
;WriteLCDData
;将ACC内的资料输入到LCM的DR寄存器
;*****************************************************************
WriteLCDData:
CALL CheckBusy
CLR ENABLE
CLR RW
SETB RS
SETB ENABLE
MOV DB0_DB7,A
CLR ENABLE
RET
;*****************************************************************
;cls
;清除LCM的显示字幕
;*****************************************************************
CLRLCD:
MOV A,#01H ;清除LCD屏幕
CALL Write_instruction
RET
;*****************************************************************
;PR_STRING
;*****************************************************************
;PR_KEY:
; PUSH ACC
;CLR A
;MOV A,#KEY
; ADD A,#30H
;CALL WriteLCDData
;
;POP ACC
;INC A
; RET
;*****************************************************************
;PR_MIMA
;将密码显示在LCM,密码的起地址要存入R0,字串必须以00H结束
;*****************************************************************
;PR_MIMA:
;PUSH ACC
;MIMALP:
;CLR A
;MOV A,@R0
;JZ END_PRMIMA
;CALL WriteLCDData
;INC R0
;JMP MIMALP
;END_PRMIMA:
;POP ACC
;RET
;*****************************************************************
;DELAY
;延迟时间约为R6*(500uS)
;*****************************************************************
DELAY:
MOV R3,#5
D11: MOV R4,#248
DJNZ R4,$
DJNZ R3,D11
RET
;*******************************************************************************************
KEYINPUT:
MOV KEYBUF,#2
;
MOV P0,#0FFH
CLR P0.4
MOV A,P0
ANL A,#0FH
XRL A,#0FH ;有键按下吗?
JZ NOKEY1
LCALL DELY10US
MOV A,P0
ANL A,#0FH
XRL A,#0FH ;真的有键按下吗?
JZ NOKEY1
MOV A,P0
ANL A,#0FH
CJNE A,#0EH,NK1 ;键码的值是多少?P0.4xP0.0
MOV KEYBUF,#3
LJMP DK1
NK1: CJNE A,#0DH,NK2 ;键码是P0.4xP0.1 ?
MOV KEYBUF,#2
LJMP DK1
NK2: CJNE A,#0BH,NK3 ;键码是P0.4xP0.2 ?
MOV KEYBUF,#1
LJMP DK1
NK3: CJNE A,#07H,NK4 ;键码是P0.4xP0.3 ?
MOV KEYBUF,#0
LJMP DK1
NK4: NOP
DK1:
MOV A,KEYBUF
MOV DPTR,#TAB
MOVC A,@A+DPTR ;查表,取键值
MOV KEY,A
MOV FLAG0,#1 ;FLAG0=1
DK1A: MOV A,P0
ANL A,#0FH
XRL A,#0FH ;按键有没有松开?
JNZ DK1A
NOKEY1:
MOV P0,#0FFH
CLR P0.5
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
LCALL DELY10US
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P0
ANL A,#0FH
CJNE A,#0EH,NK5
MOV KEYBUF,#7
LJMP DK2
NK5: CJNE A,#0DH,NK6
MOV KEYBUF,#6
LJMP DK2
NK6: CJNE A,#0BH,NK7
MOV KEYBUF,#5
LJMP DK2
NK7: CJNE A,#07H,NK8
MOV KEYBUF,#4
LJMP DK2
NK8: NOP
DK2:
MOV A,KEYBUF
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV KEY,A
MOV FLAG0,#1 ;FLAG0=1
DK2A: MOV A,P0
ANL A,#0FH
XRL A,#0FH
JNZ DK2A
NOKEY2:
MOV P0,#0FFH
CLR P0.6
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
LCALL DELY10US
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
MOV A,P0
ANL A,#0FH
CJNE A,#0EH,NK9
MOV KEYBUF,#0bh
LJMP DK3
NK9: CJNE A,#0DH,NK10
MOV KEYBUF,#0ah
LJMP DK3
NK10: CJNE A,#0BH,NK11
MOV KEYBUF,#9
LJMP DK3
NK11: CJNE A,#07H,NK12
MOV KEYBUF,#8
LJMP DK3
NK12: NOP
DK3:
MOV A,KEYBUF
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV KEY,A
MOV FLAG0,#1 ;FLAG0=1
DK3A: MOV A,P0
ANL A,#0FH
XRL A,#0FH
JNZ DK3A
NOKEY3:
MOV P0,#0FFH
CLR P0.7
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
LCALL DELY10US
MOV A,P0
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
MOV A,P0
ANL A,#0FH
CJNE A,#0EH,NK13
MOV KEYBUF,#0fh
LJMP DK4
NK13: CJNE A,#0DH,NK14
MOV KEYBUF,#0eH
LJMP DK4
NK14: CJNE A,#0BH,NK15
MOV KEYBUF,#0dH
LJMP DK4
NK15: CJNE A,#07H,NK16
MOV KEYBUF,#0ch
LJMP DK4
NK16: NOP
DK4:
MOV A,KEYBUF
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV KEY,A
MOV FLAG0,#1 ;FLAG0=1
DK4A: MOV A,P0
ANL A,#0FH
XRL A,#0FH
JNZ DK4A
NOKEY4:
RET
;end test*********************************************
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DELY10US:
MOV R6,#10
DJNZ R6,$
RET
DELY3US:
MOV R6,#3
DJNZ R6,$
RET
;*********************************************************************
TAB: DB 01H,02H,03H,0aH ;/*键盘码00,01,02,03,*/
DB 04H,05H,06H,0bH ;/*键盘码04,05,06,07,*/
DB 07H,08H,09H,0cH ;/*键盘码08,09,0a,0b,*/
DB 0eH,00H,0fH,0dH ;/*键盘码0c,0d,0e,0f*/
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -