📄 sam2t.src.bak
字号:
LD HL,#ZeroCount
REF RGetAverageCnt
WeightTareE
REF RSetBnd ;
REF RCalWeightCnt ;
CALLS InitWeightBCD ;
BITR UdrWtNow ; Clear UdrWtNow
RET
;***********************************************************
; F: Underweight Procedures
; I: UdrWtNow, AverageCount, NewWeightCnt
; O: ZeroOffset, ZeroCount
; IdleUdrWtNow = 1: currently is underweight
; = 0: currently is not underweight
; D: EA, HL, WX, YZ
;
UnderweightProc
BITR OvrWtNow ; Clear OvrWtNow
CALL DspUnderWeight ;
BTST AutoZeroNow ; 1 = Reset Zero now
RET
UdrWgtProc2
CALLS Dly20 ; DELAY 400ms
CALLS Dly20
REF RAverageSample ;
BTST TotalFlag
JPS UdrWgtProc4
BTSF TareNow
JR UdrWgtProc3
LD HL,#StartZero ; Reset Zero Reading
REF RGetAverageCnt
JPS UdrWgtProc4
UdrWgtProc3
BITR TareNow
BITR Icon_Tare
LD EA,StartZero ; Reset Zero Reading
LD ZeroCount,EA ; MSB
LD EA,StartZero+2
LD ZeroCount+2,EA ; LSB
JR UdrWgtProc7
UdrWgtProc4
LD HL,#ZeroCount
REF RGetAverageCnt
UdrWgtProc7
REF RCalWeightCnt ; get NewWeightCnt
REF RSetBnd ;
CALLS InitWeightBCD ;
RET
;***********************************************************
; F: Overloading Procedure
; I: IdleOvrWtNow
; D: EA
;
OverloadingProc
BITR UdrWtNow ; Clear UdrWtNow
BITR HoldRd ; if loading occur,disable hold reading
BITR HoldStableChk ;
BITS HoldNotAllow ;
LD A,#HoldChkTime ; Reset timer
LD HoldTimer,A ;
CALL DspOverloaded ;
RET
;***********************************************************
; F: Check if now underweight
; I: AverageCount, ZeroBound
; O: Skip return if underweight(ZeroBound > AverageCount)
; return if not underweight or OvrAbMaxNow set
; D: HL, WX
;
ChkUnderweight
BTSF OvrAbMaxNow ;
RET
ChkUnderweight1
LD HL,#ZeroBound ;
LD WX,#AverageCount;
REF RCmpHex ; If @HL <= @WX, skip
SRET ;
RET ;
;***********************************************************
; F: Check if now overloading
; I: NewWeightCnt, MaxBound
; O: Skip return if overloading(MaxBound < NewWeightCnt + ZeroOffset) or OvrAbMaxNow set
; return if Not overloading(MaxBound >= NewWeightCnt + ZeroOffset)
; D: HexBuf[], EA, HL, WX
;
ChkOverloading
BTSF OvrAbMaxNow ;
SRET ;
BTSF CntDspNow ;
RET
LD HL,#StartZero ;
LD WX,#AverageCount;
REF RCmpHex ; if @HL <= @WX, skip
RET ;
; HexBuf = AverageCount - StartZero
LD HL,#StartZero
LD WX,#AverageCount
REF RSubHex ; HexBuf = @WX - @HL
LD HL,#HexBuf ; HexBuf = AverageCount - StartZero
LD WX,#MaxBound ;
REF RCmpHex ; If @HL <= @WX, skip
SRET ;
RET ;
;***********************************************************
; F: To Round NewWeightCnt correct to step count width for kg/ml mode
; I: NewWeightCnt
; O: NewWeightCnt
;
Rnd2Step_kgml
LD WX,#YS_F_REG_4 ;
REF RCurStep2Ary ;
REF RDiv_10_FReg ;
REF RCpy_F2LReg ;
LD HL,#NewWeightCnt+2
LD WX,#YS_F_REG_4 ; Copy NewWeightCnt to YS_F_REG[]
REF RWrd2Ary ;
REF RDiv_YS ;
REF RRound_YS ; Round to nearest step in kg/ml
LD WX,#YS_F_REG_4 ; Copy YS_F_REG[] to DecBuf[]
LD HL,#DecBuf4 ; for backup
REF RCpyBuf ;
REF RActCurStp2Ary ;
REF RCpy_F2LReg ;
LD WX,#DecBuf4 ; Copy DecBuf[] to YS_F_REG[]
LD HL,#YS_F_REG_4 ; for restore
REF RCpyBuf ;
CALLS Mul_YS ;
LD WX,#YS_R_REG_4 ; Copy YS_R_REG[] to NewWeightCnt
LD HL,#NewWeightCnt+2
CALLS Ary2Wrd ;
RET
;***********************************************************
; F: To Round NewWeightCnt correct to step count width for fl.oz mode
; I: NewWeightCnt
; O: NewWeightCnt
;
Rnd2Step_floz
REF RNWCnt2FReg ;
REF RMul_10_FReg ;
CALLS Cal_oz_Part ; oz = remainder / ozRatio
REF RCpy_R2FReg ; get remainder
JR Rnd2Stpoz1 ;
;***********************************************************
; F: To Round NewWeightCnt correct to step count width for oz/lb mode
; I: NewWeightCnt
; O: NewWeightCnt
;
Rnd2Step_lb
CALL lbRatio2LReg ;
REF RNWCnt2FReg ;
REF RDiv_YS ; LB = NewWeightCnt / lbRatio
REF RCpy_R2FReg ; get remainder
REF RMul_10_FReg ;
CALLS Cal_oz_Part ; oz = remainder / ozRatio
REF RCpy_R2FReg ; get remainder
Rnd2Stpoz1
LD WX,#YS_L_REG_4 ;
REF RCurStep2Ary ; 1/8oz step
REF RDiv_YS ;
LD A,YS_F_REG_4 ;
REF RRound_YS ;
LD HL,#YS_F_REG_4 ;
CPSE A,@HL ; if no round, skip
JR Rnd2Stpoz2 ;
RET
Rnd2Stpoz2
REF RActCurStp2Ary ;
LD HL,#YS_F_REG_4 ;
REF RDouble_YS ;
LD HL,#YS_F_REG_4 ; YS_L_REG[] = YS_L_REG * 4
REF RDouble_YS ;
REF RDiv_10_FReg ;
; LD A,FactoryMode ;
; CPSE A,#5 ; if mode 6 - lb mode, RDiv_10_FReg once more
; JR Rnd2Stpoz3 ;
; JR Rnd2Stpoz5
;BTSF UnitMode ;
;REF RDiv_10_FReg ;
;Rnd2Stpoz3
; DECS A
; JR Rnd2Stpoz8
;Rnd2Stpoz5
; BTSF UnitMode ;
; REF RDiv_10_FReg ;
Rnd2Stpoz8
REF RRound_YS ;
LD WX,#YS_F_REG_4 ; Convert YS_L_REG[] to HexBuf[]
LD HL,#HexBuf+2 ;
CALLS Ary2Wrd ;
RCF ;
LD EA,HexBuf+2 ; NewWeightCnt = NewWeightCnt + HexBuf
REF RLD_HLEA ;
LD EA,NewWeightCnt+2
REF RADC_EAHL ; Substract LSB
LD NewWeightCnt+2,EA;
LD EA,HexBuf ;
REF RLD_HLEA ;
LD EA,NewWeightCnt ;
REF RADC_EAHL ; Substract MSB
LD NewWeightCnt,EA ;
RET
;***********************************************************
; F: Part routine to calculate oz
; I: YS_F_REG[], ozRatio
; O: YS_F_REG[] = oz
; YS_R_REG[] = Remainder
; D: A
;
Cal_oz_Part
CALL ozRatio2LReg ;
REF RDiv_YS ;
RET
;***********************************************************
; F: Calculate kg
; I: NewWeightCnt[] - Relative count of weight
; gRatio - Count per 1g
; O: NewWeightBCD[]
; N: kg/ml dsp = NewWeightCnt/(CurStep/10)*StepVal
; D: EA, HL, WX, YZ
;
CalculateML
CalculateKG
CALLS Rnd2Step_kgml
CALLS CalStepVal ;
PUSH EA ;
REF RActCurStp2Ary ;
REF RCpy_F2LReg ;
REF RNWCnt2FReg ;
REF RDiv_YS ;
POP EA ;
CALL Mul_EA_FReg ; YS_F_REG = YS_F_REG * step value
REF RHxFReg2Dec ;
LD HL,#NewWeightBCD4
LD WX,#DecBuf4 ; Copy DecBuf[] to NewWeightBCD[]
REF RCpyBuf ;
RET
;***********************************************************
; F: Calculate solid oz/lb
; I: NewWeightCnt
; O: NewWeightBCD[]
; D: EA, HL, WX, YZ
;
CalculateLB
CALLS Rnd2Step_lb ;
CALLS CalStepVal ;
PUSH EA ;
CALL lbRatio2LReg ;
REF RNWCnt2FReg ;
REF RDiv_YS ; LB = NewWeightCnt / lbRatio
REF RHxFReg2Dec ;
LD A,FactoryMode ;
DECS A ; if mode = 1, fill first one display location only
JR CalculateLB1
LD A,DecBuf4 ;
LD NewWeightBCD0,A ;
JR CalculateLB2
CalculateLB1
LD A,DecBuf4 ;
LD NewWeightBCD1,A ;
LD A,DecBuf3 ;
LD NewWeightBCD0,A ;
;-----
CalculateLB2
REF RCpy_R2FReg ; get remainder
REF RMul_10_FReg ;
CALLS Cal_oz_Part ; return YS_F_REG[] ... YS_R_REG[]
REF RHxFReg2Dec ;
LD A,FactoryMode ;
DECS A ; if mode = 1, fill next two display location only
JR CalculateLB5
LD A,DecBuf3 ;
LD NewWeightBCD1,A ;
LD A,DecBuf4 ;
LD NewWeightBCD2,A ;
JR CalculateLB6
CalculateLB5
LD A,DecBuf4 ;
LD NewWeightBCD3,A ;
LD A,DecBuf3 ;
LD NewWeightBCD2,A ;
;-----
CalculateLB6
REF RCpy_R2FReg ; get remainder
LD WX,#YS_L_REG_4 ;
REF RCurStep2Ary ;
REF RDiv_YS ;
POP EA ; get step value
CALL Mul_EA_FReg ;
LD A,FactoryMode ;
DECS A ; if mode = 1, fill last one display location only
JR CalculateLB60
REF RHxFReg2Dec ; Hex --> Dec
LD A,DecBuf4 ;
LD NewWeightBCD3,A ;
JR CalculateLB70
CalculateLB60
LD A,YS_F_REG_4 ;
LD NewWeightBCD4,A ;
CalculateLB70
RET
;***********************************************************
; F: Calculate Fuild oz
; I: NewWeightCnt
; O: NewWeightBCD[]
; D: EA, HL, WX, YZ
;
CalculateFLOZ
LD A,FactoryMode
DECS A ; if mode = 1, use CalculateLB
JR CalculateFLOZ_1
JPS CalculateLB
CalculateFLOZ_1
CALLS Rnd2Step_floz ;
CALLS CalStepVal ;
PUSH EA ;
CALL ozRatio2LReg ;
LD WX,#YS_L_REG_4 ;
LD HL,#YS_F_REG_4 ;
REF RCpyBuf ; Copy YS_L_REG[] to YS_F_REG[]
REF RDiv_10_FReg ;
REF RCpy_F2LReg ;
REF RNWCnt2FReg ;
REF RDiv_YS ;
REF RHxFReg2Dec ;
LD WX,#DecBuf4 ;
LD HL,#NewWeightBCD3
CALL CpyBuf2 ;
;------
REF RCpy_R2FReg ; get remainder
REF RMul_10_FReg ;
LD WX,#YS_L_REG_4 ;
REF RCurStep2Ary ;
REF RDiv_YS ;
POP EA ; get step value
CALL Mul_EA_FReg ;
LD A,YS_F_REG_4 ;
LD NewWeightBCD4,A ;
RET
;***********************************************************
; F: Check 4 dsp Step change
; I: AverageCount, NewWeightCnt, ZeroCount
; O: Chge4stepNow = 0: within 4 dsp step range
; = 1: beyond 4 dsp step count
;
Chk_4stepChange
LD HL,#PreviousCount ; compare with previous count
CALL GetDif ; and check 4 step change
REF RActCurStp2Ary ;
LD HL,#YS_F_REG_4 ;
REF RDouble_YS ;
LD HL,#YS_F_REG_4 ;
REF RDouble_YS ;
LD WX,#YS_F_REG_4 ;
LD HL,#DecBuf+2 ; DecBuf = Step Count * 4
CALLS Ary2Wrd ;
LD HL,#HexBuf ; HL = HexBuf = weight change
LD WX,#DecBuf ; WX = DecBuf = 4 step count
REF RCmpHex ; if @WX => @HL, skip
JR GoSetSlpTmr ;
RET ;
GoSetSlpTmr
BITS Chge4stepNow ;
BITR IdleCnstRdNow ;
BITR IdleZeroRdNow ;
BITR ChgeSlpTmrNow
LD A,#ChgeSlpTmrDly ; Reset set sleep timer delay
LD Chge4stepTimer,A
RET
;***********************************************************
; F: Main Calculation Routine
; I: SampleCount0, SampleCount1, HaveData, UnitMode
; O: NewWeightBCD
; LDigitxxx1, LDigitxx1x, LDigitx1xx, LDigit1xxx
; D: EA, HL, WX, YZ
;
MainCalculate
BTSF IdleBatLowNow ; if battery low now,
RET ; exit
BTST HaveSample0 ; Got 2 Samples?
RET ;
BTST HaveSample1 ;
RET ;
REF RAverageSample ;
BTST EnCreeping
JPS MainCalculate22
CALL ChkZeroOne
LD HL,#PreviousCount ; compare with the previous count
CALL GetDif ; and check for creeping
LD EA,HexBuf+2 ; store the difference for further
LD YZ,EA ; calculation
LD HL,#AverageCount ; HL = HexBuf = AverageCount
LD WX,#PreviousCount ; WX = DecBuf = PreviousCount
REF RCmpHex ; if @WX => @HL, skip
JR MainCalculate1
LD EA,#0FFh
XOR YZ,EA
INCS YZ
NOP
MainCalculate1
LD EA,#CreepingDif4
REF RPutDec
LD HL,#HexBuf ; HL = HexBuf = weight change
LD WX,#DecBuf ; WX = DecBuf = Hold stable count
REF RCmpHex ; if @WX => @HL, skip
JPS MainCalculate22
;=====================================
; Check creep zero
MainCalculate20
; HexBuf = ZeroCount - AverageCount
LD HL,#AverageCount
LD WX,#ZeroCount
REF RSubHex ; HexBuf = @WX - @HL
BTST C
JR MainCalculate20a
JPS MainCalculate20b ; if ZeroCount < Average Count, check no creep zero
MainCalculate20a
LD EA,#ZeroRtnUpBnd
REF RPutDec
LD HL,#DecBuf ;
LD WX,#HexBuf ; HexBuf = ZeroCount - AverageCount
REF RCmpHex ; If @HL <= @WX, skip
JPS MainCalculate20b
LD EA,#ZeroRtnLowBnd
REF RPutDec
LD HL,#HexBuf ; HexBuf = ZeroCount - AverageCount
LD WX,#DecBuf ;
REF RCmpHex ; If @HL <= @WX, skip
JPS MainCalculate20b
BTST CreepZero ; Check creep zero timer
JPS MainCalculate21
RCF
LD EA,AverageCount+2 ;
LD HL,#ZeroRtnUpBnd ;
REF RADC_EAHL ;
LD ZeroCount+2,EA ;
LD EA,AverageCount ;
LD HL,#0 ;
REF RADC_EAHL ;
LD ZeroCount,EA ;
REF RSetBnd
JPS MainCalculate22
MainCalculate20b
LD A,#ZeroUpdate
LD Tag2sec,A
BITR CreepZero
;=====================================
; Check creeping exist
MainCalculate21
BTST TimrFinished ;
JPS MainCalculate26 ; Creeping timer = 8s?
LD HL,#0 ; HL = MSB of different
LD EA,#80h
RCF
ADS EA,YZ
JR MainCalculate21a
BTSF ZeroOne
JPS MainCalculate22
LD HL,#0FFH
MainCalculate21a
RCF ; ZeroCount = ZeroCount + diff
LD EA,ZeroCount+2 ; lsb
ADC EA,YZ ;
LD ZeroCount+2,EA ;
LD EA,ZeroCount ; msb
REF RADC_EAHL ;
LD ZeroCount,EA ;
RCF ; StartZero = StartZero + diff
LD EA,StartZero+2 ; lsb
ADC EA,YZ ;
LD StartZero+2,EA ;
LD EA,StartZero ; msb
REF RADC_EAHL ;
LD StartZero,EA ;
REF RSetBnd ; Set Zero Bound
MainCalculate22
LD A,#CreepTimer_RL4 ; reset timer
BTST ZeroOne ;
LD A,#CreepTimer_RL6 ;
LD CreepTimer,A ;
BITR TimrFinished ;
LD A,#ZeroUpdate ;
LD Tag2sec,A ;
BITR CreepZero ;
MainCalculate23
CALLS Chk_4stepChange ;
LD HL,#PreviousCount ; AverageCount ---> PreviousCount
REF RGetAverageCnt
;------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -