⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sam2t.src.bak

📁 用SAM72N9写的电子秤文档
💻 BAK
📖 第 1 页 / 共 5 页
字号:
	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 + -