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

📄 scale.asm

📁 基于holtek MCU 的电子秤源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	SNZ		C
	JMP		L_MainNormCalcRangNega
	MOV		A,					R_PubReg_0			;<40?
	SUB		A,					R_Mark1_0
	MOV		R_PubReg_0,			A
	MOV		A,					R_PubReg_1
	SBC		A,					R_Mark1_1
	MOV		R_PubReg_1,			A
	SNZ		C
	JMP		L_MainNormCalcRang00_40
	MOV		A,					R_PubReg_0			;40-80?
	SUB		A,					R_Mark2_0
	MOV		R_PubReg_0,			A
	MOV		A,					R_PubReg_1
	SBC		A,					R_Mark2_1
	MOV		R_PubReg_1,			A
	SNZ		C
	JMP		L_MainNormCalcRang40_80
	JMP		L_MainNormCalcRangMore80
 L_MainNormCalcRangNega:								;X<0克
	CLR		R_ShowPosi_F							;显示重量为正标志位
	MOV		A,					00H
	SUBM	A,					R_PubReg_0
	SBCM	A,					R_PubReg_1
	MOV		A,					R_PubReg_0
	MOV		R_FCalcIn_0,		A
	MOV		A,					R_PubReg_1
	MOV		R_FCalcIn_1,		A
	MOV		A,					R_Mark1_0
	MOV		R_FCalcDiv_0,		A
	MOV		A,					R_Mark1_1
	MOV		R_FCalcDiv_1,		A
	CALL	B_Calc									;得到结果为D值的4倍
	JMP		L_MainNormCalcRound
 L_MainNormCalcRang00_40:							;0<X<40KG
	MOV		A,					R_PubReg_0
	ADD		A,					R_Mark1_0
	MOV		R_FCalcIn_0,		A
	MOV		A,					R_PubReg_1
	ADC		A,					R_Mark1_1
	MOV		R_FCalcIn_1,		A
	MOV		A,					R_Mark1_0
	MOV		R_FCalcDiv_0,		A
	MOV		A,					R_Mark1_1
	MOV		R_FCalcDiv_1,		A
	CALL	B_Calc									;得到结果为D值的4倍
	JMP		L_MainNormCalcRound
 L_MainNormCalcRang40_80:							;40<X<80KG
	MOV		A,					R_PubReg_0
	ADD		A,					R_Mark2_0
	MOV		R_FCalcIn_0,		A
	MOV		A,					R_PubReg_1
	ADC		A,					R_Mark2_1
	MOV		R_FCalcIn_1,		A
	MOV		A,					R_Mark2_0
	MOV		R_FCalcDiv_0,		A
	MOV		A,					R_Mark2_1
	MOV		R_FCalcDiv_1,		A
	CALL	B_Calc									;得到结果为D值的4倍
	MOV		A,					R_PubReg_2
	ADDM	A,					R_FCalcOut_0
	MOV		A,					R_PubReg_3
	ADCM	A,					R_FCalcOut_1
	CLR		R_FCalcOut_2
	JMP		L_MainNormCalcRound
 L_MainNormCalcRangMore80:							;X>80KG
	MOV		A,					R_PubReg_0
	MOV		R_FCalcIn_0,		A
	MOV		A,					R_PubReg_1
	MOV		R_FCalcIn_1,		A
	MOV		A,					R_Mark3_0
	MOV		R_FCalcDiv_0,		A
	MOV		A,					R_Mark3_1
	MOV		R_FCalcDiv_1,		A
	CALL	B_Calc									;得到结果为D值的4倍
	CLR		C										;*2
	RLC		R_PubReg_2
	RLC		R_PubReg_3
	MOV		A,					R_PubReg_2
	ADDM	A,					R_FCalcOut_0
	MOV		A,					R_PubReg_3
	ADCM	A,					R_FCalcOut_1
	CLR		R_FCalcOut_2
 L_MainNormCalcRound:								;四舍五入,得显示精度
	MOV		A,					1
	ADDM	A,					R_FCalcOut_0
	MOV		A,					00H
	ADCM	A,					R_FCalcOut_1
	CLR		C
	RRC		R_FCalcOut_1
	RRC		R_FCalcOut_0
	CLR		C
	RRC		R_FCalcOut_1
	RRC		R_FCalcOut_0
 L_MainNormCalcLoop3:
	SZ		R_PubCnt_0.0
	JMP		L_MainNormCalcEnd
	INC		R_PubCnt_0
	MOV		A,					R_FCalcOut_0
	MOV		R_DReg_0,			A
	MOV		A,					R_FCalcOut_1
	MOV		R_DReg_1,			A
	JMP		L_MainNormCalcLoop1
 L_MainNormCalcEnd:
	SNZ		R_UnitLB_F								;LB单位时,少除2.
	JMP		$+4
	CLR		C
	RLC		R_FCalcOut_0
	RLC		R_FCalcOut_1
	MOV		A,					R_FCalcOut_0
	MOV		R_PubReg_0,			A
	MOV		A,					R_FCalcOut_1
	MOV		R_PubReg_1,			A

 ;主程序/普通模式/重量范围处理
 L_MainNormRang:									;
	SZ		R_ShowWord_F
	JMP		L_MainNormRangEnd
	SZ		R_ShowLock_F							;.NOT.锁存	?
	JMP		L_MainNormRangEnd
	SNZ		R_ShowPosi_F							;正 ?
	JMP		L_MainNormRangNega
 L_MainNormRangPosi:
	MOV		A,					R_SetMAX_L
	MOV		R_PubReg_2,			A
	MOV		A,					R_SetMAX_H
	MOV		R_PubReg_3,			A
	MOV		A,					9					;扩大9个D
	ADDM	A,					R_PubReg_2
	MOV		A,					00
	ADCM	A,					R_PubReg_3
 L_MainNormRangPosiSub:
	MOV		A,					R_PubReg_2
	SUB		A,					R_DReg_0
	MOV		A,					R_PubReg_3
	SBC		A,					R_DReg_1
	SZ		C
	JMP		L_MainNormRangEnd
	CLR		R_ShowLockCnt							;不锁存
	MOV		A,					LOW	TabLCDErr		;显示'Err ',表示重量正溢出
	CALL	B_ReadWord
	JMP		L_MainNormRangEnd						;计程序重新开始
 L_MainNormRangNega:
	MOV		A,					5					;-5D以下显示‘----’
	MOV		R_PubReg_2,			A
	MOV		A,					00H
	MOV		R_PubReg_3,			A
	MOV		A,					R_PubReg_2
	SUB		A,					R_DReg_0
	MOV		A,					R_PubReg_3
	SBC		A,					R_DReg_1
	SZ		C
	JMP		L_MainNormRangEnd
	MOV		A,					LOW	TabLCD____		;显示'----',表示重量负溢出
	CALL	B_ReadWord
 L_MainNormRangEnd:
 ;主程序/普通模式/长时间有重量但不稳定关机处理
 L_MainNormUnStabOFF:								;长时间有重量但不稳定,	关机. 
	SZ		R_DReg_1
	JMP		L_MainNormUnStabOFFInc
	MOV		A,					R_SetShowMin
	SUB		A,					R_DReg_0
	SNZ		C										;显示0
	JMP		L_MainNormUnStabOFFInc
	CLR		R_UnStabOFFCnt
	JMP		L_MainNormUnStabOFFEnd
 L_MainNormUnStabOFFInc:
	SZ		R_HalfSecond_F
	INC		R_UnStabOFFCnt
	MOV		A,					D_UnStabOFFCnt
	SUB		A,					R_UnStabOFFCnt
	SNZ		C
	JMP		L_OFF									;关机去
 L_MainNormUnStabOFFEnd:

 ;主程序/普通模式/归零处理
 L_MainNormAZ:										;归零
 L_MainNormAZCatch:									;抓零
	SZ		R_ShowLock_F
	CLR		R_AutoZeroCnt
	CLR		R_WeigLow_F
	MOV		A,					R_ShowLast1Reg_L
	SUB		A,					R_Mark0M_0
	MOV		R_PubReg_3,			A
	MOV		A,					R_ShowLast1Reg_H
	SBC		A,					R_Mark0M_1
	MOV		R_PubReg_4,			A
	SZ		C
	JMP		$+4
	MOV		A,					00
	SUBM	A,					R_PubReg_3
	SBCM	A,					R_PubReg_4
	CALL	B_InitCalc
	MOV		A,					R_Mark4DReg			;得到1D或者1/2个D.
	MOV		R_FCalcIn_0,		A
	MOV		A,					R_SetShowMin
	MOV		R_FCalcMuL_0,		A
	MOV		A,					4
	MOV		R_FCalcDiv_0,		A
	CALL	B_Calc
	SZ		R_FCalcOut_2
	JMP		L_MainNormAZUn
	MOV		A,					R_FCalcOut_0
	SUB		A,					R_PubReg_3
	MOV		A,					R_FCalcOut_1
	SBC		A,					R_PubReg_4
	SNZ		C
	JMP		L_MainNormAZUn
	CLR		R_ShowLockCnt
	SET		R_WeigLow_F								;设显示重量小标示
	SZ		R_HalfSecond_F
	INC		R_AutoZeroCnt
	MOV		A,					D_AutoZeroCnt		;时间到 ?
	SUB		A,					R_AutoZeroCnt
	SZ		C
	JMP		L_MainNormAZShow
 ;	MOV		A,					R_ShowLast2Reg_L
 ;	MOV		R_Mark0M_0,			A
 ;	MOV		A,					R_ShowLast2Reg_H
 ;	MOV		R_Mark0M_1,			A
	CLR		R_AutoZeroCnt
	JMP		L_MainNormAZShow
 L_MainNormAZUn:
	CLR		R_AutoZeroCnt
 L_MainNormAZShow:									;抓零
	SZ		R_DReg_1
	JMP		L_MainNormAZEnd
	MOV		A,					R_DReg_0
	MOV		R_PubCnt_0,			A
	MOV		A,					R_SetShowMin
	SUB		A,					R_PubCnt_0
	SNZ		C										;显示0
	JMP		L_MainNormAZEnd
	CLR		R_PubReg_0								;显示归零
	SET		R_ShowPosi_F							;显示为正
 L_MainNormAZEnd:
 ;主程序/普通模式/锁定处理
 L_MainNormLock:									;锁存
	SZ		R_SetLockCnt
	JMP		$+2
	JMP		L_MainNormLockEnd
	SZ		R_ShowLock_F							;.NOT.锁存	?
	JMP		L_MainNormLocked
	CLR		R_ShowLockOFFCnt
	SNZ		R_WeigLock_F							;可以锁存 ?
	JMP		L_MainNormLockNot 
	SNZ		R_ShowPosi_F							;正 ?
	JMP		L_MainNormLockNot
	MOV		A,					R_SetShowMin
	MOV		R_PubReg_2,			A
	MOV		A,					00
	MOV		R_PubReg_3,			A	
	MOV		A,					R_PubReg_2
	SUB		A,					R_DReg_0
	MOV		A,					R_PubReg_3
	SBC		A,					R_DReg_1
	SNZ		C
	JMP		L_MainNormLockNow
 L_MainNormLockNot:
	CLR		R_ShowLockCnt
	CLR		R_ShowLockReg_0
	CLR		R_ShowLockReg_1
	JMP		L_MainNormLockEnd
 L_MainNormLockNow:
	CLR		R_LEDOFFCnt	
	SZ		R_HalfSecond_F
	INC		R_ShowLockCnt
	MOV		A,					R_ShowLockCnt		;
	SUB		A,					R_SetInLockCnt
	SNZ		C
	JMP		L_MainNormLockEnd
	CLR		R_UnStabOFFCnt
	CLR		R_ShowWord_F
	SET		R_ShowLock_F							;设锁定标志位
	MOV		A,					8
	MOV		R_LockFlashCnt,		A
	CLR		R_AutoOFFCnt
	MOV		A,					00H					;
	MOV		R_ShowLockCnt,		A
	MOV		A,					R_ShowCurrReg_L
	MOV		R_ShowLockReg_0,	A
	SUB		A,					R_Mark0M_0
	MOV		R_PubReg_2,			A
	MOV		A,					R_ShowCurrReg_H
	MOV		R_ShowLockReg_1,	A
	SBC		A,					R_Mark0M_1
	MOV		R_PubReg_3,			A
	SZ		C
	JMP		$+4
	MOV		A,					00H
	SUB		A,					R_PubReg_2
	SBC		A,					R_PubReg_3
	MOV		A,					2
	MOV		R_F24C02Cnt,		A
	MOV		A,		OFFSET		R_PubReg_2
	MOV		R_FArrayAddr_L,		A
	MOV		A,					AddrBase
	MOV		R_F24C02Addr,		A
	CLR		R_FI2CRead_F							;写操作
	CALL	B_24C02
 L_MainNormLockMagEnd:
	JMP		L_MainNormLockEnd
 L_MainNormLocked:									;已经锁定
	SZ		R_HalfSecond_F
	INC		R_ShowLockOFFCnt
	MOV		A,					R_SetLockCnt
	SUB		A,					R_ShowLockOFFCnt
	SZ		C
	JMP		L_MainNormLockEnd
	SNZ		R_SetClrLockMode_F						;为1时, 解锁不关机
	JMP		L_OFF									;时间到, 去关机. 
	CLR		R_ShowLock_F
	CLR		R_ShowLockCnt
	CLR		R_ShowLockReg_0
	CLR		R_ShowLockReg_1
	CLR		R_WeigLockOFF_F
 L_MainNormLockEnd:
 ;主程序/普通模式/清除锁定值处理
 L_MainNormClrLock:
 L_MainNormClrLockComp:								;比较
	MOV		A,					R_WeigCurrReg_L
	SUB		A,					R_Mark0M_0
	MOV		R_PubReg_2,			A
	MOV		A,					R_WeigCurrReg_H
	SBC		A,					R_Mark0M_1
	MOV		R_PubReg_3,			A
	SZ		C
	JMP		$+4
	MOV		A,					00H					;少于零多少
	SUBM	A,					R_PubReg_2
	SBCM	A,					R_PubReg_3
	CLR		C
	RRC		R_PubReg_3
	RRC		R_PubReg_2
	CLR		C
	RRC		R_PubReg_3
	RRC		R_PubReg_2
	MOV		A,					R_Mark4DReg
	SUB		A,					R_PubReg_2
	MOV		A,					00H
	SBC		A,					R_PubReg_3
	SNZ		C
	JMP		L_MainNormClrLockHigh
 L_MainNormClrLockLow:
	SET		R_WeigLockOFF_F
	SNZ		R_ShowLock_F							;显示锁定
	JMP		$+3
	SZ		R_HalfSecond_F
	INC		R_ClrLockCnt
	MOV		A,					R_SetClrLockCnt
	SUB		A,					R_ClrLockCnt
	SNZ		C
	JMP		L_MainNormClrLockClr
	JMP		L_MainNormClrLockEnd
 L_MainNormClrLockHigh:
	CLR		R_ClrLockCnt
	SNZ		R_WeigLockOFF_F
	JMP		L_MainNormClrLockEnd
 L_MainNormClrLockClr:								;清锁存
	CLR		R_ShowLock_F
	CLR		R_PowerOFFCnt
	CLR		R_ShowLockCnt
	CLR		R_ShowLockReg_0
	CLR		R_ShowLockReg_1
	CLR		R_WeigLockOFF_F
 L_MainNormClrLockEnd:
 ;主程序/普通模式/结束
 L_MainNormEnd:
	JMP		L_MainModeEnd
 ; ;主程序/设置模式/
 L_MainSet:											;判断进入测试状态
 L_MainSetEnd:
	JMP		L_MainModeEnd
 ;主程序/标定模式/开始
 L_MainCali:
	SET		R_ShowPosi_F
	CLR		R_ShowLock_F
 ;主程序/标定模式/按键处理
 L_MainCaliKey:
	SNZ		R_CaliReg.0
	JMP		$+6
	SNZ		R_FKeyCaliP_F
	JMP		$+4
	INC		R_CaliReg
	CLR		R_FKeyCaliP_F
	JMP		L_MainCaliKeyMag
	SZ		R_CaliReg.0
	JMP		$+4
	SZ		R_FKeyCaliP_F
	JMP		$+2
	INC		R_CaliReg
	CLR		R_FKeyCaliP_F
	JMP		L_MainCaliKeyEnd
 L_MainCaliKeyMag:									;新按键
	CLR		C
	RRCA	R_CaliReg
	SDZ		Acc
	JMP		$+2
	JMP		L_MainCaliKeyMag0
	SDZ		Acc
	JMP		$+2
	JMP		L_MainCaliKeyMag1
	SDZ		Acc
	JMP		$+2
	JMP		L_MainCaliKeyMag2
	JMP		L_MainCaliKeyMag3
 L_MainCaliKeyMag0:
	MOV		A,					R_ShowLast2Reg_L
	MOV		R_Mark0M_0,			A
	MOV		A,					R_ShowLast2Reg_H
	MOV		R_Mark0M_1,			A
	JMP		L_MainCaliKeyEnd
 L_MainCaliKeyMag1:
	MOV		A,					R_ShowLast2Reg_L
	MOV		R_Mark1_0,			A
	MOV		A,					R_ShowLast2Reg_H
	MOV		R_Mark1_1,			A
	SZ		R_SetMarkMode_F
	JMP		L_MainCaliKeyEnd
 L_MainCaliKeyMag1SP:								;一段标定的特殊处理
	MOV		A,					R_ShowLast2Reg_L
	SUB		A,					R_Mark0M_0
	MOV		R_PubReg_0,			A
	MOV		A,					R_ShowLast2Reg_H
	SBC		A,					R_Mark0M_1
	MOV		R_PubReg_1,			A
	SNZ		C
	JMP		L_MainCaliKeyErr2						;重新读基准
	AND		A,					11111110B
	SNZ		Z
	JMP		$+2
	JMP		L_MainCaliKeyErr2						;差太小,出错
 L_MainCaliKeyMag1SPDiv3:							;除3
	CLR		R_Mark1_0
	CLR		R_Mark1_1
	CLR		R_PubCnt_0
 L_MainCaliKeyMag1SPDiv3Loop:
	MOV		A,					R_PubReg_0
	SUB		A,					03
	MOV		R_PubReg_0,			A
	MOV		A,					R_PubReg_1
	SBC		A,					R_PubCnt_0
	MOV		R_PubReg_1,			A
	SNZ		C
	JMP		L_MainCaliKeyMag1SPMOV
	SIZ		R_Mark1_0
	JMP		L_MainCaliKeyMag1SPDiv3Loop
	SIZ		R_Mark1_1
	JMP		L_MainCaliKeyMag1SPDiv3Loop
 L_MainCaliKeyMag1SPMOV:
	MOV		A,					R_Mark1_0
	MOV		R_Mark2_0,			A
	MOV		R_Mark3_0,			A
	MOV		A,					R_Mark1_1
	MOV		R_Mark2_1,			A
	MOV		R_Mark3_1,			A
	JMP		L_MainCaliKeyWriteSP
 L_MainCaliKeyMag2:
	MOV		A,					R_ShowLast2Reg_L
	MOV		R_Mark2_0,			A
	MOV		A,					R_ShowLast2Reg_H
	MOV		R_Mark2_1,			A
	JMP		L_MainCaliKeyEnd
 L_MainCaliKeyMag3:
	MOV		A,					R_ShowLast2Reg_L
	MOV		R_Mark3_0,			A
	MOV		A,					R_ShowLast2Reg_H
	MOV		R_Mark3_1,			A
	JMP		L_MainCaliKeyChk
 L_MainCaliKeyChk:									;检查值是否出错
	MOV		A,					R_Mark3_0
	SUB		A,					R_Mark2_0
	MOV		R_PubReg_0,			A
	MOV		A,					R_Mark3_1
	SBC		A,					R_Mark2_1

⌨️ 快捷键说明

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