📄 main.asm
字号:
work_str1:
db ' (1) *:*---*:* '
db 0
work_str2:
db ' (2) *:*---*:* '
db 0
;*****************************
START_:
MOV A,LCD_STAT
XRL A,#0
JZ RE_SET
XRL A,#1
JZ SET_TIME
XRL A,#3
JZ SET_WORK
RE_SET: CALL GET_KEYDATA1 ;CPU处于显示当前时间状态
JMP BACK
SET_TIME:CALL GET_KEYDATA2 ;CPU处于修改当前时间状态
JMP BACK2
SET_WORK:CALL GET_KEYDATA3 ;CPU处于修改任务执行时间状态
JMP BACK2
BACK: POP ACC
POP ACC
SETB TR0
SETB ET0
SETB EA
AJMP LOP
BACK2:MOV TIME_COUNTER,#0
MOV TH1,#9EH
MOV TL1,#58H
POP ACC
POP ACC
SETB ET1
CLR ET0
SETB EA
SETB TR1
AJMP STAT1
;**********************************
GET_KEYDATA1:
CALL KEY_SCANF
MOV P1,#0C3H
MOV A,KEY_DATA
XRL A,#1
JZ SET_TIME1
MOV A,KEY_DATA
XRL A,#6
JZ CPLP3_4
OTHER_KEY:
MOV A,P3
JNB ACC.2,OTHER_KEY
cpl p2.7
jmp back
CPLP3_4:NOP
RE_RDP3:MOV A,P3
JNB ACC.2,RE_RDP3
CPL P3.4
jmp back
SET_TIME1:
MOV TH1,#9EH
MOV TL1,#58H
CLR EX0
SETB ET1
SETB EA
SETB TR1 ;初始化T1定时器
GET_TIME:
MOV A,P3
JNB ACC.2,GET_TIME
MOV A,TIME_COUNTER
CJNE A,#4,PANDUAN
PANDUAN:JC DUAN_PRESS
LONG_PRESS:CLR TR1
MOV LCD_STAT,#1
MOV A,#LCD_SETDDADDR+2
CALL WRCMD
mov A,#LCD_SETVISIBLE+5
call wrcmd
MOV TIME_COUNTER,#0
POP ACC
POP ACC
SETB TR1
SETB EX0
SETB EA
STAT1:
MOV A,TIME_COUNTER
CJNE A,#20,KT
KT:JC STAT1
GO_START:CLR TR1
MOV TIME0_CN,#1
MOV TIME_COUNTER,#0
MOV A,LCD_STAT
XRL A,#2
JNZ TJMP
MOV A,#LCD_SETVISIBLE
CALL WRCMD
TJMP:MOV LCD_STAT,#0
SETB TR0
SETB ET0
SETB EA
AJMP LOP
DUAN_PRESS:
CLR TR1
MOV TIME_COUNTER,#0
MOV LCD_STAT,#2
mov A,#LCD_SETVISIBLE
call wrcmd
MOV A,#LCD_SETDDADDR
CALL WRCMD
MOV DPTR,#work_str1
MOV R1,#S1_HOUR_DATA
CALL WRSTR
MOV A,#LCD_SETDDADDR+64
CALL WRCMD
MOV DPTR,#work_str2
MOV R1,#S2_HOUR_DATA
CALL WRSTR
mov A,#LCD_SETVISIBLE+5
call wrcmd
MOV A,#LCD_SETDDADDR+5
CALL WRCMD
MOV TIME_COUNTER,#0
POP ACC
POP ACC
SETB TR1
SETB EX0
SETB EA
JMP STAT1
;************************************
GET_KEYDATA2:
CLR TR1
MOV TIME_COUNTER,#0
CALL KEY_SCANF
MOV P1,#0C3H
KPP:MOV A,P3
JNB ACC.2,KPP
MOV A,KEY_DATA
XRL A,#2
JZ MOVE_LIFT
MOV A,KEY_DATA
XRL A,#3
JZ MOVE_RIGHT
MOV A,KEY_DATA
XRL A,#4
JZ INC_1
MOV A,KEY_DATA
XRL A,#5
JZ DEC_1
MOV A,KEY_DATA
XRL A,#6
JZ ENTER
RET
;+++++++++++++++++++++++++++++++++++++++++
MOVE_LIFT: CALL MOVE_L
JMP BACK2
MOVE_RIGHT:CALL MOVE_R
JMP BACK2
INC_1: CALL INC_
JMP BACK2
DEC_1: CALL DEC_
JMP BACK2
ENTER: CALL IS_OK
JMP BACK2
;+++++++++++++++++++++++++++++++++++++++++光标左移到指定位置子程序
MOVE_L: mov dptr,#LCD_BUSY_RD
movx A,@dptr
CLR ACC.7
MOV AC_ADD,A
XRL A,#02H
JZ TO_46
MOV A,AC_ADD
XRL A,#03H
JZ TO_2
MOV A,AC_ADD
XRL A,#05H
JZ TO_3
MOV A,AC_ADD
XRL A,#06H
JZ TO_5
MOV A,AC_ADD
XRL A,#08H
JZ TO_6
MOV A,AC_ADD
XRL A,#09H
JZ TO_8
MOV A,AC_ADD
XRL A,#0bH
JZ TO_9
MOV A,AC_ADD
XRL A,#42H
JZ TO_11
MOV A,AC_ADD
XRL A,#43H
JZ TO_42
MOV A,AC_ADD
XRL A,#45H
JZ TO_43
MOV A,AC_ADD
XRL A,#46H
JZ TO_45
TO_46:
MOV A,#LCD_SETDDADDR+46H
CALL WRCMD
RET
TO_2:
MOV A,#LCD_SETDDADDR+2
CALL WRCMD
RET
TO_3:
MOV A,#LCD_SETDDADDR+3
CALL WRCMD
RET
TO_5:
MOV A,#LCD_SETDDADDR+5
CALL WRCMD
RET
TO_6:
MOV A,#LCD_SETDDADDR+6
CALL WRCMD
RET
TO_8:
MOV A,#LCD_SETDDADDR+8
CALL WRCMD
RET
TO_9:
MOV A,#LCD_SETDDADDR+9
CALL WRCMD
RET
TO_11:
MOV A,#LCD_SETDDADDR+11
CALL WRCMD
RET
TO_42:
MOV A,#LCD_SETDDADDR+42H
CALL WRCMD
RET
TO_43:
MOV A,#LCD_SETDDADDR+43H
CALL WRCMD
RET
TO_45:
MOV A,#LCD_SETDDADDR+45H
CALL WRCMD
RET
;MOVE TO RIGHT // 右移
MOVE_R:
mov dptr,#LCD_BUSY_RD
movx A,@dptr
CLR ACC.7
MOV AC_ADD,A
XRL A,#02H
JZ TO_3
MOV A,AC_ADD
XRL A,#03H
JZ TO_5
MOV A,AC_ADD
XRL A,#05H
JZ TO_6
MOV A,AC_ADD
XRL A,#06H
JZ TO_8
MOV A,AC_ADD
XRL A,#08H
JZ TO_9
MOV A,AC_ADD
XRL A,#09H
JZ TO_11
MOV A,AC_ADD
XRL A,#0BH
JZ TO_42
MOV A,AC_ADD
XRL A,#42H
JZ TO_43
MOV A,AC_ADD
XRL A,#43H
JZ TO_45
MOV A,AC_ADD
XRL A,#45H
JZ TO_46
MOV A,AC_ADD
XRL A,#46H
JZ TO_2
RET
INC_:
mov dptr,#lcd_busy_rd
movx a,@dptr
clr acc.7
add a,#80h
mov ac_adD,a
XRL A,#8BH
JZ CHANGE_WEEK
MOV DPTR,#LCD_DATA_RD
MOVX A,@DPTR
mov 45h,a
mov a,ac_adD
call wrcmd
mov a,45h
CLR C
SUBB A,#48
MOV DPTR,#NO_STR1
MOVC A,@A+DPTR
ADD A,#48
MOV DPTR,#LCD_DATA_WR
MOVX @DPTR,A
mov a,ac_adD
call wrcmd
RET
CHANGE_WEEK:
MOV A,WEEK
XRL A,#07H
JNZ JMPK
MOV WEEK,#00H
JMPK: MOV A,WEEK
INC A
MOV WEEK,A
MOV A,#LCD_SETVISIBLE+4
CALL WRCMD
CALL WEEK0
MOV A,AC_ADD
CALL WRCMD
MOV A,#LCD_SETVISIBLE+5
CALL WRCMD
RET
DEC_:
mov dptr,#lcd_busy_rd
movx a,@dptr
clr acc.7
add a,#80h
mov ac_adD,a
XRL A,#8BH
JZ CHANGE_WEEK
MOV DPTR,#LCD_DATA_RD
MOVX A,@DPTR
mov 45h,a
mov a,ac_adD
call wrcmd
mov a,45h
CLR C
SUBB A,#48
MOV DPTR,#NO_STR2
MOVC A,@A+DPTR
ADD A,#48
MOV DPTR,#LCD_DATA_WR
MOVX @DPTR,A
mov a,ac_adD
call wrcmd
RET
NO_STR1:
DB 1, 2 ,3 ,4 ,5, 6 ,7 ,8 ,9 ,0
NO_STR2:
DB 9 ,0 ,1 ,2 ,3 ,4 ,5 ,6, 7, 8
IS_OK:
POP ACC
POP ACC
MOV A,#LCD_SETDDADDR
CALL WRCMD
MOV A,#LCD_SETVISIBLE+4
CALL WRCMD
CALL READ_LCD_DATA
CALL WR_DATA_DS1302
POP ACC
POP ACC
JMP GO_START
READ_LCD_DATA:
MOV R1,#YEAR
MOV R2,#2
CALL GET_DATA
MOV @R1,A
INC R1
MOV R2,#5
CALL GET_DATA
CLR C
CJNE A,#13H,MONTH_RIGHT
MONTH_RIGHT:JNC UESLESS_DATE
MOV @R1,A
INC R1
MOV R2,#8
CALL GET_DATA
CLR C
CJNE A,#32H,DATE_RIGHT
DATE_RIGHT:JNC UESLESS_DATE
MOV @R1,A
INC R1
MOV R2,#66
CALL GET_DATA
CLR C
CJNE A,#24H,HOUR_RIGHT
HOUR_RIGHT:JNC UESLESS_DATE
MOV @R1,A
INC R1
MOV R2,#69
CALL GET_DATA
CLR C
CJNE A,#60H,MINU_RIGHT
MINU_RIGHT:JNC UESLESS_DATE
MOV @R1,A
RET
UESLESS_DATE:
POP ACC
POP ACC
CLR UESLESS_BIT
JMP UESLESS_DISPLAY
WR_DATA_DS1302:
MOV R5,#8CH
MOV R1,#YEAR
CALL WR_DATA_DS
MOV R5,#8AH
MOV R1,#WEEK
CALL WR_DATA_DS
MOV R5,#88H
MOV R1,#MONTH
CALL WR_DATA_DS
MOV R5,#86H
MOV R1,#DATE
CALL WR_DATA_DS
MOV R5,#84H
MOV R1,#HOUR
CALL WR_DATA_DS
MOV R5,#82H
MOV R1,#MINU
CALL WR_DATA_DS
CLR RST
RET
WR_DATA_DS:
CLR RST
CLR SCLK
SETB RST
MOV A,R5
MOV R2,#8
WR_D:CLR SCLK
RRC A
MOV IO_DATA,C
NOP
SETB SCLK
DJNZ R2,WR_D
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -