📄 suidao light.asm
字号:
INC DPTR
CPL DOG
DJNZ R0,ZZZ
MOV A,R0_NUM
MOV R0,A
LCALL FLAT
POP DPH
POP DPL
RET
SENDNUM: ;NOP ;确定6B595 NOP 或HC595 CPL A
MOV SEND_NUM,A
MOV A,R6
MOV JISHU_NUM,A
MOV A,SEND_NUM
CPL DOG
CPL A
CLR XTXD
MOV R6,#08
DISPLP :RLC A ;RRC A ;确定先移高位或低位
MOV XDAT,C
SETB XTXD
NOP
CLR XTXD
DJNZ R6,DISPLP
MOV A,JISHU_NUM
MOV R6,A
RET
FLAT: CLR XLAT
NOP
NOP
NOP
NOP
NOP
NOP
SETB XLAT
NOP
NOP
NOP
NOP
NOP
NOP
CLR XLAT
RET
TABL1:DB 0FFH ;1-72路初始亮灯方案 ,灯亮,调光方案未给出
DB 0FFH
DB 0FFH
DB 0FFH
DB 0FFH
DB 0FFH
DB 0FFH
DB 0FFH
DB 0FFH
;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,SCRNOT4;SCRNOT3
SJMP SCRNOT1
;SCRNOT3:MOV A,#LW_ADDR
; CJNE A,#0FFH,SCRNOT4 ;FFH为广播机地址
; 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
NOP
NOP
NOP
MOV A,#55H ;接收完成后回送时段表
LCALL SENDBYTE
MOV A,#0AAH
LCALL SENDBYTE
MOV A,#0FFH
LCALL SENDBYTE
MOV A,#LW_ADDR
LCALL SENDBYTE
MOV A,#0FAH
LCALL SENDBYTE
MOV DPTR,#SD_ADDR ;回送时段
MOV R0,#SD_NUM
HSLOPP: MOVX A,@DPTR
LCALL SENDBYTE
INC DPTR
CPL DOG
DJNZ R0,HSLOPP
;
SPERR: LJMP EXITSP
REVSD: CJNE A,#0FBH,REVHS ;更改时间
LCALL SPIN
MOV B,A
LCALL SPIN
PUSH ACC
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,#0000H ;将分钟值写入12887
POP ACC
MOVX @DPTR,A
MOV DPTR,#0002H
POP ACC
MOVX @DPTR,A
MOV RMINUTE,A
MOV DPTR,#000BH
MOV A,#22H
MOVX @DPTR,A
CPL DOG
MOV A,#55H ;回送修改时间以确认修改正确
LCALL SENDBYTE
MOV A,#0AAH
LCALL SENDBYTE
MOV A,#0FFH
LCALL SENDBYTE
MOV A,#LW_ADDR
LCALL SENDBYTE
MOV A,#0FBH
LCALL SENDBYTE
MOV DPTR,#0004H ;将小时值写入12887
;MOV A,B
MOVX A,@DPTR
LCALL SENDBYTE
MOV DPTR,#0002H ;将分钟值写入12887
MOVX A,@DPTR
LCALL SENDBYTE
MOV DPTR,#0000H ;将分钟值写入12887
MOVX A,@DPTR
LCALL SENDBYTE
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,REVGX ;
MOV DPTR,#XS_ADDR ;接收显示方案
MOV R0,#XS_NUM
REVLOPPP: LCALL SPIN
MOVX @DPTR,A
INC DPTR
CPL DOG
DJNZ R0,REVLOPPP
MOV DPTR,#XS_ADDR ;回送显示方案
MOV R0,#XS_NUM
HSLOPPPP: MOVX A,@DPTR
LCALL SENDBYTE
INC DPTR
CPL DOG
DJNZ R0,HSLOPPPP
LJMP EXITSP
REVGX: CJNE A,#0FEH,EXITSP ;要求回送显示方案
MOV A,#55H
LCALL SENDBYTE
MOV A,#0AAH
LCALL SENDBYTE
MOV A,#0FFH
LCALL SENDBYTE
MOV A,#LW_ADDR
LCALL SENDBYTE
MOV A,#0FEH
LCALL SENDBYTE
MOV DPTR,#XS_ADDR ;回送时段
MOV R0,#XS_NUM
HSLOPPP:MOVX A,@DPTR
LCALL SENDBYTE
INC DPTR
CPL DOG
DJNZ R0,HSLOPPP
;MOV A,TMSG ;判断当前为亮灯还是调光状态
;MOV R4,A
;LCALL JSSD
;INC DPTR
;MOVX A,@DPTR
;CJNE A,#55H,LAB
;MOV A,#00H
;LCALL SENDBYTE
;LJMP EXITSP
;LAB: MOV A,#0FFH
;LCALL SENDBYTE
;
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 + -