📄 ss84b0337a.s
字号:
MINUTE_CNTL++
if(MINUTE_CNTL>=#60)
MINUTE_CNTL=#0
;BackLight10SCunt++
;if(BackLight10SCunt>=#10)
; BackLight10SCunt=#0
; Timer_BackLightCtl=#0
; LCDCTRL=1
;endif
endif
endif
endif
SET1 B_MAINLOOP
BR !MAIN_LOOP
;=====================================================================
;
;=====================================================================
;STOPCON:
; IRPOWER=1
; PMK2=0
; PMK0=0
;if_bit(B_CHUCHANG)
; PMK0=0
;endif
;STOPCON1:
; WDTE=#0ACH
; NOP
; STOP
; NOP
;IRCHECK_LOOP:
; WDTE=#0ACH
; if_bit(B_SEVENTY)
; HALT
; NOP
; BR $IRCHECK_LOOP
; endif
; if_bit(B_UPFLAG)
;if(Waken_Counter<#5)
;Waken_Counter++
; DI
; PMK0=1
; PMK2=1
; BR !WAKEUP_START
;endif
; endif
; BR $STOPCON1
BaudRateSet:
SRMK6=1
ASIM6=#01H
SWITCH(A)
case 00: ;baudrate=1200
CKSR6=#8
BREAK
; case 02: ;baudrate=300
; CKSR6=#10
; BREAK
; case 04: ;baudrate=600
; CKSR6=#9
; BREAK
case 16: ;baudrate=2400
CKSR6=#7
BREAK
case 32: ;baudrate=4800
CKSR6=#6
BREAK
case 64: ;baudrate=9600
CKSR6=#5
BREAK
default:
CKSR6=#8
ENDS
BRGC6=#13 ;1200 baud rate
ASIM6=#9DH ;power on,even parity,8 bits lenth ,1 stop bit
RXE6=1
SRMK6=0
RET
;------------------------------------------------------------------------------------------
;设置寄存器子程序
;------------------------------------------------------------------------------------------
SetUpRegister:
LVIS=#02H
LVIM=#80H
LSRCM=#0
;IniPORT
if(B_UPFLAG)
PM4=#11111100B
KWHPulse=0
else
PMC2=#00000001B
PM0=#11111000B
PM2=#11110001B
PM3=#11110111B
PM4=#11110001B
PU3=#00000100B
PU4=#00000001B
ADMK=0
ADS=#00H
RESETM=1
endif
PM12=#11111110B
IRTXD=0
LCDPOWER=1
IRPOWER=0
;IniClock
;8MHz FULL CLOCK RUN
PCC=#00H
PPCC=#00H
RET
;----------------------------------------------------------------
;READ_1PARA:
; WordAddress=AX
; I2CRdWtCounter=#1
; DE=#I2CRT_Buffer
; CALLT [TAddr_RdDataWithBkUp]
; RET
;-----------------------------------------------------------------
INI_CLOCK:
TEMP_BUF00=#00000011B
TEMP_BUF01=#00101000B
I2CDeviceInd=#01
AX=#00E0H
WordAddress=AX
DE=#I2CRT_Buffer
I2CRdWtCounter=#2
CALLT [TAddr_WriteI2C]
RET
;----------------------------------------------------------------------
SetUp_SFRFlag:
LCDCOM=#48H
CALLT [TAddr_LCDINI]
;CALL !INI_CLOCK
;WordAddress=#ClockAdjData(AX)
;I2CRdWtCounter=#1
;DE=#I2CRT_Buffer
;CALLT [TAddr_RdDataWithBkUp]
;if_bit(!B_CHECKSUMB)
; I2CDeviceInd=#1
; WordAddress=#OFFSET(AX)
; CALLT [TAddr_WriteI2C]
;endif
if(!B_UPFLAG)
DI
; SRMK6=1
; ASIM6=#01H
; CKSR6=#08H
; BRGC6=#13 ;1200 baud rate
; ASIM6=#9DH
; SRMK6=0
; B_COMMHEADFLAG=0
; B_COMMHEADFLAG1=0
TMMK000=1
IRmodeRXD=1
CRC00=#0
PRM00=#00000001B
AX=#416
CR000=AX
TMC00=#00001100B
TMMK000=0
IRmodeTXD=0
TMHMD1=#0
TMHMD1=#00000010B
CMP01=#105
TMHE1=1
TOEN1=0
TXE6=0
RXE6=1
FrameRTCounter=#0
COMM_FLAG=#00000000B
SET1 B_IRRecvEn
EI
endif
RET
;-----------------------------------------------------------------------------------------
;POWERL_CHAN:
;DE=#I2CRT_SubBuffer0+3 ;掉电时间
;HL=#I2CRT_Buffer+3 ;上电时间
;LOCAL_CNT=#4
;if_bit(B_TIMESET) ;上电时间
; LOCAL_CNT=#3
;endif
;CALLT [TAddr_JUDGE_MAX]
;if_bit(CY)
;if_bit(B_TIMESET)
; BR $POWERL_CHANEND
;endif
;HL=#I2CRT_SubBuffer0+1
;DE=#I2CRT_SubBuffer1+1
;LOCAL_CNT=#2
;CALLT [TAddr_JUDGE_MAX]
;if_bit(!Z)
; if(I2CRT_SubBuffer11!=I2CRT_SubBuffer01)(A)
; CLR1 B_KWHCHAN
; endif
; BR $POWERL_CHANEND
;endif
;BT B_KWHCHAN,$POWERL_CHANEND
;WORKER_CNT++
;if(WORKER_CNT<#11)
; BR $POWERL_CHANEND
;endif
;endif
;SET1 B_TIMEEVEN
;POWERL_CHANEND:
;RET
;----------------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------
;POWERHOUR_ADD:
; CALL !POWERL_CHAN
; BT B_TIMEEVEN,$POWERHOUR_ADDEND
; HL=#I2CRT_SubBuffer0
; BT B_TIMESET,$ADD_DAY
; SET1 CY
; A=[HL]
; ADDC A,#0
; CALLT [TAddr_BCDADJ]
; if(A>=#24H)
;ADD_DAY:
; WDTE=#0ACH
; AX=TIMEERR_CNT
; AX++
; TIMEERR_CNT=AX
; if(AX>=#447H) ;day>=3year
; AX=#721H
; TIMEERR_CNT=AX ;max=five year
; BR $POWERHOUR_ADDEND
; ENDIF
; A=#0
; CALL !TIME_BCDADJ
; HL++
; CALL !Judge_NumOfDays
; HL--
; if(A<[HL])
; A=#1
; CALL !TIME_BCDADJ
;
; if(A>=#13H)
; A=#1
; CALL !TIME_BCDADJ
; endif
; endif
; endif
; BR $POWERHOUR_ADD
;POWERHOUR_ADDEND:
; B_TIMEEVEN=0
; RET
;-------------------------------------------------------------------------------
Check_CopyDay:
HL=#I2CRT_SubBuffer0+1
DE=#I2CRT_SubBuffer1+1
LOCAL_CNT=#2
CALLT [TAddr_JUDGE_MAX]
if_bit(Z)
if_bit(!B_KWHCHAN)
if(WORKER_CNT<#11)
WORKER_CNT++
B_ClrSvPwFlagEn=0 ;B_ClrSvPwFlagEn:清电量转存标志允许位
endif
endif
else
if(I2CRT_SubBuffer11!=I2CRT_SubBuffer01)(A)
B_KWHCHAN=0
B_ClrSvPwFlagEn=1 ;允许清电量转存标志
endif
endif
RET
;-------------------------------------------------------------------------------------------
POWERHOUR_ADD:
WDTE=#0ACH
DE=#I2CRT_SubBuffer0+3 ;掉电时间
HL=#I2CRT_Buffer+3 ;上电时间
LOCAL_CNT=#4
CALLT [TAddr_JUDGE_MAX]
if_bit(CY)
CALL !Check_CopyDay
HL=#I2CRT_SubBuffer0
A=[HL]
A+=#1
CALLT [TAddr_BCDADJ]
if(A>=#24H)
AX=TIMEERR_CNT
AX++
TIMEERR_CNT=AX
if(AX>=#447H) ;day>=3year
AX=#721H
TIMEERR_CNT=AX
BR $POWERHOUR_ADD_END ;max=five year
endif
A=#0
CALL !TIME_BCDADJ
HL++
CALL !Judge_NumOfDays
HL--
if(A<[HL])
A=#1
CALL !TIME_BCDADJ
if(A>=#13H)
A=#1
CALL !TIME_BCDADJ
endif
endif
endif
else
if_bit(Z)
CALL !Check_CopyDay
endif
BR $POWERHOUR_ADD_END
endif
BR $POWERHOUR_ADD ;循环比较,直到相等
POWERHOUR_ADD_END:
RET
;--------------------------------------------------------------------------
;判断大小 [HL+B] [DE+B] B
;IF HL>DE A=2
;IF HL=DE A=4
;IF HL<DE A=1
;RETURN A
;--------------------------------------------------------------------------
;JUDGE_MAX:
; A=[DE]
; CMP A,[HL]
; BZ $JUDGE_MAX0
; BNC $JUDGE_MAX1
; ;B=1
; A=#2
; RET
;JUDGE_MAX0:
; DE--
; HL--
; DBNZ LOCAL_CNT,$JUDGE_MAX
; A=#4
; RET
;JUDGE_MAX1:
;
; A=#1
;
; RET
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;判断大小 [HL+B] [DE+B] B ;2005.10.10 zjl
;if [DE]<[HL] then C=1
;if [DE]>=[HL] then C=0
;if [DE]=[HL] then Z=1
;if [DE]!=[HL] then Z=0
;--------------------------------------------------------------------------
JUDGE_MAX:
A=[DE]
if(A!=[HL])
RET
endif
DE--
HL--
DBNZ LOCAL_CNT,$JUDGE_MAX
RET
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;按键扫描和处理子程序
; B_TurnKeySts_Temp KeyRegister0.0 ;轮显键暂存状态
; B_PrgKeySts_Temp KeyRegister0.1 ;编程键暂存状态
; B_TurnKeyValidSts KeyRegister1.0 ;轮显键有效状态
; B_PrgKeyValidSts KeyRegister1.1 ;编程键有效状态
; B_PressTurnKey KeyRegister1.6 ;轮显键按下标志
; B_PressPrgKey KeyRegister1.7 ;编程键按下标志
;----------------------------------------------------------------------
DealWithKey:
KeyRegister0&=#00000011B
KeyRegister1&=#11000011B
A=#0
if_bit(!TURNKEY)
A.0=1
endif
if_bit(!PRGKEY)
A.1=1 ;当前按键状态存放在A中
endif
if(A==KeyRegister0) ;此时A中存放当前按键状态
KeyScanCounter++
if(KeyScanCounter>=#5)
KeyScanCounter=#0
A^=KeyRegister1 ;若按键状态改变,则相应位为1
A&=KeyRegister0 ;此时KeyRegister0中存放当前按键状态
ROR A,1
ROR A,1
A&=#11000000B ;得到按键是否按下的标志
A|=KeyRegister0 ;将当前按键状态取为有效按键状态,供下次比较用
KeyRegister1=A
if_bit(B_PressTurnKey)
if_bit(!B_UPFLAG)
Timer_BackLightCtl=#0
LCDCTRL=1
endif
B_LCDFLAG=1
B_LCDCLOSE=0
Timer_LCD=#0
COUN60S_CNT=#0
if(LCDMODE_BYTE==#0)
LCDDispCounter=#0
else
LCDDispCounter++
if(LCDDispCounter>=#7)
LCDDispCounter=#0
endif
CALL !LCD_DISPLAY
endif
endif
;if_bit(!LVIF)
if_bit(B_PressPrgKey)
Flag0^=#10000000B ;编程允许标志位取反
;SET1 B_LCDFLAG
;SET1 B_LCDREF
Timer_PrgKeyCtl=#0
endif
;endif
endif
else
KeyScanCounter=#0
KeyRegister0=A
endif
RET
;------------------------------------------------------------------------------
;RVPKWH_TIME:
; if_bit(B_VOLTAGEBREAKAVAIL)
; DE=#I2CRT_Buffer
; Universal_Buf1=#BREAKTIME(AX)
; CALL !RVPTIME_ADD
; endif
; if_bit(B_RVPKWH_LCD)
; DE=#I2CRT_Buffer
; Universal_Buf1=#RVPKWHTIME(AX)
; CALL !RVPTIME_ADD
; endif
; RET
;-------------------------------------------------------------------------------
;RVPTIME_ADD:
; WordAddress=Universal_Buf1(AX)
; I2CRdWtCounter=#3
; CALLT [TAddr_RdDataWithBkUp]
; HL=#I2CRT_Buffer
; LOCAL_CNT=#3
; CALL !KWH_BCDADJ
; DE=#I2CRT_Buffer
; WordAddress=Universal_Buf1(AX)
; I2CRdWtCounter=#3
; CALLT [TAddr_WtDataWithBkUp]
; RET
;--------------------------------------------------------------------------------------------------
;RVPKWH_TIME:
; if_bit(B_VOLTAGEBREAKAVAIL)
; WordAddress=#BREAKTIME(AX)
; CALL !RVPTIME_ADD
; endif
; if_bit(B_RVPKWH_LCD)
; WordAddress=#RVPKWHTIME(AX)
; CALL !RVPTIME_ADD
; endif
; RET
;----------------------------------------------------------------------------------------------------
RVPTIME_ADD:
I2CRdWtCounter=#3
DE=#I2CRT_Buffer
CALLT [TAddr_RdDataWithBkUp]
HL=#I2CRT_Buffer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -