📄 ss84b0337a.s
字号:
B_DATASAVE=1 ;如果没掉电,写一次时间
;----------------------写入校表数据------------------------------------------------------------------
CALLT [TAddr_Delay1]
CALLT [TAddr_Delay1]
B_CheckAdjData=0
CALL !RdWt_AdjData
SPIDATAH=#0
SPIDATAM=#0
SPIDATAL=#1
SPICMD=#0AAH
CALL !WriteSPI
;----------------------计算断相阀值------------------------------------------------------------------
AX=#BREAKVALUE
WordAddress=AX
I2CRdWtCounter=#3
DE=#I2CRT_Buffer
CALLT [TAddr_RdDataWithBkUp]
if_bit(!B_CHECKSUMB)
A=TEMP_BUF00
CALLT [TAddr_BCD_HEX_SUB]
CALL !CALC_BREAKXUVALUE
A=TEMP_BUF02
CALLT [TAddr_BCD_HEX_SUB]
X=A
A=#0
BC=#100
CALLT [TAddr_Multiply]
CURRENTVALUE=AX
A=TEMP_BUF01
CALLT [TAddr_BCD_HEX_SUB]
ADD A,CURRENTVALUE_L
CURRENTVALUE_L=A
ADDC CURRENTVALUE_H,#0
AX=CURRENTVALUE
CALL !CALC_CURRENTVALUE
else
A=#70
CALL !CALC_BREAKXUVALUE
AX=#50
CALL !CALC_CURRENTVALUE
endif
;---------------------读出时钟调整允许范围-----------------------------------------------------------
WordAddress=#TimeAdj_Range(AX)
DE=#I2CRT_Buffer
I2CRdWtCounter=#2
CALLT [TAddr_RdDataWithBkUp]
A=I2CRT_Buffer
A<->X
A=I2CRT_Buffer+1
if_bit(!CY)
AX=#0
endif
SecondAcc=AX
;---------------------读时间和参数--------------------------------------------------------------------
CALLT [TAddr_READ_TIMEBUF] ;读当前时间,放I2CRT_Buffer
if_bit(CY)
SET1 B_TIMEERR
endif
CALL !READ_POWERPARA ;读掉电保存参数,掉电时间放I2CRT_SubBuffer0
;---------------------处理转存------------------------------------------------------------------------
if_bit(B_TIMEERR)
CLR1 B_TIMEERR
BR $RdKWHAndSetReg
endif
if(I2CRT_SubBuffer01==#0)
BR $RdKWHAndSetReg
endif
CALL !READ_COPYDAY ;读抄表日I2CRT_SubBuffer1
if(I2CRT_SubBuffer1+1==#0)
BR $RdKWHAndSetReg
endif
CALL !POWERHOUR_ADD ;上电转存
WHILE(WORKER_CNT!=#0)
CALL !KWH_CHAN
WORKER_CNT--
ENDW
if_bit(B_ClrSvPwFlagEn) ;当前时间不是抄表日
B_KWHCHAN=0
endif
DE=#I2CRT_Buffer
WordAddress=#COMMRATE(AX)
I2CRdWtCounter=#1
CALLT [TAddr_RdDataWithBkUp]
A=I2CRT_Buffer
CALL !BaudRateSet
; SRMK6=1
; ASIM6=#01H
; BRGC6=#13 ;1200 baud rate
; ASIM6=#9DH ;power on,even parity,8 bits lenth ,1 stop bit
; RXE6=1
; SRMK6=0
;---------------------计算校时范围-----------------------------------------------
if_bit(!LVIF)
AX=TIMEERR_CNT
if(AX!=#0)
BC=#5
CALLT [TAddr_Multiply]
AX<->BC
CALL !ModifyTmAdj_Range
endif
endif
RdKWHAndSetReg:
CALL !Fill_KWHBuf
CALL !SetUp_SFRFlag
;==========================================================================================
MAIN_LOOP:
if_bit(B_TM80INT&&B_MAINLOOP)
WDTE=#0ACH
CLR1 B_MAINLOOP
CLR1 B_TM80INT
endif
B_AtMainLoop=1
POWERLOW_STOP:
IF_BIT(LVIF&&!B_UPFLAG)
;CALL !INI_CLOCK
LCDDispCounter=#0
B_LCDCLOSE=0
B_PowerDown=1
CALL !LCD_DISPLAY
if_bit(!B_POWERSAVE) ;7022复位脚为低
B_POWERSAVE=1
;CALL !POWERLSAVE
;CALLT [TAddr_READ_TIMEBUF]
;if_bit(CY)
; HL=#I2CRT_Buffer
; LOCAL_CNT=#4
; CALLT [TAddr_TEMP_BUFCLR]
;endif
I2CRT_Buffer=PULSE_CNT(A)
I2CRT_Buffer+1=KWH_BUF0(A)
DE=#I2CRT_Buffer
WordAddress=#EPOWERPARA(AX)
I2CRdWtCounter=#2
CALLT [TAddr_WtDataWithBkUp]
endif
; WordAddress=#POWERLOWDAY(AX)
; DE=#SPIDATAM
; I2CRdWtCounter=#1
; CALLT [TAddr_RdDataWithBkUp]
IRACTIVE_STOP:
;PM0=#11110111B
;PM3=#11110011B
;RESETM=0
;SIGM=0
;SPISDIIM=0
;CALL !POWER_SET
PMC2=#00000000B
PM0=#11110111B
PM3=#11110011B
RESETM=0
SIGM=0
;P3&=#11110011B
SPISDIIM=0
PM4=#11111100B
KWHPulse=0
DI
PIF2=0
MK0=#11111111B
MK1=#11111111B
;INTM0=#00000000B
;PIF0=0
;PMK2=0
LCDCOM=#58H
CALLT [TAddr_LCDINI]
LCDCOM=#70H
CALLT [TAddr_LCDINI]
;PM0=#0FFH
PM2=#0FFH
;PM3=#11110111B
;PM4=#11111101B
;关红外
PM12=#11111110B
;P0=#0
;P2=#0
;P3=#0
;P4=#0
if_bit(!B_IRSTART)
P12=#00000001B
else
P12=#00000000B
endif
LCDCTRL=0
A=#0
PU3=A
PU4=A
TMC00=A
CLR1 TCE80 ;close th0
TMC80=#02H
;CR80=#2
CLR1 TMHE1 ;close th1
CLR1 ADCE
CLR1 ADCS ;close ad
ASIM6=#01H
if_bit(LVIF)
LVIM=#0
LSRCM=#1
PCC=#02 ;divide clock to Fx/16 ,last low
PPCC=#02
EI
CALLT [TAddr_Delay]
if_bit(!B_CHUCHANG)
CALL !JUDGECHUCHANG_STATE
if_bit(CY)
B_CHUCHANG=1
endif
endif
B_SPIDATAFLAG=0
;BR !STOPCON
STOPCON:
IRPOWER=1
PMK2=0
PMK0=0
STOPCON1:
WDTE=#0ACH
NOP
STOP
NOP
IRCHECK_LOOP:
WDTE=#0ACH
if_bit(B_SEVENTY)
HALT
NOP
BR $IRCHECK_LOOP
endif
if_bit(B_UPFLAG)
DI
PMK0=1
PMK2=1
BR !WAKEUP_START
endif
BR $STOPCON1
else
BR !START
endif
ENDIF
if_bit(B_DATASAVE)
B_DATASAVE=0
CALLT [TAddr_READ_TIMEBUF]
if_bit(CY)
HL=#I2CRT_Buffer
LOCAL_CNT=#4
CALLT [TAddr_TEMP_BUFCLR]
endif
HL=#KWHPOINT
DE=#I2CRT_Buffer+4
LOCAL_CNT=#6
CALLT [TAddr_TRAN_DATA]
A=CLRKWHFLAG_BYTE
AND A,#0FH
I2CRT_Buffer+10=A
if_bit(B_KWHCHAN)
(I2CRT_Buffer+10)+=#10H
endif
DE=#I2CRT_Buffer
WordAddress=#AddrAndFlag(AX)
I2CRdWtCounter=#11
CALLT [TAddr_WtDataWithBkUp]
endif
if_bit(B_SJCLR)
CALL !TEMP_BUFCLR16
B=#11
A=WRITE_CYCLE
if(A<#5)
SWITCH(A)
case 0:
AX=#RVPKWHTIME
B=#3
BREAK
case 1:
AX=#RVPKWHTIME_BkUp
B=#3
BREAK
case 2:
AX=#NEARRVPKWH1
B=#15
BREAK
case 3:
AX=#BREAKXULANG
;B=#11
BREAK
DEFAULT:
AX=#CURRENTNOT
;B=#11
ENDS
WordAddress=AX
CALL !SJCLR_LOOP
WRITE_CYCLE++
else
WRITE_CYCLE=#0
B_SJCLR=0
endif
endif
if_bit(B_RdWrFail)
B_HardwareSta=1
B_MemoryError=1
else
B_HardwareSta=0
B_MemoryError=0
endif
if(COMTIME_COUNT==#20)
COMTIME_COUNT++
CALL !SetUp_SFRFlag
endif
if_bit(!LVIF)
CALL !KWH_SAVE
endif
if_bit(!LVIF)
CALL !TreatWithFrame
CALL !COMMANDDEAL
endif
if_bit(B_TimeOutFlag_15ms)
B_TimeOutFlag_15ms=0
if_bit(B_FrameSend)
SENDDELAY_45MS++
if(SENDDELAY_45MS>=#3)
B_FrameSend=0
B_FrameSendEnable=1
endif
endif
;CALL !SendFrame
CALL !DealWithKey
endif
IF_BIT(B_TimeOutFlag_100ms)
B_TimeOutFlag_100ms=0
TIMER_PULSECNT++
if(TIMER_PULSECNT>=#50)
B_FLASHLCD_Curr=0
if(TIME10S_PULSE>=#PULSENUM)
B_FLASHLCD_Curr=1
endif
TIME10S_PULSE=#0
TIMER_PULSECNT=#0
endif
;CALL !COMDEY_TIME
T1SEC_COUNT++
IF(T1SEC_COUNT>=#10)
T1SEC_COUNT=#0
if_bit(B_UPFLAG)
COUN60S_CNT++
if(COUN60S_CNT>=#20)
COUN60S_CNT=#0
B_UPFLAG=0
endif
endif
CALL !LCD_DISPLAY
IF_BIT(!LVIF)
A=MINUTE_CNTL
SWITCH(A)
case 1:
CALL !COPYDAY_COP
;CALL !CIRCUITERR_OVERTIME
if_bit(B_RVPKWH_LCD)
WordAddress=#RVPKWHTIME(AX)
CALL !RVPTIME_ADD
endif
BREAK
case 15:
;if_bit(!LVIF)
B_CheckAdjData=1
CALL !RdWt_AdjData
if(Counter_AdjDataErr>=#2)
RESETM=0
CALLT [TAddr_Delay1]
RESETM=1
CALLT [TAddr_Delay1]
CALLT [TAddr_Delay1]
B_CheckAdjData=0
CALL !RdWt_AdjData
endif
SPIDATAH=#0
SPIDATAM=#0
SPIDATAL=#1
SPICMD=#0AAH
CALL !WriteSPI
;endif
BREAK
case 30:
CALLT [TAddr_READ_TIMEBUF]
A=Second_Temp
MINUTE_CNTL=A
BREAK
case 50:
CALL !Fill_KWHBuf
Timer_PrgKeyCtl++
if(Timer_PrgKeyCtl>=#10)
B_PrgEnable=0
endif
CALL !SetUpRegister
if(COMTIME_COUNT>=#21)
CALL !SetUp_SFRFlag
DE=#I2CRT_Buffer
WordAddress=#COMMRATE(AX)
I2CRdWtCounter=#1
CALLT [TAddr_RdDataWithBkUp]
A=I2CRT_Buffer
CALL !BaudRateSet
endif
;LCDCOM=#48H
;CALLT [TAddr_LCDINI]
B_PowerDown=0
;BREAK
ENDS
ENDIF
if_bit(!LVIF)
CALL !CHECK_7022
CALL !SECOND_CNT
endif
;CALL !JUDGE_LCDCLOSE
TEMER_COMMUSYM++ ;通讯符号计数
if(TEMER_COMMUSYM>=#2)
Disp_Sym_K4=0
;set1 B_LCDREF
endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -