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

📄 scale.asm

📁 基于holtek MCU 的电子秤源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	MOV		R_PubReg_1,			A
	SNZ		C
	JMP		L_MainCaliKeyErr2						;80>120,重新读基准
	AND		A,					11111110B
	SNZ		Z
	JMP		$+2
	JMP		L_MainCaliKeyErr2						;差太小,出错
	MOV		A,					R_Mark2_0
	SUB		A,					R_Mark1_0
	MOV		R_PubReg_0,			A
	MOV		A,					R_Mark2_1
	SBC		A,					R_Mark1_1
	MOV		R_PubReg_1,			A
	SNZ		C
	JMP		L_MainCaliKeyErr2						;40>80,重新读基准
	AND		A,					11111110B
	SNZ		Z
	JMP		$+2
	JMP		L_MainCaliKeyErr2						;差太小,出错
	MOV		A,					R_Mark1_0
	SUB		A,					R_Mark0M_0
	MOV		R_PubReg_0,			A
	MOV		A,					R_Mark1_1
	SBC		A,					R_Mark0M_1
	MOV		R_PubReg_1,			A
	SNZ		C
	JMP		L_MainCaliKeyErr2						;0>40,重新读基准
	AND		A,					11111110B
	SNZ		Z
	JMP		$+2
	JMP		L_MainCaliKeyErr2						;差太小,出错
	MOV		A,					R_Mark0M_1
	SNZ		Z
	JMP		L_MainCaliKeyWrite
	MOV		A,					R_Mark0M_0
	AND		A,					11111110B
	SNZ		Z
	JMP		L_MainCaliKeyWrite
 L_MainCaliKeyErr2:									;标定值错误
	MOV		A,					LOW	TabLCDErr2		;显示'Err2',表示重量正溢出
	CALL	B_ReadWord	
	CALL	B_LCD
	CALL	B_Delay2000mS
	CLR		R_ModeFlag
	SET		R_ModeCali_F							;
	MOV		A,					00H
	MOV		R_CaliReg,			A
	JMP		L_OFF									;去关机
 L_MainCaliKeyWrite:								;Write2402
	MOV		A,					R_Mark3_0
	SUB		A,					R_Mark2_0
	MOV		R_Mark3_0,			A
	MOV		A,					R_Mark3_1
	SBC		A,					R_Mark2_1
	MOV		R_Mark3_1,			A
	MOV		A,					R_Mark2_0
	SUB		A,					R_Mark1_0
	MOV		R_Mark2_0,			A
	MOV		A,					R_Mark2_1
	SBC		A,					R_Mark1_1
	MOV		R_Mark2_1,			A
	MOV		A,					R_Mark1_0
	SUB		A,					R_Mark0M_0
	MOV		R_Mark1_0,			A
	MOV		A,					R_Mark1_1
	SBC		A,					R_Mark0M_1
	MOV		R_Mark1_1,			A
 L_MainCaliKeyWriteSP:								;一段标定的入口
	CALL	B_InitCalc
	MOV		A,					R_Mark1_0
	MOV		R_FCalcIn_0,		A
	MOV		A,					R_Mark1_1
	MOV		R_FCalcIn_1,		A
	MOV		A,					100
	SZ		R_SetMarkWeig_F							;50KG
	MOV		A,					125
	MOV		R_FCalcDiv_0,		A
	CALL	B_Calc
	SZ		R_FCalcOut_1
	JMP		L_MainCaliKeyErr2
	MOV		A,					R_FCalcOut_0
	MOV		R_Mark4DReg,		A
	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
	CLR		R_FI2CRead_F							;写操作
	CALL	B_24C02
	SZ		R_FI2CErr_F
	JMP		L_MainCaliKeyErr1
  L_MainCaliKeyWriteClr:							;把记忆值清除
	CLR		R_PubCnt_0
	CLR		R_PubCnt_1
	MOV		A,					2
	MOV		R_F24C02Cnt,		A
	MOV		A,		OFFSET		R_PubCnt_0
	MOV		R_FArrayAddr_L,		A
	MOV		A,					AddrBase
	MOV		R_F24C02Addr,		A
	CLR		R_FI2CRead_F							;写操作
	CALL	B_24C02
 L_MainCaliKeyFinish:								;显示'PASS'
	MOV		A,					LOW	TabLCDPASS
	CALL	B_ReadWord
	CALL	B_LCD
	CALL	B_Delay2000mS
	JMP		L_OFF									;去关机
 L_MainCaliKeyErr1:									;写2402出错
	MOV		A,					LOW	TabLCDErr1		;显示'Err '
	JMP		L_OFFDelay								;去显示,延时3秒,关机的入口.
 L_MainCaliKeyEnd:
 ;主程序/标定模式/显示内容
 L_MainCaliWord:									;显示提示
	SET		R_ShowWord_F
	SZ		R_CaliReg.0
	JMP		L_MainCaliWordCode
	SET		R_CaliDelay_F
	MOV		A,					LOW	TabLCDEmpty
	MOV		R_LCDReg_0,			A
	MOV		R_LCDReg_3,			A
	CLR		R_LCDReg_1
	MOV		A,					R_CaliReg
	MOV		R_PubReg_2,					A
	CLR		C
	RRC		R_PubReg_2
	MOV		A,					R_PubReg_2
	SDZ		Acc
	JMP		$+2
	JMP		L_MainCaliWord1
	SDZ		Acc
	JMP		L_MainCaliWord3
	JMP		L_MainCaliWord2
 L_MainCaliWord1:
	MOV		A,					04					;'40 '
	SZ		R_SetMarkWeig_F
	MOV		A,					05					;'50 '
	MOV		R_LCDReg_2,			A
	JMP		L_MainCaliWordLoop
 L_MainCaliWord2:
	MOV		A,					08					;'80 '
	SZ		R_SetMarkWeig_F
	MOV		A,					00					;'100 '
	MOV		R_LCDReg_2,			A
	MOV		A,					01
	SZ		R_SetMarkWeig_F
	MOV		R_LCDReg_3,			A
	JMP		L_MainCaliWordLoop
 L_MainCaliWord3:
	MOV		A,					02					;'120 '
	SZ		R_SetMarkWeig_F
	MOV		A,					05					;'150 '
	MOV		R_LCDReg_2,			A
	MOV		A,					01
	MOV		R_LCDReg_3,			A
 L_MainCaliWordLoop:
	CLR		R_LCDFlag
	SET		R_ShowWord_F
	SZ		R_SetMarkMode_F
	JMP		L_MainCaliWordEnd
	MOV		A,					02
	SUB		A,					R_CaliReg
	SNZ		Z
	JMP		L_MainCaliWordEnd
	MOV		A,					LOW	TabLCDEmpty
	MOV		R_LCDReg_0,			A
	CLR		R_LCDReg_1
	MOV		A,					02					;'120 '
	MOV		R_LCDReg_2,			A
	MOV		A,					01
	MOV		R_LCDReg_3,			A
	SNZ	R_SetMarkWeig_F
	JMP		L_MainCaliWordEnd
	MOV		A,					05					;'150 '
	MOV		R_LCDReg_2,			A
	MOV		A,					01
	MOV		R_LCDReg_3,			A
	JMP		L_MainCaliWordEnd
 L_MainCaliWordCode:								;显示内码
	MOV		A,					R_WeigFilReg_20
	MOV		R_PubReg_0,			A
	MOV		A,					R_WeigFilReg_21
	MOV		R_PubReg_1,			A
	CLR		C
	RRC		R_PubReg_1
	RRC		R_PubReg_0
	CLR		C
	RRC		R_PubReg_1
	RRC		R_PubReg_0
	CLR		C
	RRC		R_PubReg_1
	RRC		R_PubReg_0
 L_MainCaliWordEnd:
 ;主程序/标定模式/显示
 L_MainCaliShow:
	SNZ		R_CaliReg.0
	JMP		L_MainCaliShowEnd
	CALL	B_ClrLCDReg								;清显示
 L_MainCaliShowHex2Deci:							;十六进制到十进制
	MOV		A,					R_PubReg_0
	MOV		R_F2Hex2DeciIn_0,	A
	MOV		A,					R_PubReg_1
	MOV		R_F2Hex2DeciIn_1,	A
	CALL	B_2Hex2Deci
	MOV		A,					R_F2Hex2DeciOut_0
	MOV		R_PubReg_0,			A
	MOV		A,					R_F2Hex2DeciOut_1
	MOV		R_PubReg_1,			A
	MOV		A,					R_F2Hex2DeciOut_2
 L_MainCaliShowReadTab:
	MOV		A,					R_PubReg_0			;取个位
	AND		A,					00001111B
	MOV		R_LCDReg_0,			A
	SWAPA	R_PubReg_0								;取拾位
	AND		A,					00001111B
	MOV		R_LCDReg_1,			A
	MOV		A,					R_PubReg_1			;取佰位
	AND		A,					00001111B
	MOV		R_LCDReg_2,			A
	SWAPA	R_PubReg_1								;取仟位
	AND		A,					00001111B
	MOV		R_LCDReg_3,			A
 L_MainCaliShowEnd:
 ;主程序/标定模式/结束
 L_MainCaliEnd:
 ;主程序/模式/结束
 L_MainModeEnd:
 ;主程序/显示处理
 L_MainShow:										;显示重量
	SZ		R_ShowWord_F							;.NOT.	显示提示
	JMP		L_MainShowLCD
	CALL	B_ClrLCDReg								;清显示
 L_MainShowLock:									;锁存
	SNZ		R_ModeNormaL_F							;正常模式 ?
	JMP		L_MainShowCalc
	SNZ		R_ShowLock_F							;锁存 ?
	JMP		L_MainShowUnLock
	SET		R_ShowPosi_F							;正
	JMP		L_MainShowCalc
 L_MainShowUnLock:									;没锁存
	CLR		R_ClrLockCnt
 L_MainShowCalc:									;十六进制到十进制
	SZ		R_UnitST_F
	JMP		L_MainShowCalcST
	MOV		A,					R_PubReg_0
	MOV		R_F2Hex2DeciIn_0,	A
	MOV		A,					R_PubReg_1
	MOV		R_F2Hex2DeciIn_1,	A
	CALL	B_2Hex2Deci
	MOV		A,					R_F2Hex2DeciOut_0
	MOV		R_PubReg_0,			A
	MOV		A,					R_F2Hex2DeciOut_1
	MOV		R_PubReg_1,			A
 L_MainShowReadTab:
	MOV		A,					R_PubReg_0			;取个位
	AND		A,					00001111B
	MOV		R_LCDReg_0,			A
	SWAPA	R_PubReg_0								;取拾位
	AND		A,					00001111B
	MOV		R_LCDReg_1,			A
	MOV		A,					R_PubReg_1			;取佰位
	AND		A,					00001111B
	MOV		R_LCDReg_2,			A
	SWAPA	R_PubReg_1								;取仟位
	AND		A,					00001111B
	MOV		R_LCDReg_3,			A
 L_MainShowClearZero:								;清除'0'
	SZ		R_LCDReg_3								;仟位
	JMP		L_MainShowWriteLCD
	MOV		A,					LOW TabLCDEmpty
	MOV		R_LCDReg_3,			A
	SZ		R_LCDReg_2								;佰位
	JMP		L_MainShowWriteLCD
	MOV		A,					LOW	TabLCDEmpty
	MOV		R_LCDReg_2,			A
	JMP		L_MainShowWriteLCD
 L_MainShowCalcST:
	MOV		A,					R_PubReg_0
	AND		A,					00000011B
	MOV		R_LCDReg_0,			A
	CLR		C
	RRC		R_PubReg_1
	RRC		R_PubReg_0
	CLR		C
	RRC		R_PubReg_1
	RRC		R_PubReg_0
	CLR		R_PubCnt_0
 L_MainShowCalcSTLoop:
	MOV		A,					R_PubReg_0
	SUB		A,					14
	MOV		R_PubReg_0,			A
	CLR		R_PubReg_2
	MOV		A,					R_PubReg_1
	SBC		A,					R_PubReg_2
	MOV		R_PubReg_1,			A
	SNZ		C
	JMP		$+3
	INC		R_PubCnt_0
	JMP		L_MainShowCalcSTLoop
	MOV		A,					14
	ADDM	A,					R_PubReg_0
	MOV		A,					R_PubReg_0
	MOV		R_F2Hex2DeciIn_0,	A
	CLR		R_F2Hex2DeciIn_1
	CALL	B_2Hex2Deci
	MOV		A,					R_F2Hex2DeciOut_0
	AND		A,					00001111B
	MOV		R_LCDReg_0,		A
	SWAPA	R_F2Hex2DeciOut_0
	AND		A,					00001111B
	MOV		R_LCDReg_1,			A
	MOV		A,					R_PubCnt_0
	MOV		R_F2Hex2DeciIn_0,	A
	CLR		R_F2Hex2DeciIn_1
	CALL	B_2Hex2Deci
	MOV		A,					R_F2Hex2DeciOut_0
	AND		A,					00001111B
	MOV		R_LCDReg_2,			A
	SWAPA	R_F2Hex2DeciOut_0
	AND		A,					00001111B
	MOV		R_LCDReg_3,			A
 L_MainShowCalcSTClearZero:							;清除'0'
	SZ		R_LCDReg_3
	JMP		$+3
	MOV		A,					LOW	TabLCDEmpty
	MOV		R_LCDReg_3,			A
	SZ		R_LCDReg_1
	JMP		$+3
	MOV		A,					LOW	TabLCDEmpty
	MOV		R_LCDReg_1,			A
 L_MainShowWriteLCD:
	CLR		R_LCDFlag
	SZ		R_ShowPosi_F
	JMP		$+3
	MOV		A,					LOW	TabLCDNega		;显示负号
	MOV		R_LCDReg_3,			A
 L_MainShowWriteLCDPoin:
	SNZ		R_UnitKG_F								;KG ?
	JMP		$+3
	SET		R_LCDP1_F								;P1
	SET		R_LCDKG_F								;'KG'
	SNZ		R_UnitLB_F								;LB ?
	JMP		$+3
	SET		R_LCDP1_F								;P1
	SET		R_LCDLB_F								;'KG'
	SNZ		R_UnitST_F								;ST ?
	JMP		$+3
	SET		R_LCDST_F								;'ST'
	SET		R_LCDCOL_F
	JMP		L_MainShowLCD
 L_MainShowLCD:
 ;	SZ		R_WeigLow_F								;.NOT. 重量很小 ?
 ;	JMP		L_MainShowLCDDo
	SNZ		R_ShowLock_F							;锁存 ?
	JMP		L_MainShowLCDDo
	SZ		R_LockFlashCnt
	JMP		$+2
	JMP		L_MainShowLCDDo
	DEC		R_LockFlashCnt
	SNZ		R_LockFlashCnt.1
	JMP		L_MainShowLCDDo
	CLR		R_LCDFlag
	MOV		A,					TabLCDEmpty
	MOV		R_LCDReg_0,			A
	MOV		R_LCDReg_1,			A
	MOV		R_LCDReg_2,			A
	MOV		R_LCDReg_3,			A
 L_MainShowLCDDo:
	CALL	B_LCD
 L_MainShowEnd:
 ;主程序/电池检测
 L_MainBatter:										;低电显示
	MOV		A,					R_MainLoopCnt
	AND		A,					00001100B
	SNZ		Z
	JMP		L_MainBatterEnd
	SNZ		LVDO									;低电?
	JMP		L_MainBatterEnd
	MOV		A,					LOW	TabLCDPL		;显示' PL ',表示低电.
	CALL	B_ReadWord
	CALL	B_LCD
 L_MainBatterEnd:
 ;主程序/自动关机
 L_MainAutoOFF:										;自动关机
	SNZ		R_ModeNormaL_F							;称重才关机
	JMP		L_MainAutoOFFEnd
	SZ		R_ShowLock_F							;锁定时不关机
	JMP		L_MainAutoOFFEnd
	SZ		R_HalfSecond_F
	INC		R_AutoOFFCnt
	SIZA	R_SetOFFCnt								;为FF则不关机.
	JMP		$+2
	JMP		L_MainAutoOFFEnd
	MOV		A,					R_SetOFFCnt
	SUB		A,					R_AutoOFFCnt
	SNZ		C
	JMP		L_OFF									;去关机. 
 L_MainAutoOFFEnd:
 ;主程序/结束
 L_MainEnd:
	SNZ		R_CaliDelay_F
	JMP		$+6
	CALL	B_Delay100mS
	CALL	B_Delay100mS
	CALL	B_Delay100mS
	CALL	B_Delay100mS
	CALL	B_Delay100mS
	CLR		R_CaliDelay_F
	INC		R_MainLoopCnt
	SNZ		R_HalfSecond_F
	JMP		$+4
	SIZ		R_PowerOFFCnt
	JMP		$+2
	JMP		L_OFF
	CLR		R_HalfSecond_F
	SZ		R_FHalfSecond_F
	SET		R_HalfSecond_F
	CLR		R_FHalfSecond_F
	CLR		R_ShowWord_F
	JMP		L_Main

 ;=============================================================================
	
 ;==============================================<<<<<<<<<<<<<<子程序

 ;=============================================================================
 L_OFF:												;关机
	JMP		L_OFFLCD
 L_OFFDelay:										;显示延时2秒,关机的入口
	CALL	B_ReadWord
	CALL	B_LCD
	CALL	B_Delay2000mS
 L_OFFLCD:
	CALL	B_ClrLCD								;清空LCD的RAM
 L_OFFLooseKey:
	CALL	B_Delay10mS
	SNZ		P_KeyON_F								;重物离秤 ?
	JMP		L_OFFLooseKey
	CALL	B_Delay10mS
 L_OFFSPRAM:										;
	MOV		A,					11101111B
	MOV		PA,					A
	MOV		A,					00001111B
	MOV		PB,					A
	CLR		INTC0
	CLR		INTC1
	CLR		TMR0C
	CLR		TMR1C
	CLR		ADCR
	CLR		WDTC
	CLR		CHPEN									;关电压泵
	CLR		REGCEN									;关稳压器
 L_OFFHALT:
 	HALT
	NOP
	NOP
 L_PowerOFF:
	JMP		L_Start
 ;=============================================================================

 ;=============================================================================
 ;  定时中断0
 ;  INPUT RAM	: TMR0,	R_TmrInt0Cnt_0,	R_TmrInt0Cnt_1,
 ;  USER RAM	:  R_IAccReg, R_IStatReg
 ;  OUTPUTRAM	: TMR0,	R_TmrInt0Cnt_0,	R_TmrInt0Cnt_1
 ;=============================================================================
 B_TmrInt0			PROC
 L_TmrInt0:
	MOV		R_IAccReg,			A
	MOV		A,					Status
	MOV		R_IStatReg,			A
	SIZ		R_TmrInt0Cnt
	JMP		L_TmrInt0End
	SET		R_FHalfSecond_F

⌨️ 快捷键说明

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