📄 yjp_nxsx.asm
字号:
INC DPTR
MOVX A,@DPTR
LCALL SDA2_BCD_HEX ;分
MOV DPH,#01H
MOVX @DPTR,A
MOV DPH,#02H
INC DPTR
MOV A,#0
MOVX @DPTR,A
INC DPTR
MOVX A,@DPTR
ANL A,#7FH
LCALL SDA2_BCD_HEX ;秒
MOV DPH,#01H
MOVX @DPTR,A
RET
;;===================================================================
SDA2_HEXZH:
MOV R0,#MW00 ;MW00
MOV A,R0
MOV DPL,A
MOV DPH,#01H
INC DPTR
MOVX A,@DPTR
LCALL SDA2_HEX_BCD ;年
MOV DPH,#02H
MOVX @DPTR,A
MOV DPH,#01H
INC DPTR
INC DPTR
MOVX A,@DPTR
LCALL SDA2_HEX_BCD ;月
MOV DPH,#02H
MOVX @DPTR,A
MOV DPH,#01H
INC DPTR
INC DPTR
MOVX A,@DPTR
LCALL SDA2_HEX_BCD ;日
MOV DPH,#02H
MOVX @DPTR,A
MOV DPH,#01H
INC DPTR
INC DPTR
MOVX A,@DPTR
LCALL SDA2_HEX_BCD ;星期
MOV DPH,#02H
MOVX @DPTR,A
MOV DPH,#01H
INC DPTR
INC DPTR
MOVX A,@DPTR
LCALL SDA2_HEX_BCD ;时
MOV DPH,#02H
MOVX @DPTR,A
MOV DPH,#01H
INC DPTR
INC DPTR
MOVX A,@DPTR
LCALL SDA2_HEX_BCD ;分
MOV DPH,#02H
MOVX @DPTR,A
MOV DPH,#01H
INC DPTR
INC DPTR
MOVX A,@DPTR
LCALL SDA2_HEX_BCD ;秒
MOV DPH,#02H
MOVX @DPTR,A
RET
;;===================================================================
;名称:SDA2_HEX_BCD
;描述:单字节16进制数转化为单字节压缩BCD码
; 使用 A,B
;--------------------------------------------------------------------
SDA2_HEX_BCD:
MOV B,#10
DIV AB
SWAP A
ORL A,B
RET
;;===================================================================
;名称:SDA2_BCD_HEX
;描述:单字节16进制数转化为单字节压缩BCD码
; 使用 A,B,R4
;--------------------------------------------------------------------
SDA2_BCD_HEX:
MOV R4,A
ANL A,#0F0H
SWAP A
MOV B,#10
MUL AB
MOV B,A
MOV A,R4
ANL A,#0FH
ADD A,B
RET
;;===================================================================
RD_TIME:
LCALL SDA2_RCVDATA
LCALL SDA2_BCDZH
RET
;;===================================================================
SETUP_SDA2:
LCALL SDA2_START
MOV A,#62H
LCALL SDA2_SENTBYTEHL ;发送被控器总线地址
JB F0,SDA2_SETRETURN
MOV A,#0C0H
LCALL SDA2_SENTBYTELH
JB F0,SDA2_SETRETURN
LCALL SDA2_STOP
SDA2_SETRETURN:
RET
;;===================================================================
JDTIME: MOV A,#MW23
MOV DPL,A
MOV DPH,#01H
INC DPTR
MOVX A,@DPTR
MOV R0,A
LCALL PDSD_1
LCALL PDSD_2
LCALL PDSD_3
LCALL PDSD_4
RET
;;...................................................................
PDSD_1: MOV A,R0
JNB ACC.0,PDSD_1A
MOV R7,#0
LCALL PTIME1
MOV A,R7
JNZ PDSD_1B
PDSD_1A: MOV A,#MW60 ;时间未落在该时段或该时段不允许定时,清零对应位
MOV DPL,A
MOV DPH,#01H
MOV A,#0
MOVX @DPTR,A
INC DPTR
MOVX A,@DPTR
ANL A,#0FH
ANL A,#0EH
MOVX @DPTR,A
RET
PDSD_1B: MOV A,#MW60 ;已落在该时段,置位对应开关
MOV DPL,A
MOV DPH,#01H
MOV A,#0
MOVX @DPTR,A
INC DPTR
MOVX A,@DPTR
ANL A,#0FH
ORL A,#01H
MOVX @DPTR,A
RET
;;...................................................................
PDSD_2: MOV A,R0
JNB ACC.1,PDSD_2A
MOV R7,#0
LCALL PTIME2
MOV A,R7
JNZ PDSD_2B
PDSD_2A: MOV A,#MW60
MOV DPL,A
MOV DPH,#01H
MOV A,#0
MOVX @DPTR,A
INC DPTR
MOVX A,@DPTR
ANL A,#0FH
ANL A,#0DH
MOVX @DPTR,A
RET
PDSD_2B: MOV A,#MW60
MOV DPL,A
MOV DPH,#01H
MOV A,#0
MOVX @DPTR,A
INC DPTR
MOVX A,@DPTR
ANL A,#0FH
ORL A,#02H
MOVX @DPTR,A
RET
;;...................................................................
PDSD_3: MOV A,R0
JNB ACC.2,PDSD_3A
MOV R7,#0
LCALL PTIME3
MOV A,R7
JNZ PDSD_3B
PDSD_3A: MOV A,#MW60
MOV DPL,A
MOV DPH,#01H
MOV A,#0
MOVX @DPTR,A
INC DPTR
MOVX A,@DPTR
ANL A,#0FH
ANL A,#0BH
MOVX @DPTR,A
RET
PDSD_3B: MOV A,#MW60
MOV DPL,A
MOV DPH,#01H
MOV A,#0
MOVX @DPTR,A
INC DPTR
MOVX A,@DPTR
ANL A,#0FH
ORL A,#04H
MOVX @DPTR,A
RET
;;...................................................................
PDSD_4: MOV A,R0
JNB ACC.3,PDSD_4A
MOV R7,#0
LCALL PTIME4
MOV A,R7
JNZ PDSD_4B
PDSD_4A: MOV A,#MW60
MOV DPL,A
MOV DPH,#01H
MOV A,#0
MOVX @DPTR,A
INC DPTR
MOVX A,@DPTR
ANL A,#0FH
ANL A,#07H
MOVX @DPTR,A
RET
PDSD_4B: MOV A,#MW60
MOV DPL,A
MOV DPH,#01H
MOV A,#0
MOVX @DPTR,A
INC DPTR
MOVX A,@DPTR
ANL A,#0FH
ORL A,#08H
MOVX @DPTR,A
RET
;;...................................................................
PTIME1: MOV A,#MW07
MOV DPL,A
MOV DPH,#01H
INC DPTR
MOVX A,@DPTR
MOV R1,A ;定时开时
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R2,A ;定时开分
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R3,A ;定时关时
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R4,A ;定时关分
LCALL PTIME ;开始判断
RET
;;...................................................................
PTIME2: MOV A,#MW11
MOV DPL,A
MOV DPH,#01H
INC DPTR
MOVX A,@DPTR
MOV R1,A ;定时开时
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R2,A ;定时开分
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R3,A ;定时关时
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R4,A ;定时关分
LCALL PTIME ;开始判断
RET
;;...................................................................
PTIME3: MOV A,#MW15
MOV DPL,A
MOV DPH,#01H
INC DPTR
MOVX A,@DPTR
MOV R1,A ;定时开时
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R2,A ;定时开分
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R3,A ;定时关时
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R4,A ;定时关分
LCALL PTIME ;开始判断
RET
;;...................................................................
PTIME4: MOV A,#MW19
MOV DPL,A
MOV DPH,#01H
INC DPTR
MOVX A,@DPTR
MOV R1,A ;定时开时
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R2,A ;定时开分
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R3,A ;定时关时
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R4,A ;定时关分
LCALL PTIME ;开始判断
RET
;;...................................................................
;;
;;INPUT: T_HOUR_ON->R1 T_MINUTE_ON->R2
;; T_HOUR_OFF->R3 T_MINUTE_OFF->R4
;;OUTPUT: R7=1 TIME ON ::R7=0 TIME OFF
;;...................................................................
PTIME: MOV A,#MW04
MOV DPL,A
MOV DPH,#01H
INC DPTR
MOVX A,@DPTR
MOV R5,A ;;实时时间时
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R6,A ;;实时时间分
MOV A,R1
MOV B,A
MOV A,R5
CLR C
SUBB A,B
JC PTIMEEND
JZ PTIME_M
MOV A,R3
MOV B,A
MOV A,R5
CLR C
SUBB A,B
JC GTIMEON
JZ PTIMEMOFF
PTIMEEND: RET
PTIME_M:
MOV A,R2
MOV B,A
MOV A,R6
CLR C
SUBB A,B
JC PTIMEEND
JZ GTIMEON
MOV A,R3
MOV B,A
MOV A,R5
CLR C
SUBB A,B
JC GTIMEON
JZ PTIMEMOFF
RET
GTIMEON: MOV R7, #01
RET
PTIMEMOFF:
MOV A,R4
MOV B,A
MOV A,R6
CLR C
SUBB A,B
JC GTIMEON
RET
;;===================================================================
;CAT24C021 应用设计
;;===================================================================
;;以下为AT24C021 I2C存储芯片操作子程序
;;-------------------------------------------------------------------
;复位看门狗
RST_WDOG:
CLR A24C_SDA
DB 0,0,0,0
SETB A24C_SDA
RET
;;===================================================================
;名称:STR_24C021
;描述:启动I2C总线子程序-发送I2C起始条件
;--------------------------------------------------------------------
STR_24C021:
SETB A24C_SDA ;发送起始条件数据信号
DB 0,0,0,0,0
DB 0,0,0,0,0
SETB A24C_SCL ;发送起始条件的时钟信号
DB 0,0,0,0,0
DB 0,0,0,0,0 ;起始条件锁定时间大于4.7us
CLR A24C_SDA ;发送起始信号
DB 0,0,0,0,0 ;起始条件锁定时间大于4.7us
DB 0,0,0,0,0
CLR A24C_SCL ;钳住I2C总线,准备发送或接收数据
DB 0,0,0,0,0
RET
;;===================================================================
;名称:STOP_24C021
;描述:停止I2C总线子程序-发送I2C总线停止条件
;--------------------------------------------------------------------
STOP_24C021:
CLR A24C_SDA ;发送停止条件的数据信号
DB 0,0,0,0,0
DB 0,0,0,0,0
SETB A24C_SCL ;发送停止条件的时钟信号
DB 0,0,0,0,0 ;起始条件建立时间大于4.7us
DB 0,0,0,0,0
SETB A24C_SDA ;发送I2C总线停止信号
DB 0,0,0,0,0
DB 0,0,0,0,0
RET
;;===================================================================
RD24C021:
MOV R3,#2
ACALL STR_24C021 ;I2C 总线开始信号
MOV A,#0A0H ;被控器CAT24WC02 I2C 总线地址(写模式
ACALL WBYTE_24C021 ;发送被控器地址
JC ReadFail
MOV A,R0 ;取单元地址
ACALL WBYTE_24C021 ;发送单元地址
JC ReadFail
ACALL STR_24C021 ;I2C 总线开始信号
MOV A,#0A1H ;被控器CAT24WC02 I2C 总线地址读模式
ACALL WBYTE_24C021 ;发送被控器地址
JC ReadFail
CLR F0
MOV A,R0
MOV DPL,A
MOV DPH,#01H
DJNZ R3,RD24C021_NEXT ;重复操作
SJMP RD24C021_LAST
RD24C021_NEXT:
ACALL RDBYTE_24C021 ;接收数据
MOVX @DPTR,A
INC DPTR
DJNZ R3,RD24C021_NEXT ;重复操作
;;===================================================================
RD24C021_LAST:
SETB F0 ;不发送应答位
ACALL RDBYTE_24C021
MOVX @DPTR,A
ACALL STOP_24C021 ;I2C 总线停止信号
RET
ReadFail:
ACALL STOP_24C021
RET
;;===================================================================
WR24C021:
MOV R3,#2
ACALL STR_24C021 ;I2C 总线开始信号
MOV A,#0A0H ;被控器CAT24WC02 I2C 总线地址写模式
ACALL WBYTE_24C021 ;发送被控器地址
JC WriteFail
MOV A,R0 ;取单元地址
ACALL WBYTE_24C021 ;发送单元地址
JC WriteFail
MOV A,R0
MOV DPL,A
MOV DPH,#01H
WR24C021_NEXT:
MOVX A,@DPTR ;取所发送数据的地址
ACALL WBYTE_24C021 ;发送数据
JC WriteFail
INC DPTR ;取下一个数据
DJNZ R3,WR24C021_NEXT ;重复操作
ACALL STOP_24C021 ;I2C 总线停止信号
RET
WriteFail:
ACALL STOP_24C021
RET
;;===================================================================
DELAY_10MS: ;延时10ms
MOV R7,#60H
DELAY2: MOV R6,#34H
DJNZ R6,$
DJNZ R7,DELAY2
RET
;;===================================================================
WBYTE_24C021: ;写操作
MOV R7,#08H
WBY0:
RLC A
JC WBY_ONE
CLR A24C_SDA
SJMP WBY_ZERO
WBY_ONE: ;发送数据位"1"
SETB A24C_SDA
DB 0,0
WBY_ZERO: ;发送数据位"0"
DB 0,0
SETB A24C_SCL
DB 0,0,0,0
DB 0,0,0,0
CLR A24C_SCL
DJNZ R7,WBY0
MOV R6,#5 ;等待应答信号
WaitLoop:
SETB A24C_SDA
DB 0,0,0,0
SETB A24C_SCL
DB 0,0,0,0,0,0
JB A24C_SDA,NOACK
CLR C ;HAVE ACK
CLR A24C_SCL
RET
NoAck: DJNZ R6,WaitLoop
SETB C ;NO ACK
CLR A24C_SCL
RET
;;===================================================================
RDBYTE_24C021: ;读操作
SETB A24C_SDA
MOV R7,#08H ;字节为8 位
RD24C021_CY1: ;读数据位
DB 0,0
CLR A24C_SCL ;准备读
DB 0,0,0,0
DB 0,0,0,0
SETB A24C_SCL ;读数据
DB 0,0,0,0
CLR C
JNB A24C_SDA,RD24C021_ZERO ;读数据位"0"
SETB C ;读数据位"1"
;;===================================================================
RD24C021_ZERO:
RLC A
DB 0,0,0,0
DJNZ R7,RD24C021_CY1 ;重复操作
CLR A24C_SCL
DB 0,0,0,0,0,0
CLR A24C_SDA
JNB F0,RD_ACK
SETB A24C_SDA ;无应答
RD_ACK: ;发送应答信号
DB 0,0,0,0
SETB A24C_SCL
DB 0,0,0,0,0,0
CLR A24C_SCL
DB 0,0,0,0
CLR F0
CLR A24C_SDA
RET
;;===================================================================
SAVE_TIKEYEND:RET
SAVE_TIKEY:MOV A,#MW25
MOV DPL,A
MOV DPH,#01H
INC DPTR
MOVX A,@DPTR
MOV B,A
MOV A,#MW23
MOV DPL,A
MOV DPH,#01H
INC DPTR
MOVX A,@DPTR
XRL A,B
JZ SAVE_TIKEYEND
MOV A,B
MOVX @DPTR,A
MOV R0,#MW23
LCALL WR24C021
RET
;;===================================================================
RD_SET_DATA:
MOV R1,#16
MOV R0,#MW07
RD_SET1: LCALL RD24C021
INC R0
INC R0
DJNZ R1,RD_SET1
LCALL CK_DATA2 ;;校验时段数据
MOV R0,#MW23 ;;读时段允许开关位内容
LCALL RD24C021
MOV A,#MW23
MOV DPL,A
MOV DPH,#01H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -