📄 timing.asm
字号:
INC DPTR
MOVX A,@DPTR ;THE NEXT MINUTE IS IN R5
MOV R5,A
MOV A,R4
CJNE A,RHOUR,LL3
MOV A,R5
CJNE A,RMINUTE,LL3
MOV A,TMSG
INC A
CLR C
CLR AC
MOV TMSG,A
NOP
LJMP CKTAB
LL3: NOP
JC BIGGER
NOP
LJMP FOUND
BIGGER: MOV A,TMSG
INC A
CLR C
CLR AC
DA A
MOV TMSG,A
NOP
LJMP CKTAB
FOUND: CPL DOG
MOV A,TMSG ;获得当前时段
LCALL BCDBIN
MOV R4,A
LCALL JSSD ;计算时段条地址,R4为时段值
INC DPTR
MOVX A,@DPTR ;根据时段,查得当前方案
CJNE A,#55H,CHEKA
CLR ONOFF
CHEKA: CJNE A,#0AAH,CHEKB
SETB ONOFF
CHEKB: NOP
LJMP RDTIME
;TABL2 是时段方案表
TABL2: DB 01H,55H,06H,00H
DB 02H,0AAH,08H,30H
DB 03H,55H,10H,30H
DB 04H,0AAH,12H,30H
DB 05H,55H,14H,00H
DB 06H,0AAH,16H,00H
DB 07H,55H,18H,00H
DB 08H,0AAH,21H,30H
;时段序号,方案,小时,分钟
;
BINBCD: PUSH B ;二进制与BCD码转换子程序,以寄存器A为接口
MOV B,#64H
DIV AB
MOV A,B
MOV B,#0AH
DIV AB
SWAP A
ADD A,B
POP B
RET
BCDBIN: PUSH B ;BCD码与二进制转换子程序,以寄存器A为接口
XCH A,R5
PUSH ACC
MOV A,R5
SWAP A
ANL A,#0FH
MOV B,#0AH
MUL AB
XCH A,R5
ANL A,#0FH
ADD A,R5
MOV R5,A
POP B
POP ACC
XCH A,R5
RET
;
S_PORT: PUSH DPH
PUSH DPL
PUSH ACC
PUSH B
PUSH PSW
SETB RS1
SETB RS0
JBC TI,SPERR
LCALL SPIN
; JC SPERR
CJNE A,#55H,SPERR
LCALL SPIN
; JC SPERR
CJNE A,#0AAH,SPERR
LCALL SPIN
; JC SPERR
CJNE A,#0FFH,SPERR
LCALL SPIN
; JC SPERR
CJNE A,#LW_ADDR,SCRNOT2
SJMP SCRNOT1
SCRNOT2:CJNE A,#0FFH,SCRNOT3
SJMP SCRNOT1
SCRNOT3:MOV A,#LW_ADDR
CJNE A,#0FFH,SCRNOT4
SJMP SCRNOT1
SCRNOT4:LJMP EXITSP
SCRNOT1:
LCALL SPIN
; JC SPERR
CJNE A,#0FAH,REVSD
MOV DPTR,#SD_ADDR ;接收时段
MOV R0,#SD_NUM
REVLOP: LCALL SPIN
MOVX @DPTR,A
INC DPTR
CPL DOG
DJNZ R0,REVLOP
;
SPERR: LJMP EXITSP
REVSD: CJNE A,#0FBH,REVHS ;更改时间
LCALL SPIN
MOV B,A
LCALL SPIN
PUSH ACC
MOV DPTR,#000BH
MOV A,#0A2H
MOVX @DPTR,A
MOV DPTR,#0004H ;将小时值写入12887
MOV A,B
MOVX @DPTR,A
MOV RHOUR,A
MOV DPTR,#0002H ;将分钟值写入12887
POP ACC
MOVX @DPTR,A
MOV RMINUTE,A
MOV DPTR,#000BH
MOV A,#22H
MOVX @DPTR,A
LJMP EXITSP
REVHS: CJNE A,#0FCH,REVRET ;要求控制机回送时段表
MOV A,#55H
LCALL SENDBYTE
MOV A,#0AAH
LCALL SENDBYTE
MOV A,#0FFH
LCALL SENDBYTE
MOV A,#LW_ADDR
LCALL SENDBYTE
MOV A,#0FCH
LCALL SENDBYTE
MOV DPTR,#SD_ADDR ;回送时段
MOV R0,#SD_NUM
HSLOP: MOVX A,@DPTR
LCALL SENDBYTE
INC DPTR
CPL DOG
DJNZ R0,HSLOP
LJMP EXITSP
REVRET: CJNE A,#0FDH,EXITSP ;要求控制机重新启动显示屏电源,以便更改主板IP地址
MOV C,ONOFF
MOV ONOFF_FLG,C
SETB ONOFF
MOV R0,#30
WAITRST1: MOV R1,#10
WAITRST2: MOV R2,#180
WAITRST3: MOV R3,#255
WAITRST4: DJNZ R3,WAITRST4
CPL DOG
DJNZ R2,WAITRST3
DJNZ R1,WAITRST2
DJNZ R0,WAITRST1
MOV C,ONOFF_FLG
MOV ONOFF,C
LJMP EXITSP
;
EXITSP: NOP
POP PSW
POP B
POP ACC
POP DPL
POP DPH
RETI
;
SENDBYTE:;CLR ES
;MOV C,P
;MOV TB8,C
MOV SBUF,A
WAIT: JBC TI,OUTS
AJMP WAIT
OUTS: ;SETB ES
RET
;
SENDBYTE2:CLR TI
MOV C,P
MOV TB8,C
MOV SBUF,A
CLR RI
RET
;
SPIN: MOV R6,#80H
SPIN2: MOV R7,#0FFH
SPIN1: JB RI,SPIN0 ;WAITING RECEIVER
CLR C
DJNZ R7,SPIN1
DJNZ R6,SPIN2
SETB C
RET
SPIN0: MOV A,SBUF
CLR RI
RET
;
MOV C,RB8 ;ODD/EVEN TEST
JC SPINTS
ORL C,P
RET
SPINTS: ANL C,P
CPL C ;IF C=0,THEN EVEN,CORRECT
RET ; c=1, error
;*******************************************************
INCR0R1:CJNE R0,#0FFH,INCR11
MOV R0,#00H
INC R1
SJMP INCR12
INCR11: INC R0
INCR12: RET
;
;**********************************************
DECDPTR:PUSH PSW ;DPTR=DPTR-1
XCH A,DPL
ADD A,#0FFH
XCH A,DPL
XCH A,DPH
ADDC A,#0FFH
XCH A,DPH
POP PSW
RET
;**********************************************
;计算时段条地址,R4为时段值
JSSD: MOV DPTR,#SD_ADDR
MOV A,DPL
CLR C
SUBB A,#SD_LONG ;将SD_ADDR减4,是因为在下面的循环加法
MOV DPL,A ;中,SD_ADDR至少会加一次
MOV A,DPH
SUBB A,#0
MOV DPH,A
LL: MOV A,DPL
CLR C
ADD A,#SD_LONG
MOV DPL,A
CLR A
ADDC A,DPH
MOV DPH,A
DJNZ R4,LL ;DPTR存储时段条地址
RET
;**********************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -