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

📄 scale.asm

📁 基于holtek MCU 的电子秤源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
 ;=============================================================================
 ;文件名	: CRE0717-A2.asm
 ;电路图名	: CRE0717-A1.sch
 ;项目名	: **人体秤
 ;作者		: 胡川
 ;母体		: HT46R72D-1
 ;父程序	: CRE0717-A1.asm
 ;检验码	: 97A0H
 ;修改日起	: 2007-09-10
 ;剩余行	: 前 234行. 后47行.
 ;-----------------------------------------------------------------------------
 ;=============================================================================
 ;功能:
 ;		按键: 'POWER'、'Cali'
 ;		量程: 120KG/150KG
 ;		过载: 重量超过标定重量125%,显示'Err'
 ;		单位: KG,LB,ST.
 ;		精度: 0.1KG/0.2oz.
 ;		低电: 开机低电,报错关机.称重时低电,只报错.
 ;		开机: 按'Power'可开机
 ;		显示: 开机LCD显示'8888'3秒,然后显示0.0kg
 ;
 ;操作:
 ;		测试: 按着'CALI'不放,开机直至LCD出现内容,即可进入测试模式
 ;			: 先测试LCD的COM线和SEG线,然后显示内码,按标定键可进入标定模式
 ;		标定: 开机状态下,按'CALI'.先显示'120'或'150'然后显示内码.按'CALI'显
 ;			: 示要放的重量.标定成功后,显示'PASS'.
 ;
 ;信息:
 ;		ErrE: 存储器错误,其中包括存储器物理连接有误、存储器内没有写入数据
 ;		ErrC: 开机时显示为标定数据读取错误,计数时显示为计数校机重量错误
 ;		 PL	: 电池电量低
 ;		O-LD: 重量过载
 ;		PASS: 标定成功
 ;
 ;说明:
 ;	A1.ADC值,两次加到一次.
 ;	A1.改用HX的新版2402读写程序.
 ;	A1.以LVD为低电检测方式.
 ;	A1.锁定状态不关机.
 ;	A1.用了两个标示位来标记半秒时间到.
 ;	A2.解决L_MainNormClrLockLow处理的BUG.
 ;	A2.开机低电检测放到读存贮器之前.如果低电,报错关机.
 ;=============================================================================
 ;=============================================================================
 ;MASK OPTION
 ;-----------------------------------------------------------------------------
 ;OSC mode					   	RC	mode
 ;LCDDriver	clock			   	Int. RCOSC/4
 ;LCDDuty					   	1/4Duty
 ;LCD bias selection			1/3 bias
 ;LCD functionDuring HALT	   	OFF
 ;Clock Source (fs)			   	Int. RCOSC
 ;LVR						  	Disable
 ;LVD						  	Enable
 ;INT0 trigger edge			  	Disable
 ;PA0/BZ,PA1/BZB output		   	(PA1,PA0) =	(I/O, I/O)
 ;BZ	output frequecy			fS/ (2^2)
 ;WDT						   	Disable
 ;WDT time-outPeriod		   	2^16/fs
 ;CLRWDT						1 instruction
 ;WDT clock source			   	Int.	RCOSC
 ;-----------------------------------------------------------------------------
 ;						  7	6 5	4 3	2 1	0
 ;Wake-upPA0-			  0	0 0	0 0	0 0	1	1:Wake-up, 0:None-Wake-up
 ;Pull-highPA0-			  0 0 0 0 0 1 1	1	1:Pull-high, 0:None-Pull-high
 ;Pull-highPB0-			  -	- -	- 1 1 1 0	1:Pull-high, 0:None-Pull-high
 ;-----------------------------------------------------------------------------
 ;=============================================================================
 ;												包含文件
 ;=============================================================================
	INCLUDE		HT46R72D-1.INC					;inc文件内容为MCU的特殊寄存器的定义
 ;=============================================================================


 data.section 'data'
			ORG	0000H
 ;======================================================================================================= ;
 ;用户寄存器定义
 ;======================================================================================================= ;
 ;---------------------------公共寄存器
 R_PubFlag_0			DB		1				;公共标志字节
 R_PubFlag_1			DB		1				;公共标志字节
 ;			EQU		R_PubFlag_0.0
 R_ShowPosi_F			EQU		R_PubFlag_0.1	;显示值的极性
 R_WeigStab_F			EQU		R_PubFlag_0.2	;稳重稳定标志位
 R_FI2CRead_F			EQU		R_PubFlag_0.3	;
 R_FI2CErr_F			EQU		R_PubFlag_0.4	;
 R_WeigLock_F			EQU		R_PubFlag_0.5	;
 R_ShowLock_F			EQU		R_PubFlag_0.6	;
 R_WeigLockOFF_F		EQU		R_PubFlag_0.7	;
 R_ShowWord_F			EQU		R_PubFlag_1.0	;显示标示位
 R_WeigLow_F			EQU		R_PubFlag_1.1	;重量很小标示位
 R_CaliDelay_F			EQU		R_PubFlag_1.2	;标定时,延时标示位
 R_FKeyCaliP_F			EQU		R_PubFlag_1.3	;标定时,延时标示位
 R_FKeyCaliL_F			EQU		R_PubFlag_1.4	;标定时,延时标示位
 R_TmrInt1Tri_F			EQU		R_PubFlag_1.5	;定时器1中断触发标志位
 R_FHalfSecond_F		EQU		R_PubFlag_1.6	;子程序半秒时间到标示位
 R_HalfSecond_F			EQU		R_PubFlag_1.7	;主程序半秒时间到标示位
 ; R_VeryStab_F			EQU			;很稳定标志位
 ; R_MemoryClR_F		EQU			;要求清除记忆标示位
 ; R_ADTimpUp_F			EQU			;放电时间到标示位

 R_PubReg_0				DB		1				;公共寄存器
 R_PubReg_1				DB		1
 R_PubReg_2				DB		1
 R_PubReg_3				DB		1
 R_PubReg_4				DB		1
 ; R_PubReg_5			DB		1
 R_PubCnt_0				DB		1				;公共计数器
 R_PubCnt_1				DB		1
 R_PubCnt_2				DB		1
 ;I/O Port
 P_KeyON_F				EQU		PA.0			;按键
 P_KeyCali_F			EQU		PA.1			;校正键
 P_KeyUnit_F			EQU		PA.2			;单位键
 P_LED_F				EQU		PA.4			;背光		
 P_UnitGND				EQU		PA.7
 ; P_24WP_F				EQU		P1.1			;2402片选
 P_SCL_F				EQU		PB.0			;存储器的串行时钟线
 P_SCLIn_F				EQU		PBC.0			;存储器的串行时钟线为输出标志
 P_SDA_F				EQU		PB.1			;存储器的串行数据线
 P_SDAIn_F				EQU		PBC.1			;存储器的串行数据线为输出标志
 P_UnitKG_F				EQU		PB.2			;单位KG
 P_UnitLB_F				EQU		PB.3			;单位LB
  ;主程序用的RAM
 R_AutoOFFCnt			DB		1				;自动关机用
 R_AutoZEROCnt			DB		1				;自动找零点
 R_CaliReg				DB		1				;校准用
 R_ClrLockCnt			DB		1
 R_DReg_0				DB		1
 R_DReg_1				DB		1
 R_LCDFlag				DB		1				;显示LCD子程
 R_LCDCOL_F				EQU		R_LCDFlag.0
 R_LCDP1_F				EQU		R_LCDFlag.1
 R_LCDLB_F				EQU		R_LCDFlag.2
 R_LCDKG_F				EQU		R_LCDFlag.3
 R_LCDST_F				EQU		R_LCDFlag.4
 R_LCDReg_0				DB		1
 R_LCDReg_1				DB		1
 R_LCDReg_2				DB		1
 R_LCDReg_3				DB		1
 ; R_LCDReg_4			DB		1
 R_LEDOFFCnt			DB		1
 R_LockData_L			DB		1
 R_LockData_H			DB		1
 R_LockFlashCnt			DB		1
 R_Mark0M_0				DB		1				;基准值(标定值)
 R_Mark0M_1				DB		1
 R_Mark1_0				DB		1
 R_Mark1_1				DB		1
 R_Mark2_0				DB		1
 R_Mark2_1				DB		1
 R_Mark3_0				DB		1
 R_Mark3_1				DB		1
 R_Mark4DReg			DB		1
 R_MainLoopCnt			DB		1				;计主循环次数
 R_ModeFlag				DB		1				;工作模式
 R_ModeNormal_F			EQU		R_ModeFlag.0	;正常称重
 R_ModeSet_F			EQU		R_ModeFlag.1	;设置模式
 R_ModeCali_F			EQU		R_ModeFlag.2	;标定模式,显示标示值
 R_ModeSetCnt			DB		1				;设置模式时的步骤
 R_PowerOFFCnt			DB		1				;强制关机
 R_SetFlag				DB		1				;可设置标示位
 R_SetMarkMode_F		EQU		R_SetFlag.0		;可设置标定方式.0->1段,1->3段.
 R_SetMarkWeig_F		EQU		R_SetFlag.1		;可设置标定重量.0->40KG,1->50KG.
 R_SetClrLockMode_F		EQU		R_SetFlag.2		;可设置有重量时解锁方式.0->解锁关机,1->解锁不关机,
 R_SetWarmUpMode_F		EQU		R_SetFlag.3		;可设置开机预热显示方式.0->跑8字,1->全显.
 R_SetUnitMode_F		EQU		R_SetFlag.4		;可设置单位方式.0->拨动选择单位,1->按键换单位.
 R_SetLockCnt			DB		1				;可设置有重量时,解锁重时间.
 R_SetMAX_L				DB		1				;可设置最大称重值
 R_SetMAX_H				DB		1				
 R_SetMemoryRange		DB		1				;可设置记忆值.
 R_SetOFFCnt			DB		1				;可设置关机时间.
 R_SetClrLockCnt		DB		1				;可设置解锁时间.外加3秒闪的时间.
 R_SetWarmUpCnt			DB		1				;可设置开机预热时间
 R_SetInLockCnt			DB		1				;可设置进入锁定的时间
 R_SetShowMin			DB		1				;可设置显示最小值
 R_SetClrMemory			DB		1				;可设置清除记忆值时间
 R_UnitFlag				DB		1
 R_UnitKG_F				EQU		R_UnitFlag.0	;公斤
 R_UnitLB_F				EQU		R_UnitFlag.1	;磅
 R_UnitST_F				EQU		R_UnitFlag.2	;磅
 R_ShowCurrReg_L		DB		1				;当前显示值
 R_ShowCurrReg_H		DB		1
 R_ShowLast1Reg_L		DB		1				;显示值
 R_ShowLast1Reg_H		DB		1
 R_ShowLast2Reg_L		DB		1				;上次显示值
 R_ShowLast2Reg_H		DB		1
 R_ShowLockCnt			DB		1				;锁存
 R_ShowLockOFFCnt		DB		1				;锁存关机
 R_ShowLockReg_0		DB		1
 R_ShowLockReg_1		DB		1
 R_TmrInt0Cnt			DB		1
 R_WeigCurrReg_L		DB		1				;当前稳重值
 R_WeigCurrReg_H		DB		1
 R_WeigFilReg_00		DB		1				;滑动滤波用
 R_WeigFilReg_01		DB		1
 R_WeigFilReg_10		DB		1
 R_WeigFilReg_11		DB		1
 R_WeigFilReg_20		DB		1
 R_WeigFilReg_21		DB		1
 R_WarmUpCnt			DB		1				;开机预热的次数
 R_UnStabOFFCnt			DB		1				;不稳定时,	关机计时用.	

 ;子程序用RAM
 R_FCalcIn_0			DB		1				;计算重量子程
 R_FCalcIn_1			DB		1
 R_FCalcIn_2			DB		1
 R_FCalcOut_0			DB		1
 R_FCalcOut_1			DB		1
 R_FCalcOut_2			DB		1
 R_FCalcMul_0			DB		1
 R_FCalcMul_1			DB		1
 R_FCalcMul_2			DB		1
 R_FCalcDiv_0			DB		1
 R_FCalcDiv_1			DB		1
 R_FCalcDiv_2			DB		1
 R_FCalcBig_0			DB		1
 R_FCalcBig_1			DB		1
 R_FCalcBig_2			DB		1
 R_FCalcBig_3			DB		1
 R_FCalcBig_4			DB		1
 R_FCalcBig_5			DB		1
 R_FCalcCnt				DB		1

 ;复用的用户寄存器
 R_F2Hex2DeciCnt		EQU		R_FCalcIn_0		;4字节16转10进制
 R_F2Hex2DeciIn_0		EQU		R_FCalcIn_1		
 R_F2Hex2DeciIn_1		EQU		R_FCalcIn_2		
 R_F2Hex2DeciOut_0		EQU		R_FCalcOut_0	
 R_F2Hex2DeciOut_1		EQU		R_FCalcOut_1	
 R_F2Hex2DeciOut_2		EQU		R_FCalcOut_2	
 ;--------				EQU			
 R_F24C02Cnt			EQU		R_FCalcIn_0		;读写2402时的地址
 R_F24C02Addr			EQU		R_FCalcIn_1	
 R_FArrayAddr_H			EQU		R_FCalcIn_2	
 R_FArrayAddr_L			EQU		MP0 ;R_FCalcOut_0	
 R_FArrayCont			EQU		R0 ;R_FCalcOut_1	
 R_FI2CData				EQU		R_FCalcOut_2	
 R_FI2CCnt				EQU		R_FCalcMul_0	
 ;						EQU		R_FCalcMul_1	
 ;						EQU		R_FCalcMul_2	
 R_SubReg				EQU		R_FCalcDiv_0	
 R_RWStatus				EQU		R_FCalcDiv_1	
 ;---------------------------	
 R_FDelayCnt_L			EQU		R_FCalcIn_0
 R_FDelayCnt_H			EQU		R_FCalcIn_1
 R_FLCDPubCnt			EQU		R_FCalcIn_2
 R_FPubReg_0			EQU		R_FCalcOut_0	
 R_FPubReg_1			EQU		R_FCalcOut_1	
 R_FPubReg_2			EQU		R_FCalcOut_2
 R_FPubReg_3			EQU		R_FCalcMul_0

 ;中断用RAM
 R_ITmr0Cnt				DB		1
 R_IAccReg				DB		1
 R_IStatReg				DB		1 
 ;
 Addr0M_0				EQU		04H			;93C46中标定值的地址
 Addr0M_1				EQU		05H
 Addr1_0				EQU		06H
 Addr1_1				EQU		07H
 Addr2_0				EQU		08H
 Addr2_1				EQU		09H
 Addr3_0				EQU		0AH
 Addr3_1				EQU		0BH
 Addr4DReg				EQU		0CH
 AddrTest				EQU		0FH			;测试地址
 AddrFlag				EQU		10H			;可设置的标示位.
 AddrLockCnt			EQU		11H			;锁重时间.
 AddrMAX_L				EQU		12H			;最大称重值
 AddrMAX_H				EQU		13H
 AddrMemoryRange		EQU		14H			;记忆值.
 AddrOFFCnt				EQU		15H			;关机时间.
 AddrLPShow				EQU		16H			;低电显示
 AddrLPOFF				EQU		17H			;低电关机
 AddrClrLockCnt			EQU		18H			;解锁时间
 AddrWarmUpCnt			EQU		19H			;开机预热时间
 AddrInLockCnt			EQU		1AH			;进入锁定的时间
 AddrShowMin			EQU		1BH			;最小显示值
 AddrClrMemory			EQU		1CH			;清除记忆值时间
 AddrUnit				EQU		1DH			;单位
 AddrBat				EQU		1FH			;低电
 AddrBase				EQU		020H
 ;
 D_2402BaseNumb			EQU		1			;保存的欺骗值
 D_AutoZEROCnt			EQU		8			;自动找零点的时间
 D_UnStabOFFCnt			EQU		240			;不稳定时,	关机时间60秒. 
 D_TMR1CRisEdge			EQU		10010001B	;放电时的T1设置
 D_TMR1CFallEdge		EQU		10010010B	;充电时的T1设置
 D_TMR1LCnt				EQU		0AFH		;初值为535
 D_TMR1HCnt				EQU		3CH			
 ;*****************************************************************************
 ;	Rom	Begin
 ;*****************************************************************************
 code.section 'code'
	ORG		00H								;上电复位入口首地址
	JMP		L_Start
	ORG		0004H  							;外部中断入口地址
	NOP                         	
	RETI
	ORG		0008H							;定/计器0中断入口地址
	NOP                         	
	JMP		B_TmrInt0
	ORG		000CH							;定/计器1中断入口地址
	NOP                         	
;	JMP		B_TmrInt1	                                    	
	RETI
                                                 	
 ;=============================================================================
 
 ;=============================================================================
 ;Program reset	section
 ;=============================================================================
 ;程度开始
 L_Start:
 L_InitPort:
	MOV		A,					01101111B			;PA口的输出输出控制.
	MOV		PAC,				A					;0为输出,1为输入.
	MOV		A,					01111111B
	MOV		PA,					A	
	MOV		A,					00001110B			;PB口的输出输出控制.
	MOV		PBC,				A
 L_InitRAM:
 L_InitUserRAM:
	MOV		A,					20H					;用户RAM
	MOV		MP0,				A
	CLR		R0
	SIZ		MP0
	JMP		$-2
 L_InitLCDRAM:
	MOV		A,					01H					;MP1用于对LCD操作
	MOV		BP,					A
	MOV		A,					40H					;LCD RAM
	MOV		MP1,				A
	MOV		A,					0FH
	MOV		R_PubCnt_0,			A
	CLR		R1
	INC		MP1
	SDZ		R_PubCnt_0
	JMP		$-3
	CLR		R1
 L_InitSPRAM:
 L_InitSet:
	MOV		A,					00001000B			;LVD enable,IRC enable.
	MOV		MODE,				A					;
	CLR		Status
	MOV		A,					10000110B			;64分频
	MOV		TMR0C,				A
	MOV		A,					10000001B
	MOV		TMR1C,				A
	MOV		A,					00000101B			;开T0中断,开总中断
	MOV		INTC0,				A
	MOV		A,					0H
	MOV		TMR0,				A
	MOV		A,					00000000B			;关T1中断,关ADC中断
	MOV		INTC1,				A
	SET		T0ON									;启动T0,每4096uS触发一次
	MOV		A,					00001001B			;WDT OSC Enable.
	MOV		WDTC,				A
	
 ;	MOV		A,					10000001B
 ;	MOV		HALTC,				A
 L_InitADC:
	MOV		A,					01100111B			;开电压泵,频率除数为10
	MOV		CHPRC,				A					;开稳压
	MOV		A,					3					;8分频
	MOV		ADCD,				A
	MOV		A,					01100011B			;开始充电,AD中断为下降沿触发
	MOV		ADCR,				A
 ;	MOV		A,					11101100B			;充电用T1,放电用T1,使能所有自动功能
 ;	MOV		EADCR,				A					;充电开始即开始充电计数
 ;	CALL	B_Recharge100mS
	CALL	B_Delay10mS

 ;初始化/低电处理
 L_InitPowerLow:
	CALL	B_Delay100mS							;延时0.1秒等电源稳定.
	SNZ		LVDO									;低电?
	JMP		L_InitPowerLowEnd
 L_InitPowerLowOFF:
	MOV		A,					LOW	TabLCDPL		;显示' PL ',表示严重低电,去关机.
	JMP		L_OFFDelay								;去显示,延时3秒,关机的入口.
 L_InitPowerLowEnd:

 ;初始化/工厂测试处理
 L_InitTest:
 ;	CLR		WDT
	SZ		P_KeyCali_F
	JMP		L_InitTestEnd							;退出测试
 L_InitTestLCD:
	CALL	B_ClrLCD								;清空LCD的RAM
	MOV		A,					0FH
	MOV		R_PubReg_0,			A
	MOV		A,					40H
	MOV		MP1,				A
	SET		R1
	INC		MP1
	CALL	B_Delay100mS
	SDZ		R_PubReg_0
	JMP		$-4
	SET		R1
	CALL	B_Delay2000mS							;延时2秒
 ;	CLR		WDT
 L_InitTestLoop:	
	CALL	B_Delay100mS
	SNZ		P_KeyCali_F
	JMP		L_InitTestLoop
	CALL	B_Delay100mS
	CALL	B_Delay100mS
	CLR		R_ModeFlag
 ;	SET		R_ModeSet_F/2005-7-1					;设置模式
	SET		R_ModeCali_F							;标定模式
	CLR		R_ModeSetCnt
 L_InitTestEnd:
	
 ;测试读存贮器/如果没有在"AddrTest"地址读到55H,则报错关机.
 L_InitTest2402:									;Test2402
	MOV		A,					1
	MOV		R_F24C02Cnt,		A
	MOV		A,		OFFSET		R_PubReg_0
	MOV		R_FArrayAddr_L,		A
	MOV		A,					AddrTest
	MOV		R_F24C02Addr,		A
	SET		R_FI2CRead_F							;读操作
	CALL	B_24C02
	SZ		R_FI2CErr_F
	JMP		L_InitTestErr1
	MOV		A,					R_PubReg_0
	SUB		A,					55H
	SZ		Z
	JMP		L_InitTest2402End
 L_InitTestErr1:
	MOV		A,					LOW	TabLCDErr1		;显示'Err1',表示写2402出错
	CALL	B_ReadWord	
	CALL	B_LCD
	CALL	B_Delay2000mS							;延时2秒
	SNZ		R_ModeCali_F
	JMP		L_OFF
 L_InitTest2402End:

 ;初始化/读设置值处理
 L_InitReadSet:										;给默认值
	MOV		A,					00000011B
	MOV		R_SetFlag,			A
	MOV		A,					120					;有重量解锁定时间:30秒
	MOV		R_SetLockCnt,		A
	MOV		A,					09H					;最大量程:180.1KG
	MOV		R_SetMAX_L,			A
	MOV		A,					07H
	MOV		R_SetMAX_H,			A
	MOV		A,					03					;记忆值范围:3D
	MOV		R_SetMemoryRange,	A
	MOV		A,					32					;关机时间:8秒
	MOV		R_SetOFFCnt,		A
	MOV		A,					10					;无重量时解解锁时间,5秒.8/2+3=5.
	MOV		R_SetClrLockCnt,	A
	MOV		A,					12					;开机预热时间,3秒
	MOV		R_SetWarmUpCnt,		A
	MOV		A,					9					;进入锁定的时间,2.5秒
	MOV		R_SetInLockCnt,		A
	MOV		A,					25					;最小显示值,25D.
	MOV		R_SetShowMin,		A
	MOV		A,					56					;清除记忆的时间.30秒.
	MOV		R_SetClrMemory,		A
	MOV		A,					00000001B			;单位,KG.
	MOV		R_UnitFlag,			A
 	MOV		A,					12
	MOV		R_F24C02Cnt,		A
	MOV		A,		OFFSET 		R_SetFlag
	MOV		R_FArrayAddr_L,		A
	MOV		A,					AddrFlag
	MOV		R_F24C02Addr,		A
	SET		R_FI2CRead_F							;读操作

⌨️ 快捷键说明

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