movf R_MINUTE,W
btfss STATUS,Z ;零分?
goto ThrSav
call SenceAndCPA ;CPA:Clock Precision Adjustment
movf R_HOUR,W
btfss STATUS,Z ;零点?
goto ThrSav
clrf PSDErrCounter
bcf fTimeUPDLocked ;解除闭锁
;----------------------------------------------------------------------------代码开始
ThrSav:
; bcf _PAGE1
nop
; goto CLRRecRegion
; nop
; bsf _PAGE1
; sublw .1 ;到每月1日
; btfss STATUS,Z
; goto Freeze_Out
bcf _PAGE1;-------------------------------
I2C_READ_SUB 0x01,BFIIC,AT_MonthPointer,0
bsf _PAGE1;-------------------------------
nop
bcf _C
rlf BFIIC,W
addlw 0x06
movwf ADDRESS
swapf ADDRESS,F
movlw 0x10
subwf ADDRESS,W
movwf SubAddress
bcf _PAGE1;-------------------------------
I2C_READ_SUB 0x05,BFIIC,AT_NMTime,0
bsf _PAGE1;-------------------------------
movfw (BFIIC+4)
subwf R_Month,W
btfsc STATUS,Z ;如果新月月等于旧月
goto Freeze_Out ;当天数据已完成冻结
btfss STATUS,C ;如果C=1当前月份大于上次存储的月份
goto NewYear
goto OriginalYear
; bsf _PAGE1
; 将本月电量的小数部分写入到该电量的小数位置
; ***********************************************************************************************
NewYear:
movfw R_Month
movwf NewMonth
movlw .12
addwf NewMonth,F
goto SaveStr
; ***********************************************************************************************
OriginalYear:
movfw R_Month
movwf NewMonth
movfw NewMonth
goto SaveStr
SaveStr:
movfw (BFIIC+4);旧月数据装载
subwf NewMonth,W ; 新月减去老月
movwf TEMP ;新旧月份的差额
movlw .3
subwf TEMP,W
btfsc STATUS,C ;如果C等于零说明新月减去老月大于3执行ThrSave
goto ThrSave
movlw .2
subwf TEMP,W ;2-月份差如果等于零说明新月大于老月两个月
movwf TEMP ;新旧月份的差额
btfsc STATUS,C ;如果C等于零说明新月减去老月大于2
goto TwoSave
movlw .1
subwf TEMP,W ;1-月份差如果等于零说明新月大于老月两个月
movwf TEMP ;新旧月份的差额
btfsc STATUS,C ;如果C等于零说明新月减去老月大于1
goto OneSave
; ***********************************************************************************************
OneSave:;上次转存和本次相差一个月的电量存储(本月数据保存)
movfw R_Month
movwf (BFIIC+8);月写入
movfw R_YEAR
movwf (BFIIC+9);年写入
call SaveDate
bcf _PAGE1;
goto Freeze_Out;
; ***********************************************************************************************
TwoSave: ;上次转存和本次相差两个月的电量存储
movlw .1
subwf R_Month,W
btfsc STATUS,Z;当前月份减去一如果结果等于零(Z=1)说明但前月份是一月,指令运行到MonthOne20
goto MonthTwo20 ;否则运行指令运行到MMonthTwo20
goto MonthOne20
MonthOne20: ;去年12月数据填充
movlw .12
movwf (BFIIC+8);月写入
decf R_YEAR,W
movwf (BFIIC+9);年写入
MonthOne21:
movlw .1 ;今年一月份数据填充
movwf (BFIIC+8);月写入
movfw R_YEAR
movwf (BFIIC+9);年写入
goto Freeze_Out;
MonthTwo20: ;当前月份减去一数据填充
movlw .1
subwf R_Month,W
movwf (BFIIC+8);月写入
movfw R_YEAR
movwf (BFIIC+9);年写入
call SaveDate;
MonthTwo21: ;当前月份数据填充
movfw R_Month
movwf (BFIIC+8);月写入
movlw R_YEAR
movwf (BFIIC+9);年写入
call SaveDate;
goto Freeze_Out;上次转存和本次相差两个月的电量存储代码结束
; ***********************************************************************************************
ThrSave: ;上次转存和本次相差三个月的电量存储
movlw .1
subwf R_Month,W
btfss STATUS,Z;当前月份减去一如果结果等于零(Z=1)说明但前月份是一月,指令运行到MonthOne30
goto MonthTwo30 ;否则运行指令运行到MonthTwo30在MonthTwo30再作月份判断
goto MonthOne30
MonthOne30:
movlw .11
movwf (BFIIC+8);月写入
decf R_YEAR,W
movwf (BFIIC+9);年写入
movwf ADDRESS
call SaveDate
MonthOne31:
movlw .12
movwf (BFIIC+8);月写入
decf R_YEAR,W
movwf (BFIIC+9);年写入
call SaveDate
MonthOne32:
movlw .1
movwf (BFIIC+8);月写入
movfw R_YEAR
movwf (BFIIC+9);年写入
call SaveDate
goto Freeze_Out;
MonthTwo30:
movlw .2
subwf R_Month,W
btfss STATUS,Z;当前月份减去二如果结果等于零(Z=1)说明但前月份是二月,指令跳过一行运行,开始填充二月份的相关数据
goto MonthTre30;否则运行指令运行到MonthTwo30
movfw .12 ;去年12月数据填充
movwf (BFIIC+8);月写入
decf R_YEAR,W
movwf (BFIIC+9);年写入
call SaveDate
MonthTwo31:
movfw .1 ;今天一月数据填充
movwf (BFIIC+8);月写入
movfw R_YEAR
movwf (BFIIC+9);年写入
call SaveDate
MonthTwo32:
movfw .2 ;本月数据填充
movwf (BFIIC+8);月写入
movfw R_YEAR
movwf (BFIIC+9);年写入
call SaveDate
goto Freeze_Out;
MonthTre30:;当前月份减去二写入存储缓冲区
movlw .2
subwf R_Month,W
movwf (BFIIC+8);月写入
movfw R_YEAR
movwf (BFIIC+9);年写入
call SaveDate
MonthTre31:;当前月份减去一写入存储缓冲区
movlw .1
subwf R_Month,W
movwf (BFIIC+8);月写入
movfw R_YEAR
movwf (BFIIC+9);年写入
bsf _PAGE1;
call SaveDate
bcf _PAGE1;
MonthTre32:;当前月份写入存储缓冲区
movfw R_Month
movwf (BFIIC+8);月写入
movfw R_YEAR
movwf (BFIIC+9);年写入
bsf _PAGE1;
call SaveDate
bcf _PAGE1;
nop
bsf _PAGE1;
goto Freeze_Out;
SaveDate:
bcf _PAGE1
I2C_READ_SUB 0x01,BFIIC,AT_MonthPointer,0
bcf _C
rlf BFIIC,W
addlw 0x06
movwf ADDRESS
swapf ADDRESS,F
nop
movlw 0x10
subwf ADDRESS,W
movwf SubAddress
movlw .0
movwf (BFIIC+5)
movwf (BFIIC+6)
movlw .1
movwf (BFIIC+7);日写入1日
movlw .5
movwf BYTES
movlw (BFIIC+5)
movwf SourcePointer
call W24WC64
nop
movlw AT_Total
movwf SubAddress
clrf SubAdd_H
movlw .1
movwf BYTES
movlw T_DEC
movwf SourcePointer
call W24WC64
movlw AT_Day
movwf SubAddress
movlw O_DEC
movwf SourcePointer
call W24WC64
movlw AT_Low
movwf SubAddress
movlw L_DEC
movwf SourcePointer
call W24WC64
I2C_READ_SUB 0x0C,(BFIIC+3),AT_Total,0 ;读出当前总电量;写入电量转存区
movf ADDRESS,W
movwf SubAddress
clrf SubAdd_H
movlw .12
movwf BYTES
movlw (BFIIC+3)
movwf SourcePointer
call W24WC64
nop
incf BFIIC,F
movlw .3
subwf BFIIC,W ; BFIIC-3->W
btfsc STATUS,C
clrf BFIIC ; C=1:结果为正
bcf _PAGE1;
I2C_WR_SUB 0x01,BFIIC,AT_MonthPointer,0;返写月电量存储区指针
nop
return
Rsp:
;读出月电量存储区指针
bcf _C
rlf BFIIC,W
addlw 0x06
movwf ADDRESS
swapf ADDRESS,F
return
Wsp:
I2C_WR_SUB 0x01,BFIIC,AT_MonthPointer,0
return
Write_AccFlag:
bcf _PAGE1;-------------------------------
I2C_WR_SUB 0x01, BFIIC, AT_Accounted,0
bsf _PAGE1;-------------------------------
Freeze_Out:
bsf WP
return
