📄 lcd1602定时控制.asm
字号:
ADD A,#48D
LCALL WRITEDDR
MOV A,B
ADD A,#48D
LCALL WRITEDDR
MOV A,39H
CJNE A,#01H,DISP1 ;循环显示状态还是设置状态
MOV A,36H
LCALL WRITEDDR
MOV A,35H
MOV B,#10D
DIV AB
ADD A,#48D
LCALL WRITEDDR
MOV A,B
ADD A,#48D
LCALL WRITEDDR
DISP1:MOV A,#11001100B
LCALL WRITEIR
MOV A,34H
CJNE A,#01H,OFF
MOV DPTR,#DATA_ON
LCALL LCD_DISP
RET
OFF: MOV DPTR,#DATA_OFF
LCALL LCD_DISP
RET
;********************************************
KEY:MOV P1,#0FFH
MOV A,P1
ANL A,#11110000B
CJNE A,#11110000B,KEY_PANDUAN
KEY_EXIT: RET
KEY_PANDUAN:MOV 3AH,A
MOV R4,#15D
LCALL DELAY
MOV A,P1
ANL A,#11110000B
CJNE A,3AH,KEY_EXIT
LCALL KEY_CHULI
RET
;*********************************************
;按键处理
KEY_CHULI:CJNE A,#11100000B,SET_DATA
CLR TR1
MOV 3EH,#05H
MOV 3BH,#01H
MOV 61H,#00H
ACALL BEEP_BL
INC 3CH
MOV A,3CH
;*********************************
SET1: CJNE A,#01H,SET2
MOV 62H,60H
MOV 39H,#00H
MOV A,#01H
LCALL WRITEIR
MOV R1,#40H
LCALL DISP_DATA_LOOP
LCALL KEY_DISP
LCALL KEY_LOOP
RET
;*********************************
SET2: CJNE A,#02H,SET3
MOV A,60H
ADD A,#8D
MOV 60H,A
MOV 62H,60H
MOV 39H,#00H
MOV A,#01H
LCALL WRITEIR
MOV R1,#48H
LCALL DISP_DATA_LOOP
LCALL KEY_DISP
RET
;************************************************
SET_DATA: MOV A,3BH
CJNE A,#01H,KEY_CHULI_EXIT
LCALL BEEP_BL
KEY2: MOV A,3AH
CJNE A,#11010000B,KEY3
LCALL KEY2_CHULI
RET
;*********************************
SET3: CJNE A,#03H,SET4
MOV A,60H
ADD A,#8D
MOV 60H,A
MOV 62H,60H
MOV 39H,#00H
MOV A,#01H
LCALL WRITEIR
MOV R1,#50H
LCALL DISP_DATA_LOOP
LCALL KEY_DISP
RET
;*********************************
SET4: CJNE A,#04H,KEY_CHULI_EXIT
MOV A,60H
ADD A,#8D
MOV 60H,A
MOV 62H,60H
MOV 39H,#00H
MOV A,#01H
LCALL WRITEIR
MOV R1,#58H
LCALL DISP_DATA_LOOP
LCALL KEY_DISP
RET
;************************************************
KEY_DISP:LCALL DISP
MOV A,#10000111B
LCALL WRITEIR
MOV A,#00001111B
LCALL WRITEIR
RET
;************************************************
KEY3: CJNE A,#10110000B,KEY4
LCALL KEY3_CHULI
RET
;************************************************
KEY4: CJNE A,#01110000B,KEY_CHULI_EXIT
LCALL KEY4_CHULI
KEY_CHULI_EXIT:RET
;************************************************
KEY_LOOP:LCALL KEY
MOV A,3CH
CJNE A,#05H,KEY_LOOP
MOV 39H,#01H
MOV 3CH,#00H
MOV 3EH,#01H
MOV 3BH,#00H
MOV 60H,#40H
MOV A,#00001100B
LCALL WRITEIR
MOV R1,#40H
LCALL DISP_DATA_LOOP
SETB TR1
RET
;************************************************
KEY2_CHULI:INC 61H
MOV A,61H
CJNE A,#5D,THEN1
MOV A,#00H
THEN1: MOV 61H,A
CJNE A,#00H,SET_BIT1
ADD A,60H
MOV 62H,A
MOV A,#10000111B
LCALL WRITEIR
RET
SET_BIT1:CJNE A,#01H,SET_BIT2
ADD A,60H
MOV 62H,A
MOV A,#10001110B
LCALL WRITEIR
RET
SET_BIT2:CJNE A,#02H,SET_BIT3
ADD A,60H
MOV 62H,A
MOV A,#11000011B
LCALL WRITEIR
RET
SET_BIT3:CJNE A,#03H,SET_BIT4
ADD A,60H
MOV 62H,A
MOV A,#11000110B
LCALL WRITEIR
RET
SET_BIT4:CJNE A,#04H,KEY2_CHULI_EXIT
ADD A,60H
MOV 62H,A
MOV A,#11001100B
LCALL WRITEIR
KEY2_CHULI_EXIT:RET
;************************************************
KEY3_CHULI:
MOV A,61H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CJNE A,#00H,SET_DATA1
MOV R1,62H
INC @R1
MOV A,@R1
CJNE A,#02H,SET_THEN0
MOV A,#00H
SET_THEN0: MOV @R1,A
MOV 63H,#10000111B
AJMP KEY3_CHULI_EXIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SET_DATA1: CJNE A,#01H,SET_DATA2
MOV R1,62H
INC @R1
MOV A,@R1
CJNE A,#02H,SET_THEN1
MOV A,#00H
SET_THEN1: MOV @R1,A
MOV 63H,#10001110B
AJMP KEY3_CHULI_EXIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SET_DATA2: CJNE A,#02H,SET_DATA3
MOV R1,62H
INC @R1
MOV A,@R1
CJNE A,#100D,SET_THEN2
MOV A,#00H
SET_THEN2: MOV @R1,A
MOV 63H,#11000011B
AJMP KEY3_CHULI_EXIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SET_DATA3: CJNE A,#03H,SET_DATA4
MOV R1,62H
INC @R1
MOV A,@R1
CJNE A,#60D,SET_THEN3
MOV A,#00H
SET_THEN3: MOV @R1,A
MOV 63H,#11000110B
AJMP KEY3_CHULI_EXIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SET_DATA4: CJNE A,#04H,KEY3_CHULI_EXIT
MOV R1,62H
INC @R1
MOV A,@R1
CJNE A,#02H,SET_THEN4
MOV A,#00H
SET_THEN4: MOV @R1,A
MOV 63H,#11001100B
MOV A,#05H
ADD A,60H
MOV R1,A
MOV @R1,#00H
MOV A,60H
;********************************************
MODE_1: CJNE A,#40H,MODE_2
MOV A,40H
CJNE A,#01H,MODE_1_THEN
CLR 00H
MOV C,00H
MOV P2.7,C
AJMP KEY3_CHULI_EXIT
MODE_1_THEN:SETB 00H
MOV C,00H
MOV P2.7,C
AJMP KEY3_CHULI_EXIT
;********************************************
MODE_2: CJNE A,#48H,MODE_3
MOV A,48H
CJNE A,#01H,MODE_2_THEN
CLR 01H
MOV C,01H
MOV P2.6,C
AJMP KEY3_CHULI_EXIT
MODE_2_THEN:SETB 01H
MOV C,01H
MOV P2.6,C
AJMP KEY3_CHULI_EXIT
;********************************************
MODE_3: CJNE A,#50H,MODE_4
MOV A,50H
CJNE A,#01H,MODE_3_THEN
CLR 02H
MOV C,02H
MOV P2.5,C
AJMP KEY3_CHULI_EXIT
MODE_3_THEN:SETB 02H
MOV C,02H
MOV P2.5,C
AJMP KEY3_CHULI_EXIT
;********************************************
MODE_4: CJNE A,#58H,KEY3_CHULI_EXIT
MOV A,58H
CJNE A,#01H,MODE_4_THEN
CLR 03H
MOV C,03H
MOV P2.4,C
AJMP KEY3_CHULI_EXIT
MODE_4_THEN:SETB 03H
MOV C,03H
MOV P2.4,C
AJMP KEY3_CHULI_EXIT
;********************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY3_CHULI_EXIT:MOV R1,60H
LCALL DISP_DATA_LOOP
LCALL DISP
MOV A,63H
LCALL WRITEIR
RET
;************************************************
KEY4_CHULI:
MOV A,61H
SET2_DATA0:CJNE A,#00H,SET2_DATA1
MOV 63H,#10000111B
AJMP KEY4_CHULI_EXIT
SET2_DATA1:CJNE A,#01H,SET2_DATA2
MOV 63H,#10001110B
AJMP KEY4_CHULI_EXIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SET2_DATA2: CJNE A,#02H,SET2_DATA3
MOV R1,62H
DEC @R1
MOV A,@R1
CJNE A,#0FFH,SET2_THEN2
MOV A,#99D
SET2_THEN2: MOV @R1,A
MOV 63H,#11000011B
AJMP KEY4_CHULI_EXIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SET2_DATA3: CJNE A,#03H,SET2_DATA4
MOV R1,62H
DEC @R1
MOV A,@R1
CJNE A,#0FFH,SET2_THEN3
MOV A,#59D
SET2_THEN3: MOV @R1,A
MOV 63H,#11000110B
AJMP KEY4_CHULI_EXIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SET2_DATA4:CJNE A,#04H,KEY4_CHULI_EXIT
MOV 63H,#11001100B
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY4_CHULI_EXIT:MOV R1,60H
LCALL DISP_DATA_LOOP
LCALL DISP
MOV A,63H
LCALL WRITEIR
RET
;********************************************
LCD_DISP:MOV A,#00H
MOVC A,@A+DPTR
JZ LCD_DISP_EXIT
LCALL WriteDDR
INC DPTR
AJMP LCD_DISP
LCD_DISP_EXIT:RET
; 检查忙碌子程序
CheckBusy:PUSH ACC
LOOP: CLR RS ;选择指令寄存器
SETB RW ;选择读模式
MOV D0_D7,#0FFH ;P0口写1,准备写入
SETB E ;使能LCD
MOV A,D0_D7 ;将LCD的D0-D7由P0口送A,以便查第7位BF是否为0
CLR E ;禁止LCD
LCALL CheckBusy_DELAY ;调延时子程序
POP ACC
RET
; 写入IR寄存器子程序
WriteIR:PUSH ACC
LCALL CheckBusy ;调检查忙子程序
CLR E ;禁止LCD
CLR RS ;选择指令寄存器
CLR RW ;选择写模式
SETB E ;使能LCD
MOV D0_D7,A ;将控制指令写入LCD
SETB E ;使能LCD
CLR E ;禁止LCD
POP ACC
RET
; 写入DR寄存器子程序
WriteDDR:PUSH ACC
LCALL CheckBusy ;调检查忙子程序
CLR E ;禁止LCD
SETB RS ;选择数据寄存器
CLR RW ;选择写模式
SETB E ;使能LCD
MOV D0_D7,A ;将数据写入LCD
SETB E ;使能LCD
CLR E ;禁止LCD
POP ACC
RET
;以下是2.5ms延时子程序
CheckBusy_DELAY:MOV R5,#5
D2: MOV R4,#248
D1: DJNZ R4,D1
DJNZ R5,D2
RET
DELAY:
MOV R6,#10
DE_LP:
MOV R5,#250
DJNZ R5,$
DJNZ R6,DE_LP
DJNZ R4,DELAY
RET
DATA0:DB" Make Of PP ",00H
DATA1:DB"Mode:",00H
DATA2:DB"Beep:",00H
DATA3:DB"Time Controller ",00H
DATA_ON:DB"ON ",00H
DATA_OFF:DB"OFF",00H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -