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

📄 samtestc.src.bak

📁 用SAM72N9写的电子秤文档
💻 BAK
📖 第 1 页 / 共 5 页
字号:
	JR	SetST5		;
	
	BITS	ZeroRdNow	; Zero reading
	BITR	CnstRdNow	;
	JR	SetST6		;

SetST4	LD	EA,#LDspNul	;
	CPSE	EA,@HL		; Digit = Null?
	JR	SetST5		;
	JPS	SetST3		;

SetST5	BITR	ZeroRdNow	;
	BITS	CnstRdNow	;

SetST6	
	BTST	ChgeSlpTmrNow	; if now have 4 steps changed, skip
	RET			;
	BITR	ChgeSlpTmrNow

	BTSF	OvrWtNow	; if now not overweight, skip
	JR	RstIdleOWT	;
	BTSF	UdrWtNow	; if now not underweight, skip
	JR	RstIdleUWT	;
	BTSF	CnstRdNow	; if now not constant reading, skip
	JPS	RstIdleCRT	;
	BTSF	ZeroRdNow	; if now not zero reading, skip
	JPS	RstIdleZRT	;
	RET

RstIdleOWT
	BTST	IdleOvrWtNow	;
SetIdleOWT
	CALLS	RL_OWT		;
	JPS	Rst_IO		;

RstIdleUWT
	BTST	IdleUdrWtNow	;
SetIdleUWT
	CALLS	RL_UWT		;
	JR	Rst_IU		;

RstIdleCRT
	BTST	IdleCnstRdNow	;
SetIdleCRT
	CALLS	RL_CRT		;
	JR	Rst_IC		;

RstIdleZRT
	BTST	IdleZeroRdNow	;
SetIdleZRT
	CALLS	RL_ZRT		;
	JR	Rst_IZ		;

Rst_IC	LD	A,#0001b	; set IdleCnstRdNow
Rst_IO	LD	A,#0010b	; set IdleOvrWtNow
Rst_IU	LD	A,#0100b	; set IdleUdrWtNow
Rst_IZ	LD	A,#1000b	; set IdleZeroRdNow
	LD	OperFlg9,A	;
	RET

SetST_RL
	LD	EA,SleepTimLRL	;	
	LD	SleepTimL,EA	;
	LD	A,SleepTimHRL	;	
	LD	SleepTimH,A	;
	BITR	SleepNow	;
	RET

;***********************************************************
;ChkHoldState
;	BTST	HoldEn		; Check is Hold enable
;	RET			;
;
;	LD	HL,#HoldChkCount	; restore previous interal count
;	CALL	ChkHoldStable		;
;	
;	BTSF	HoldRd		; Check is the reading is not Hold
;	JPS	ChkHoldState_Ret
;
;	BTST	HoldStableChk	; Check time interval reach
;	RET			;
;
;	BITR	HoldStableChk
;	LD	A,#HoldChkTime	; Reset timer
;	LD	HoldTimer,A	;
;
;	LD	A,OperFlg8	; Check OperFlg8 to determinate is it sitable for hold
;	AND	A,#1110b	;
;	REF	RCPSE_A0	;
;	JPS	ChkHoldState_Ex	;
;
;	BTSF	HoldRd		; Check is the reading is not Hold
;	JPS	ChkHoldState_Ret
;
;	BTSF	HoldRdChange	; Check is there any reading change
;	JR	ChkHoldState_Ret
;
;	BTSF	HoldNotAllow	;
;	JR	ChkHoldState_Ret;
;
;	CALL	KeyTone		; Beep !!!
;	BITS	HoldRd		; --
;	LD	A,#HoldTimConst	; Reset Hold timer
;	LD	HoldTimer,A	;
;	JR	ChkHoldState_Ret
;ChkHoldState_Ex
;	BITS	HoldNotAllow	;
;ChkHoldState_Ret
;	BITR	HoldRdChange	;
;	RET

;====== CALCULATION ================================================

;***********************************************************
;	F: Check weight taring function
;	I: WeightTareNow = 1: Weight Tare
;	O: WeightTareNow, ZeroOffset, ZeroCount, NewWeightCnt, NewWeightBCD
;	   CnstRdNow, ZeroRdNow
;	N: if OvrWtNow set, exit
;	   if OvrAbMaxNow set, exit
;	   if UdrWtNow set, No tare, reset zero position
;
ChkWeightTare
	BTST	WeightTareNow	;
	RET			;
	
;	REF	RSMB_MemMapIO	;
;ChkWeightTare1
;	BTSF	ONZERO_PIN
;	JR	ChkWeightTare2
;	REF	RSMB_Variable   ;
;	RET


	btsf	IsOnZeroKey
	jr	ChkWeightTare2
	ret
	
ChkWeightTare2
	REF	RSMB_Variable   ;

	BITR	WeightTareNow	;

	BTSF	HoldEn		; if hold enable, no function
	RET			;

	BTSF	OvrWtNow	; If over weight now, exit
	RET			;
	BTSF	OvrAbMaxNow	; If over absolute max count, exit
	RET			;
	BTSF	OvrHiVoltNow	; If over Hi-Volt Boundary, exit
	RET			;
	BTSF	BlwLoVoltNow	; If below Lo-Volt Boundary, exit
	RET			;
	BTSF	HoldRd		; If Hold enable now, exit
	RET			;

WeightTare
	CALLS	SetIdleZRT	; Set zero-reading sleep time
	BTST	UdrWtNow	;
	JR	WeightTare1	;
	CALLS	UdrWgtProc2	; If under weight now, reset zero position
	BITR	OvrWtNow	; Clear OvrWtNow
	RET			;
WeightTare1
	BTSF	CalibrateOn	; In Calibration mode, no totaling function
	JPS	WeightTare10
	BTST	TotalFlag
	JPS	WeightTare10			
	BTST	TareNow
	JPS	WeightTare9
;-----------------------------------------
; Totalling occur	
	LD	EA,StartZero+2	;  StartZero ---> ZeroCount
	LD	ZeroCount+2,EA
	LD	EA,StartZero
	LD	ZeroCount,EA
	
	BITR	TareNow
	BITR	Icon_Tare
	JR	WeightTareE
WeightTare9
	BITS	TareNow
	BITS	Icon_Tare
WeightTare10	
	CALL	Dly60			; DELAY 600ms	
;-------------------------------------------
; Tare occur (default)
	REF	RAverageSample
	LD	HL,#ZeroCount
	REF	RGetAverageCnt

WeightTareE
	REF	RSetBnd		;	
	REF	RCalWeightCnt	;

	CALLS	InitWeightBCD	;
	BITR	UdrWtNow	; Clear UdrWtNow
	; add by hcy 03-12-2 10:32
; remark by hcy 03-12-9 16:04
;	bits	PermitSend
	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
	
	btst	UdrAlrDsp
	CALL	DspUnderWeight	;
	; add by hcy for tare for negative value
	bits	UdrAlrDsp
	
	; modify by hcy 03-12-9 16:37 
	ld	EA,#LDsp__
	LD	PrevWeight0,EA		;
	LD	PrevWeight2,EA		;
	LD	PrevWeight4,A		;

	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	;
	; add by hcy 03-11-29 16:21
; remark by hcy 03-12-9 16:04
;	bits	PermitSend
	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	;
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -