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

📄 scale.asm

📁 基于holtek MCU 的电子秤源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	CALL	B_24C02
	JMP		L_InitReadSetEnd
 L_InitReadSetEnd:

 ;初始化/工厂测试之特别处理
 L_InitTestSP:
	SZ		R_ModeCali_F
	JMP		L_InitEnd								;由工厂测试过来的,不读存贮器,不看低电.

 ;初始化/读标定值
 L_InitReadMark:									;读基准
 	MOV		A,					9
	MOV		R_F24C02Cnt,		A
	MOV		A,		OFFSET 		R_Mark0M_0
	MOV		R_FArrayAddr_L,		A
	MOV		A,					Addr0M_0
	MOV		R_F24C02Addr,		A
	SET		R_FI2CRead_F							;读操作
	CALL	B_24C02
	SNZ		R_FI2CErr_F
	JMP		L_InitReadMarkEnd
 L_InitReadMarkErr1:								;显示'Err1'
	MOV		A,					LOW	TabLCDErr1
	JMP		L_OFFDelay								;去显示,延时3秒,关机的入口.
 L_InitReadMarkEnd:
	MOV		A,					R_Mark0M_0
	MOV		R_WeigCurrReg_L,	A
	MOV		A,					R_Mark0M_1
	MOV		R_WeigCurrReg_H,	A

 ;初始化/结束
 L_InitEnd:
	MOV		A,					D_TMR1LCnt
	MOV		TMR1L,				A
	MOV		A,					D_TMR1HCnt
	MOV		TMR1H,				A
	SET		ADDISCH0								;充电
	CLR		ADDISCH1
	SET		T1ON									;启动定时器1
	CLR		T1F
	MOV		A,					R_SetWarmUpCnt
	MOV		R_WarmUpCnt,		A

 ;主程序/开始
 L_Main:											;主程序开始
 	CLR		WDT
	SET		EMI

 ;主程序/读单位处理
 L_MainUnit:										;称重单位
	SNZ		R_SetUnitMode_F
	JMP		L_MainUnitJump
 L_MainUnitKey:										;按键
	SNZ		R_MainLoopCnt.0
	JMP		L_MainUnitEnd
	SZ		P_KeyUnit_F
	JMP		L_MainUnitEnd
	CLR		R_AutoOffCnt
	CLR		R_LEDOFFCnt
	CLR		C
	RLC		R_UnitFlag
	SNZ		R_UnitFlag.3
	JMP		$+3
	MOV		A,					01
	MOV		R_UnitFlag,			A
	MOV		A,					1
	MOV		R_F24C02Cnt,		A
	MOV		A,		OFFSET		R_UnitFlag
	MOV		R_FArrayAddr_L,		A
	MOV		A,					AddrUnit
	MOV		R_F24C02Addr,		A	
	CLR		R_FI2CRead_F							;写操作
	CALL	B_24C02
	JMP		L_MainUnitEnd
 L_MainUnitJump:									;拨动开关
	CLR		P_UnitGND
	CLR		R_UnitFlag
	SNZ		P_UnitKG_F								;.NOT.	KG?
	SET		R_UnitKG_F
	SNZ		P_UnitLB_F								;.NOT.	LB?
	SET		R_UnitLB_F
	SZ		R_UnitFlag
	JMP		$+2
	SET		R_UnitST_F								;默认为ST
 L_MainUnitEnd:
 ;主程序/读ADC输出处理
 L_MainADC:
 L_MainADC_Init:
	MOV		A,					00
	MOV		R_PubReg_0,			A
	MOV		R_PubReg_1,			A
	MOV		R_PubReg_2,			A
	MOV		R_PubReg_3,			A
L_MainADCCharge:									;充电
	CLR		TMR1L
	CLR		TMR1H
	CLR		WDT
	SNZ		T1F										;是否够100mS?
	JMP		$-2
L_MainADCDischarge:									;放电
	CLR		ADDISCH0								;放电
	SET		ADDISCH1
	MOV		A,					10000010B			;2分频改为4分频
	MOV		TMR1C,				A
	SET		T1ON									;开定时器1
	CLR		T1F
	CLR		WDT
	SZ		ADCMP0									;斜线升到顶,就为1,降到底就为0
	JMP		$-2
	CLR		T1ON									;关定时器1
	MOV		A,					10000001B			;4分频改为2分频
	MOV		TMR1C,				A
	MOV		A,					TMR1H
	MOV		R_PubReg_1,			A
	MOV		A,					TMR1L
	MOV		R_PubReg_0,			A
	MOV		A,					D_TMR1LCnt
	MOV		TMR1L,				A
	MOV		A,					D_TMR1HCnt
	MOV		TMR1H,				A
	SET		ADDISCH0								;充电
	CLR		ADDISCH1
	SET		T1ON									;开定时器1
	CLR		T1F
	MOV		A,					R_PubReg_0
	MOV		R_WeigCurrReg_L,	A
	MOV		A,					R_PubReg_1
	MOV		R_WeigCurrReg_H,	A
 L_MainADCEnd:
 ;主程序/ADC输出滤波处理
 L_MainFil:											;滑动平均滤波
 L_MainFilMag:
	CLR		R_WeigStab_F
	CLR		R_WeigLock_F
	SZ		R_WeigCurrReg_H							;00H有其它含义,
	JMP		L_MainFilDiffrenc						;如果有00H,置为01H
	SZ		R_WeigCurrReg_L
	JMP		L_MainFilDiffrenc
	SET		R_WeigCurrReg_L.0
 L_MainFilDiffrenc:									;求本轮值与上轮显示值之差
	MOV		A,					R_WeigCurrReg_L
	SUB		A,					R_ShowLast1Reg_L
	MOV		R_PubReg_0,			A
	MOV		A,					R_WeigCurrReg_H
	SBC		A,					R_ShowLast1Reg_H
	MOV		R_PubReg_1,			A
	SZ		C
	JMP		$+4
	MOV		A,					00H					;得绝对值
	SUBM	A,					R_PubReg_0
	SBCM	A,					R_PubReg_1
	MOV		A,					R_Mark4DReg			;稳定与否门限值32D
	MOV		R_PubReg_2,			A
	CLR		R_PubReg_3
	CLR		C
	RLC		R_PubReg_2
	RLC		R_PubReg_3
	CLR		C
	RLC		R_PubReg_2
	RLC		R_PubReg_3
	CLR		C
	RLC		R_PubReg_2
	RLC		R_PubReg_3
	MOV		A,					R_PubReg_2
	SUB		A,					R_PubReg_0
	MOV		A,					R_PubReg_3
	SBC		A,					R_PubReg_1
	SNZ		C
	JMP		L_MainFilUnStable						;不稳定
	SET		R_WeigStab_F							;设稳定标志位
	JMP		L_MainFilStable							;稳定
 L_MainFilUnStable:									;不稳定时不显示新的值
	CLR		R_AutoZeroCnt
	CLR		R_ShowLockCnt
	CLR		R_AutoOFFCnt
	CLR		R_LEDOFFCnt	
	SZ		R_ShowLock_F
	JMP		$+5
	CLR		R_ShowLockCnt							;不锁存
	CLR		R_ShowLockOFFCnt
	CLR		R_ShowLockReg_0
	CLR		R_ShowLockReg_1
	MOV		A,					R_WeigCurrReg_L		;立即显示
	MOV		R_WeigFilReg_20,	A
	MOV		R_WeigFilReg_10,	A
	MOV		R_WeigFilReg_00,	A
	MOV		A,					R_WeigCurrReg_H
	MOV		R_WeigFilReg_21,	A
	MOV		R_WeigFilReg_11,	A
	MOV		R_WeigFilReg_01,	A
	JMP		L_MainFilAverage
 L_MainFilStable:
	SET		R_WeigLock_F
 ;	MOV		A,					R_PubReg_0
 ;	AND		A,					11100000B			;2,0.03KG
 ;	SNZ		Z
 ;	JMP		$+2
 ;	SET		R_VeryStab_F
 L_MainFilAverage:									;求平均值
	CLR		R_PubReg_0
	CLR		R_PubReg_1
	CLR		R_PubReg_2
	MOV		A,					4
	MOV		R_PubCnt_0,			A
	MOV		A,					OFFSET	R_WeigCurrReg_L
	MOV		MP0,				A
 L_MainFilAverageLoop:
	MOV		A,					R0
	ADDM	A,					R_PubReg_0
	INC		MP0
	MOV		A,					R0
	ADCM	A,					R_PubReg_1
	INC		MP0
	MOV		A,					00H
	ADCM	A,					R_PubReg_2
	SDZ		R_PubCnt_0
	JMP		L_MainFilAverageLoop
	CLR		C
	RRC		R_PubReg_2
	RRC		R_PubReg_1
	RRC		R_PubReg_0
	CLR		C
	RRC		R_PubReg_2
	RRC		R_PubReg_1
	RRC		R_PubReg_0
 L_MainFilSlip:										;滑动
	MOV		A,					R_WeigFilReg_10		;1->2
	MOV		R_WeigFilReg_20,	A
	MOV		A,					R_WeigFilReg_11
	MOV		R_WeigFilReg_21,	A
	MOV		A,					R_WeigFilReg_00		;0->1
	MOV		R_WeigFilReg_10,	A
	MOV		A,					R_WeigFilReg_01
	MOV		R_WeigFilReg_11,	A
	MOV		A,					R_WeigCurrReg_L		;Current->0
	MOV		R_WeigFilReg_00,	A
	MOV		A,					R_WeigCurrReg_H
	MOV		R_WeigFilReg_01,	A
 L_MainFilMov:										;保留求得的平均值
	MOV		A,					R_ShowLast1Reg_L
	MOV		R_ShowLast2Reg_L,	A
	MOV		A,					R_ShowLast1Reg_H
	MOV		R_ShowLast2Reg_H,	A
	MOV		A,					R_PubReg_0			;自动归零用
	MOV		R_ShowCurrReg_L,	A
	MOV		R_ShowLast1Reg_L,	A
	MOV		A,					R_PubReg_1
	MOV		R_ShowCurrReg_H,	A
	MOV		R_ShowLast1Reg_H,	A
 L_MainFilEnd:
 ;主程序/模式选择
 L_MainMode:										;模式选择
	CALL	B_ReadKey								;读按键
	SZ		R_ModeNormaL_F
	JMP		L_MainNorm
	CLR		R_AutoOFFCnt							;不自动关机
	SZ		R_ModeSet_F
	JMP		L_MainSet
	SZ		R_ModeCali_F
	JMP		L_MainCali
	CLR		R_ModeFlag
	SET		R_ModeNormaL_F
	JMP		L_MainNorm
 ;主程序/普通模式/开始
 L_MainNorm:
 L_MainNormKey:
	SNZ		P_KeyCali_F
	JMP		L_InitTest

 ;预热处理
 L_MainNormWarmUp:
	SZ		R_WarmUpCnt								;预热时跳开此部份
	JMP		$+2
	JMP		L_MainNormWarmUpEnd
 L_MainNormWarmUpZero:
	CLR		R_AutoOFFCnt
	SZ		R_HalfSecond_F
	DEC		R_WarmUpCnt
	SZ		R_WarmUpCnt
	JMP		$+2
	JMP		L_MainNormWarmUpZeroChk
	MOV		A,					R_SetWarmUpCnt
	SNZ		R_WeigStab_F							;不稳定 ?
	MOV		R_WarmUpCnt,		A
	CALL	B_ClrLCDReg
	SET		R_ShowWord_F
	SZ		R_SetWarmUpMode_F
	JMP		L_MainNormWarmUpZeroALL
 L_MainNormWarmUpZeroShift:
	MOV		A,					R_MainLoopCnt
	MOV		R_PubCnt_0,			A
	CLR		C
	RRC		R_PubCnt_0								;4次移'8'一下
	CLR		C
	RRC		R_PubCnt_0
	MOV		A,					R_PubCnt_0
	SUB		A,					03
	MOV		A,					03
	SZ		C
	MOV		R_PubCnt_0,			A
	MOV		A,					OFFSET	R_LCDReg_3
	SUB		A,					R_PubCnt_0
	MOV		MP0,				A
	MOV		A,					08
	MOV		R0,					A
	JMP		L_MainNormEnd
 L_MainNormWarmUpZeroALL:
	MOV		A,					0BH
	MOV		R_PubCnt_0,			A
	MOV		A,					40H
	MOV		MP1,				A
	MOV		A,					0FH
	MOV		R1,					A
	INC		MP1
	SDZ		R_PubCnt_0
	JMP		$-4
	MOV		A,					0FH
	MOV		R1,					A
	JMP		L_MainEnd
 L_MainNormWarmUpZeroChk:
 ;	CLR	R_VeryStab_F
	CLR		R_AutoOFFCnt							;自动关机重新计时
 L_MainNormWarmUpZeroWrit:
	MOV		A,					R_ShowLast1Reg_L
	MOV		R_Mark0M_0,			A
	MOV		A,					R_ShowLast1Reg_H
	MOV		R_Mark0M_1,			A
 L_MainNormWarmUpEnd:
 ;  LED控制
 L_MainNormLED:										;  LED控制
	SZ		R_HalfSecond_F
	INC		R_LEDOFFCnt
	MOV		A,					10
	SUB		A,					R_LEDOFFCnt
	SNZ		C
	JMP		L_MainNormLEDOff
 L_MainNormLEDOn:
	SET		P_LED_F									;  点背光
 	JMP		L_MainNormLEDEnd
 L_MainNormLEDOff:
	MOV		A,					11
	MOV		R_LEDOFFCnt,		A
	CLR		P_LED_F									;  灭背光
 L_MainNormLEDEnd:

 ;主程序/普通模式/记忆值处理
 L_MainNormMemory:									;锁存
	MOV		A,					2
	MOV		R_F24C02Cnt,		A
	MOV		A,		OFFSET		R_LockData_L
	MOV		R_FArrayAddr_L,		A
	MOV		A,					AddrBase
	MOV		R_F24C02Addr,		A
	SET		R_FI2CRead_F							;读操作
	CALL	B_24C02
 L_MainNormMemorySub:
	MOV		A,					R_ShowCurrReg_L
	SUB		A,					R_Mark0M_0
	MOV		R_PubReg_2,			A
	MOV		A,					R_ShowCurrReg_H
	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,					R_PubReg_2
	SUB		A,					R_LockData_L
	MOV		R_PubReg_2,			A
	MOV		A,					R_PubReg_3
	SBC		A,					R_LockData_H
	MOV		R_PubReg_3,			A
	SZ		C
	JMP		$+4
	MOV		A,					00H
	SUBM	A,					R_PubReg_2
	SBCM	A,					R_PubReg_3
 L_MainNormMemorySubChec:							;欺瞒的范围
	SZ		R_PubReg_3
	JMP		L_MainNormMemoryEnd						;新的值
	SZ		R_SetMemoryRange						;为零时,不记忆.
	JMP		$+2
	JMP		L_MainNormMemoryEnd						;新的值
	CLR		C
	MOV		A,					R_SetMemoryRange
	MOV		R_PubCnt_0,			A
	CLR		R_PubCnt_1
	CLR		R_PubCnt_2
	MOV		A,					R_Mark4DReg
	ADDM	A,					R_PubCnt_1
	MOV		A,					00
	ADCM	A,					R_PubCnt_2
	SDZ		R_PubCnt_0
	JMP		$-5
	CLR		C
	RRC		R_PubCnt_2
	RRC		R_PubCnt_1
	CLR		C
	RRC		R_PubCnt_2
	RRC		R_PubCnt_1
	MOV		A,					R_PubCnt_1
	SUB		A,					R_PubReg_2
	SNZ		C
	JMP		L_MainNormMemoryEnd						;新的值
	MOV		A,					R_LockData_L
	ADD		A,					R_Mark0M_0
	MOV		R_ShowCurrReg_L,	A
	MOV		A,					R_LockData_H
	ADC		A,					R_Mark0M_1
	MOV		R_ShowCurrReg_H,	A
 L_MainNormMemoryEnd:
 ;主程序/普通模式/计算重量处理
 L_MainNormCalc:									;计算
	SNZ		R_ShowLock_F
	JMP		$+5
	MOV		A,					R_ShowLockReg_0
	MOV		R_ShowCurrReg_L,	A
	MOV		A,					R_ShowLockReg_1
	MOV		R_ShowCurrReg_H,	A
	SET		R_ShowPosi_F							;显示重量先置为正
	CLR		R_PubCnt_0								;00->标准单位,01->实际单位
  L_MainNormCalcLoop1:
	MOV		A,					040H				;4*400=1600=0640H
	MOV		R_PubReg_2,			A					;乘4,以便四舍五入
	MOV		A,					06H
	MOV		R_PubReg_3,			A
	SNZ		R_PubCnt_0.0
	JMP		L_MainNormCalcLoop2						;第一次计算?
	SNZ		R_UnitLB_F								;LB ?
	JMP		$+5
	MOV		A,					0E4H				;4*400*2.204623/2=1764=06E4H
	MOV		R_PubReg_2,			A					;乘2,以便四舍五入
	MOV		A,					06H
	MOV		R_PubReg_3,			A
	SNZ		R_UnitST_F								;ST ?
	JMP		$+5
	MOV		A,					083H				;4*40*2.204623*4=1411=0583H
	MOV		R_PubReg_2,			A					;乘4,以便四舍五入
	MOV		A,					05H
	MOV		R_PubReg_3,			A
  L_MainNormCalcLoop2:
	SNZ		R_SetMarkWeig_F							;50KG
	JMP		L_MainNormCalcRang
 L_MainNormCalc50:									;计算
	MOV		A,					0D0H				;4*500=2000=07D0H
	MOV		R_PubReg_2,			A					;乘4,以便四舍五入
	MOV		A,					07H
	MOV		R_PubReg_3,			A
	SNZ		R_PubCnt_0.0
	JMP		L_MainNormCalcRang						;第一次计算?
	SNZ		R_UnitLB_F								;LB ?
	JMP		$+5
	MOV		A,					09DH				;4*500*2.204623/2=2205=089DH
	MOV		R_PubReg_2,			A					;乘2,以便四舍五入
	MOV		A,					08H
	MOV		R_PubReg_3,			A
	SNZ		R_UnitST_F								;ST ?
	JMP		$+5
	MOV		A,					0E4H				;4*50*2.204623*4=1764=06E4H
	MOV		R_PubReg_2,			A					;乘4,以便四舍五入
	MOV		A,					06H
	MOV		R_PubReg_3,			A
 L_MainNormCalcRang:
	CALL	B_InitCalc
	MOV		A,					R_PubReg_2
	MOV		R_FCalcMuL_0,		A
	MOV		A,					R_PubReg_3
	MOV		R_FCalcMuL_1,		A
	MOV		A,					R_ShowCurrReg_L		;<0?
	SUB		A,					R_Mark0M_0
	MOV		R_PubReg_0,			A
	MOV		A,					R_ShowCurrReg_H
	SBC		A,					R_Mark0M_1
	MOV		R_PubReg_1,			A

⌨️ 快捷键说明

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