📄 main.asm
字号:
JNZ NEXT5
JMP FRIDAY
NEXT5:MOV A,32H
XRL A,#07H
JNZ NEXT6
JMP SATERDAY
NEXT6:JMP SUNDAY
;*********************
MONDAY:MOV DPTR,#MON
CALL WRSTR
ret
TUESDAY:MOV DPTR,#TUE
CALL WRSTR
ret
WEDNESDAY:MOV DPTR,#WED
CALL WRSTR
ret
THURSDAY:MOV DPTR,#THU
CALL WRSTR
ret
FRIDAY: MOV DPTR,#FRI
CALL WRSTR
ret
SATERDAY:MOV DPTR,#SAT
CALL WRSTR
ret
SUNDAY: MOV DPTR,#SUN
CALL WRSTR
ret
;++++++++++++++++++++++++++++++++++lcd tab1
MON:DB 'Mon'
DB 0
TUE:DB 'Tue'
DB 0
WED:DB 'Wed'
DB 0
THU:DB 'Thu'
DB 0
FRI:DB 'Fri'
DB 0
SAT:DB 'Sat'
DB 0
SUN:DB 'Sun'
DB 0
line1:db '20*/*/* #'
db 0
line2:db ' *:* %C'
db 0
work_str1:
db '(1) *:*--*:*'
db 0
work_str2:
db '(2) *:*--*:*'
db 0
;******************************************;按键响应子程序
START_:
MOV IE,#88H ;开TIMER1,记录按键时间
MOV TH1,#00
MOV TL1,#00
SETB TR1
CALL KEY_SCANF
MOV P1,#0C3H
GOON8:MOV A,P3 ;直到按键松开
JNB ACC.2,GOON8
CLR TR1
CLR EA
MOV A,LCD_STAT ;状态判断sp=50,
XRL A,#0
JZ RE_SET
MOV A,LCD_STAT
XRL A,#1
JZ SET_TIME
MOV A,LCD_STAT
XRL A,#2
JZ SET_WORK
RE_SET: ajmp GET_KEYDATA1 ;CPU处于显示当前时间状态
SET_TIME:ajmp GET_KEYDATA2 ;CPU处于修改当前时间状态
SET_WORK:ajmp GET_KEYDATA3 ;CPU处于修改任务执行时间状态
;**********************************
GET_KEYDATA1: ;显示当前时间准确状态,SP=50
MOV A,KEY_DATA ;键值判断
XRL A,#1
JZ KEY_MODE
MOV A,KEY_DATA
XRL A,#6 ;手动控制继电器开关
JNZ EXIT8
CPL P3.4
EXIT8:MOV IE,#83H ;设置中断,返回主循环LOP(SP=50)
SETB TR0
JMP LOP
KEY_MODE: ;SP=50,EA=1,EX0=0,ET0=0,ET1=1,TR0=0.TR1=0
MOV A,TIME1_CN ;按键模式判断
clr c
CJNE A,#5,goon9 ;timer_counter>5 to long_press
goon9:JC duan_press
jmp long_press
;******************************
duan_press: ;短按,修改任务执行时间,sp=50
;SP=50,EA=1,EX0=0,ET0=0,ET1=1,TR0=0.TR1=0
MOV LCD_STAT,#2 ;修改状态值
MOV A,#LCD_SETDDADDR ;lcd_ac=0
CALL WRCMD
MOV DPTR,#work_str1 ;写第一行数据到LCD_
MOV R1,#S1_HOUR_DATA
CALL WRSTR
MOV A,#LCD_SETDDADDR+64 ;换行
CALL WRCMD
MOV DPTR,#work_str2 ;写第二行数据到LCD
MOV R1,#S2_HOUR_DATA
CALL WRSTR
MOV A,#LCD_SETDDADDR+4 ;AC=02H
CALL WRCMD
JMP STAT1;GO-TO STAT1
;$$$$$$$$$$$$$$$$$$$$$$$$$
long_press:
MOV LCD_STAT,#1
MOV A,#LCD_SETDDADDR+2 ;光标AC=01H
CALL WRCMD
JMP STAT1
;############################################STAT1
STAT1:
mov A,#LCD_SETVISIBLE+5 ;显示BLACK
call wrcmd
MOV TIME1_CN,#0 ;清T1定时寄存器值
MOV IE,#89H ;重设中断,启动TIMER1
SETB TR1
TK:MOV A,TIME1_CN ;5S无键中断响应退出到主屏LOP
CLR C
CJNE A,#30,KT
KT:JC TK ;时间到,
GO_START:CLR TR1
MOV TIME0_CN,#1
MOV TIME1_CN,#0
MOV LCD_STAT,#0
MOV IE,#83H
SETB TR0
AJMP LOP
;************************************
GET_KEYDATA2:
clr ea
CLR TR1 ;SP=50,IE=09,TR0=0,TR1=0
MOV TIME1_CN,#0
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
jmp back2
;+++++++++++++++++++++++++++++++++++++++++
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
BACK2: MOV IE,#89H ;SP=50
SETB TR1
JMP STAT1
;+++++++++++++++++++++++++++++++++++++++++光标左移到指定位置子程序
MOVE_L:mov dptr,#LCD_BUSY_RD ;SP=52,IE=09,TR0=0,TR1=0
movx A,@dptr ;读LCD的AC值
JB ACC.7,MOVE_L ;忙则重新读一次
MOV AC_ADD,A ;保存AC值
XRL A,#02H ;LCD光标位置判断
JZ TO_45
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,#0DH
JZ TO_9
MOV A,AC_ADD
XRL A,#41H
JZ TO_13
MOV A,AC_ADD
XRL A,#42H
JZ TO_41
MOV A,AC_ADD
XRL A,#44H
JZ TO_42
MOV A,AC_ADD
XRL A,#45H
JZ TO_44
TO_45:
MOV A,#LCD_SETDDADDR+45H
CALL WRCMD
RET ;返回,BACK2
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_13:
MOV A,#LCD_SETDDADDR+13
CALL WRCMD
RET
TO_41:
MOV A,#LCD_SETDDADDR+41H
CALL WRCMD
RET
TO_42:
MOV A,#LCD_SETDDADDR+42H
CALL WRCMD
RET
TO_44:
MOV A,#LCD_SETDDADDR+44H
CALL WRCMD
RET
;MOVE TO RIGHT
MOVE_R:
mov dptr,#LCD_BUSY_RD
movx A,@dptr
JB ACC.7,MOVE_R
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_13
MOV A,AC_ADD
XRL A,#0DH
JZ TO_41
MOV A,AC_ADD
XRL A,#41H
JZ TO_42
MOV A,AC_ADD
XRL A,#42H
JZ TO_44
MOV A,AC_ADD
XRL A,#44H
JZ TO_45
MOV A,AC_ADD
XRL A,#45H
JZ TO_2
INC_:
mov dptr,#lcd_busy_rd ;;SP=52,IE=09,TR0=0,TR1=0
movx a,@dptr
jb acc.7,inc_
setb acc.7 ;保存当前光标位置值
mov AC_ADD,a
XRL A,#8DH ;判断光标是否指到显示星期位置
JZ CHANGE_WEEK
MOV DPTR,#LCD_DATA_RD ;读光标所在处显示值
MOVX A,@DPTR
mov AC_DATA,a
MOV A,AC_ADD
call wrcmd ;光标归位
mov a,AC_DATA
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 ;返回BACK2
CHANGE_WEEK: ;SP=52
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,#8dH
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,#41H
CALL GET_DATA
CLR C
CJNE A,#24H,HOUR_RIGHT
HOUR_RIGHT:JNC UESLESS_DATE
MOV @R1,A
INC R1
MOV R2,#44H
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -