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

📄 scale.asm

📁 基于holtek MCU 的电子秤源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	MOV		A,					131					;0.5秒产生一次标示位.
	MOV		R_TmrInt0Cnt,		A
	JMP		L_TmrInt0End
 L_TmrInt0End:
	MOV		A,					R_IStatReg
	MOV		Status,				A
	MOV		A,					R_IAccReg
	RETI
 B_TmrInt0			ENDP
 ;=======================================================================================


 ;=======================================================================
 ;名  称: T1定时中断处理子程序
 ;功  能: 置位一个定时器1中断触发标志
 ;输  入: 无
 ;输  出:
 ;创  建: ◥HX◤于深圳2006-01-19
 ;修  改:
 ;版  本:
 ;备  注: V.0.1
 ;=======================================================================
; L_TmrInt1:
;	MOV		R_IAccReg,			A
;	MOV		A,					Status
;	MOV		R_IStatReg,			A
;	CLR		T1ON
;	SET		R_TmrInt1Tri_F
;	MOV		A,					10000000B
;	XORM	A,					PA
; ;	CLR		ADDISCH0								;开始放电
; ;	SET		ADDISCH1
;	MOV		A,					R_IStatReg
;	MOV		Status,				A
;	MOV		A,					R_IAccReg
;	RETI
; L_TmrInt1End:
 ;=======================================================================


 ;=============================================================================
 ;4字节16转10进制子程序
 ;INPUT	RAM		: R_F2Hex2DeciIn_0,	R_F2Hex2DeciIn_1, 
 ;				: 
 ;USER	RAM		: R_F2Hex2DeciCnt
 ;OUTPUT RAM	: R_F2Hex2DeciOut_0,	R_F2Hex2DeciOut_1
 ;				: R_F2Hex2DeciOut_2,
 ;Note			: Input	Max	= 99999999
 ;				: Fox/2003-12-8
 ;=============================================================================
 B_2Hex2Deci		PROC
 L_B2Hex2Deci:										;十六转十进制
	CLR		R_F2Hex2DeciOut_0
	CLR		R_F2Hex2DeciOut_1
	CLR		R_F2Hex2DeciOut_2
	MOV		A,					16
	MOV		R_F2Hex2DeciCnt,	A
 L_B2Hex2DeciLoop:
	CLR		C
	RLC		R_F2Hex2DeciIn_0
	RLC		R_F2Hex2DeciIn_1
	MOV		A,					R_F2Hex2DeciOut_0
	ADC		A,					R_F2Hex2DeciOut_0
	DAA		Acc
	MOV		R_F2Hex2DeciOut_0,	A
	MOV		A,					R_F2Hex2DeciOut_1
	ADC		A,					R_F2Hex2DeciOut_1
	DAA		Acc
	MOV		R_F2Hex2DeciOut_1,	A
	MOV		A,					R_F2Hex2DeciOut_2
	ADC		A,					R_F2Hex2DeciOut_2
	DAA		Acc		
	MOV		R_F2Hex2DeciOut_2,	A
	SDZ		R_F2Hex2DeciCnt
	JMP		L_B2Hex2DeciLoop
 L_B2Hex2DeciEnd:
	RET
 B_2Hex2Deci		ENDP
 ;=============================================================================
 

 ;=============================================================================
 ;乘除子程序
 ;INPUT		: R_FCalcIn_0, R_FCalcIn_1,	R_FCalcIn_2, R_FCalcMuL_0,	R_FCalcMuL_1, 
 ;			: R_FCalcMuL_2,	R_FCalcDiv_0,	R_FCalcDiv_1, R_FCalcDiv_2
 ;USERRAM	: R_FCalcBig_0, R_FCalcBig_1,	R_FCalcBig_2, R_FCalcBig_3,	R_FCalcCnt
 ;			  R_FCalcReg_0, R_FCalcReg_1,	R_FCalcReg_2, R_FCalcReg_3
 ;OUTPUT	: R_FCalcOut_0, R_FCalcOut_1
 ;=============================================================================
 B_Calc				PROC
 L_BCalc:
	CLR		R_FCalcOut_0
	CLR		R_FCalcOut_1
	CLR		R_FCalcOut_2
	CLR		R_FCalcBig_0
	CLR		R_FCalcBig_1
	CLR		R_FCalcBig_2
	CLR		R_FCalcBig_3
	CLR		R_FCalcBig_4
	CLR		R_FCalcBig_5
 L_BCalcMult:  
	MOV		A,					24					;3*8=24
	MOV		R_FCalcCnt,			A
 L_BCalcMultLoop:
	CLR		C
	RRC		R_FCalcMuL_2
	RRC		R_FCalcMuL_1
	RRC		R_FCalcMuL_0
	SNZ		C
	JMP		L_BCalcMultEnd
	MOV		A,					R_FCalcIn_0
	ADDM	A,					R_FCalcBig_0
	MOV		A,					R_FCalcIn_1
	ADCM	A,					R_FCalcBig_1
	MOV		A,					R_FCalcIn_2
	ADCM	A,					R_FCalcBig_2
	MOV		A,					R_FCalcOut_0
	ADCM	A,					R_FCalcBig_3
	MOV		A,					R_FCalcOut_1
	ADCM	A,					R_FCalcBig_4
	MOV		A,					R_FCalcOut_2
	ADCM	A,					R_FCalcBig_5
 L_BCalcMultEnd:
	CLR		C
	RLC		R_FCalcIn_0
	RLC		R_FCalcIn_1
	RLC		R_FCalcIn_2
	RLC		R_FCalcOut_0
	RLC		R_FCalcOut_1
	RLC		R_FCalcOut_2
	SDZ		R_FCalcCnt
	JMP		L_BCalcMultLoop
 L_BCalcDivi:
	MOV		A,					48					;6*8=48
	MOV		R_FCalcCnt,			A
	CLR		R_FCalcIn_0
	CLR		R_FCalcIn_1
	CLR		R_FCalcIn_2
	CLR		R_FCalcOut_0
	CLR		R_FCalcOut_1
	CLR		R_FCalcOut_2	
 L_BCalcDiviLoop:
	CLR		C
	RLC		R_FCalcBig_0
	RLC		R_FCalcBig_1
	RLC		R_FCalcBig_2
	RLC		R_FCalcBig_3
	RLC		R_FCalcBig_4
	RLC		R_FCalcBig_5
	RLC		R_FCalcIn_0
	RLC		R_FCalcIn_1
	RLC		R_FCalcIn_2
	SET		C
	MOV		A,					R_FCalcIn_0
	SBC		A,					R_FCalcDiv_0
	MOV		R_FCalcIn_0,		A
	MOV		A,					R_FCalcIn_1
	SBC		A,					R_FCalcDiv_1
	MOV		R_FCalcIn_1,		A
	MOV		A,					R_FCalcIn_2
	SBC		A,					R_FCalcDiv_2
	MOV		R_FCalcIn_2,		A
	SZ		C
	JMP		L_BCalcDiviMore
	MOV		A,					R_FCalcDiv_0
	ADDM	A,					R_FCalcIn_0
	MOV		A,					R_FCalcDiv_1
	ADCM	A,					R_FCalcIn_1
	MOV		A,					R_FCalcDiv_2
	ADCM	A,					R_FCalcIn_2
	CLR		C
	JMP		L_BCalcDiviEnd
 L_BCalcDiviMore:
	SET		C
 L_BCalcDiviEnd:
	RLC		R_FCalcOut_0
	RLC		R_FCalcOut_1
	RLC		R_FCalcOut_2
	SDZ		R_FCalcCnt
	JMP		L_BCalcDiviLoop
	RET
 B_Calc				ENDP
 ;=============================================================================


 ;=============================================================================
 ;LCD子程序
 ;INPUT RAM	:R_LCDReg_0, R_LCDReg_1, R_LCDReg_2, R_LCDReg_3, 
 ;			:R_LCDFlag
 ;USER	RAM	:R_FLCDPubCnt ,R_FLCDPubReg
 ;OUTPUT RAM	: LCD RAM
 ;=============================================================================
 B_LCD				PROC
 L_BLCD:
 L_BLCDClr:
	MOV		A,					00
 ;	CALL	B_AllLCD
 L_BLCDNumb:
	MOV		A,					OFFSET	R_LCDReg_3	;给的第一个数据
	MOV		MP0,				A
	MOV		A,					40H					;LCDRam开始的地址
	MOV		MP1,				A
	MOV		A,					4					;要显示的7段数量
	MOV		R_FPubReg_3,		A
 L_BLCDNumbLoop:
	MOV		A,					R0
	MOV		TBLP,				A
	TABRDL	R_FPubReg_2
	MOV		A,					R_FPubReg_2
	MOV		R1,					A
	INC		MP1
	SWAPA	R_FPubReg_2
	MOV		R1,					A
	INC		MP1
	DEC		MP0
	SDZ		R_FPubReg_3
	JMP		L_BLCDNumbLoop	
 L_BLCDFlag:
	MOV		A,					48H
	MOV		MP1,				A
	CLR		R1
	SZ		R_LCDKG_F								;KG ?
	SET		R1.3
	SZ		R_LCDLB_F								;LB ?
	SET		R1.2
	SZ		R_LCDST_F								;ST ?
	SET		R1.1
	MOV		A,					47H
	MOV		MP1,				A
	SZ		R_LCDP1_F								;P1 ?
	SET		R1.0
	MOV		A,					43H
	MOV		MP1,				A
	SZ		R_LCDCOL_F								;COL ?
	SET		R1.0
 L_BLCDEnd:
	RET
 B_LCD				ENDP
 ;=============================================================================


 ;===========================================================================
 ;读按键
 ;INPUT	RAM		:
 ;USER	RAM		:	 
 ;OUTPUT RAM	:
 ;Note			:  
 ;				: Fox/2007-02-13
 ;============================================================================
 B_ReadKey			PROC
 L_FReadKey:
 L_FReadKeyCali:									;标定
	SNZ		P_KeyCali_F								;松键 ?
	JMP		$+3
	SET		R_FKeyCaliL_F							;设松键标志位
	JMP		$+6
	SNZ		R_FKeyCaliL_F							;.NOT.松键标志位?
	JMP		$+3
	SET		R_FKeyCaliP_F							;设按键标志位
	NOP												
 ;	CALL	B_Buzzer								;响蜂鸣器200mS
	CLR		R_FKeyCaliL_F							;清松键标志位
 L_FReadKeyEnd:
	RET
 B_ReadKey			ENDP
 ;============================================================================


 ;=============================================================================
 ;清空LCD子程序
 ;INPUT	RAM		: 
 ;USER	RAM		: 
 ;OUTPUT RAM	: 
 ;=============================================================================
 B_ClrLCD			PROC
 L_CLRLCD:
	MOV		A,					40H
	MOV		MP1,				A
	MOV		A,					0BH
	CLR		R1
	INC		MP1
	SDZ		Acc
	JMP		$-3
	CLR		R1
 L_CLRLCDEnd:
	RET
 B_ClrLCD			ENDP

 ;=============================================================================


 ;=============================================================================
 ;初始化计算程序
 ;=============================================================================
 B_InitCalc			PROC
 L_BFInitCalc:
 	CLR		R_FCalcIn_1
 	CLR		R_FCalcIn_2
 	CLR		R_FCalcDiv_1
 	CLR		R_FCalcDiv_2
 	CLR		R_FCalcMuL_1
 	CLR		R_FCalcMuL_2
 	MOV		A,						1
 	MOV		R_FCalcIn_0,			A
 	MOV		R_FCalcDiv_0,			A
 	MOV		R_FCalcMuL_0,			A
 	RET
 L_BFInitCalcEnd:
 B_InitCalc			ENDP
 ;=============================================================================


 ;=============================================================================
 B_Delay2000mS		PROC
 L_BDelay2000mS:
	MOV		A,					20
	MOV		R_FDelayCnt_H,		A
 L_BDelay2000mSLoop:
	CALL	B_Delay100mS
	SDZ		R_FDelayCnt_H
	JMP		L_BDelay2000mSLoop
	RET
 B_Delay2000mS		ENDP
 ;=============================================================================


 ;=============================================================================
 ;延时10mS
 ;Input	 :
 ;USER	  :	
 ;Output :
 ;=============================================================================
 B_Delay10mS		PROC
 L_BDelay10mS:
	MOV		A,					13					 ;13*256*3=9984uS
	MOV		R_FDelayCnt_L,		A					 ;=9.9mS
	MOV		A,					0FFH
	SDZ		Acc
	JMP		$-1
	SDZ		R_FDelayCnt_L
	JMP		$-3
 L_BDelay10mSEnd:
 ;	CLR		WDT
	RET
 B_Delay10mS		ENDP
 ;=============================================================================


 ;=============================================================================
 ;读字母的Tab
 ;INPUT		: A
 ;USER		: 
 ;OUTPUT	: R_LCDReg_0,  R_LCDReg_1,	R_LCDReg_2,	R_LCDReg_3,   R_LCDFlag
 ;=============================================================================
 B_ReadWord			PROC
 L_BReadWord:
	MOV		R_LCDReg_0,			A
	INC		Acc
	MOV		R_LCDReg_1,			A
	INC		Acc
	MOV		R_LCDReg_2,			A
	INC		Acc
	MOV		R_LCDReg_3,			A
	CLR		R_LCDFlag
 L_BReadWordEnd:
	SET		R_ShowWord_F
	RET
 B_ReadWord			ENDP
 ;=============================================================================


;=======================================================================================
 ; LCD的Tab
 ;=======================================================================================
			ORG		0700H
 ;=============================================================================
 ;LCD的Tab
 TabLCD:
 TabLCDNumb:						;数字
 ;				ABCPFGED   
		DW		11101011B			;'0'
		DW		01100000B			;'1'
		DW		11000111B			;'2'
		DW		11100101B			;'3'
		DW		01101100B			;'4'
		DW		10101101B			;'5'
		DW		10101111B			;'6'
		DW		11100000B			;'7'
		DW		11101111B			;'8'
		DW		11101101B			;'9'
 TabLCDEmpty:		   				;什么都不显示
		DW		00000000B			;'	'
 ;  TabLCDC:             
 ;		DW		10001011B			;'C'
 ;  TabLCDA:             
 ;		DW		11101110B			;'A'
 ;  TabLCDL:             
 ;		DW		00001011B			;'L'
 TabLCDErr1:		   				;读写2402出错,'Err1'
		DW		01100000B			;'1'
		DW		00000110B			;'r'
		DW		00000110B			;'r'
		DW		10001111B			;'E'
 TabLCDErr2:		   				;标定值出错,'Err2'
		DW		11000111B			;'2'
		DW		00000110B			;'r'
		DW		00000110B			;'r'
		DW		10001111B			;'E'
 TabLCDErr:			   				;正溢出,'Err'
		DW		00000000B			;' '
		DW		00000110B			;'r'
		DW		00000110B			;'r'
		DW		10001111B			;'E'
 TabLCDPL:			   				;低电,' PL '
		DW		00000000B			;'	'
		DW		00001011B			;'L'
		DW		11001110B			;'P'
		DW		00000000B			;'	'
                        
 ;TabLCDHELO:		   				;上电,'HELO'
 ;		DW		11101011B			;'0'
 ;		DW		00001011B			;'L'
 ;		DW		10001111B			;'E'
 ;		DW		01101110B			;'H'		
 TabLCD____:		   				;负溢出,'----'
		DW		00000100B			;'-'		
		DW		00000100B			;'-'		
		DW		00000100B			;'-'		
		DW		00000100B			;'-'		
 TabLCDPASS:	  	  				;'PASS'
		DW		10101101B			;'S'
		DW		10101101B			;'S'
		DW		11101110B			;'A'
		DW		11001110B			;'P'
 TabLCDNega:	   					;负号,'-'
		DW		00000100B			;'-'
 ;=============================================================================


;******************************************************************************************************;
;********			文件标题:		I2C总线读写模块												********;
;********			文件描述:		读写I2C器件的通用源程序										********;
;********			适用芯片:		HT全系列													********;
;********			指 令 集:		合泰精简指令集												********;
;******************************************************************************************************;
;
;功能说明:	用于I2C总线的通讯,时钟频率为100KHz
;
;变量定义:
;	IO :P_SCL_F(时钟线)	P_SCLIn_F(时钟线IO控制)		P_SDA_F(数据线)		P_SDAIn_F(数据线IO控制)
;		R_FArrayAddr_H和R_FArrayAddr_L(MCU中寄存器组首地址的高低位)		R_FI2CRead_F(读/写标志)
;		R_F24C02Cnt(数据个数)		R_F24C02Addr(24CXX内部地址)			R_FI2CErr_F(存储器出错标志)
;	RAM:R_FI2CData(数据内容)		R_FI2CCnt(读写次数)		A(公用计数器)
;
;备注说明:	F_24C02这个函数是基于24C02编写的读写程序,对于24C16或其他的I2C存储器件,可能要修改后才能应用
;			24CXX系列存储器内部地址是分页的,其内部分为页地址与字节地址,如果是进行页写入,字节地址是会
;			自动递增的,但是字节地址到了页边界后,递增出现跨页情况时,页地址是不会自动递增的,字节地址就
;			会回到该页的首地址,覆盖掉原来的数据,所以,当字节地址到达页尾(24C02一页有8个字节,页边界是
;			0111B,如果0页的字节地址为111B,再递增的话,变为000B,此时要手动把页地址加1,则变为1页的000B)
;			如果是进行页读写,则不存在上述问题,只须指定首地址,存储器会自动递增字节地址与页地址
;			I2C的SDA线必须是带上拉的
;
;修改日志:
;
;第一次修改由◥HX◤于深圳2006--完成
;		#A2.
;======================================================================================================;
;函数名称:	F_24C02
;功能作用:	24C02系列存储器的读写操作
;输入参数:	R_FArrayAddr_H和R_FArrayAddr_L(MCU中的寄存器组首地址的高低位)	R_FI2CRead_F(读/写标志)
;		  :	R_F24C02Addr(24CXX内部地址)		R_F24C02Cnt(数据

⌨️ 快捷键说明

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