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

📄 新建 文本文档.asm

📁 这是基于富晶单片机FS9821平台的有关电子秤的开发源程序。其中有AD判稳和温度自动补偿的子程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
			BTFSS	STATUS,Z 
			GOTO	L_Main_6		;[R_KeyStatus]≠0E5H 转 
			MOVLW	30H 
			MOVWF	R_WorkStatus	;同时按"OFF"+"TARE"键5秒以上进入标定状态 
			CLRF	R_ZeroCodeL		;0->R_ZeroCodeL 
			CLRF	R_ZeroCodeH		;0->R_ZeroCodeH 
			CLRF	R_SteadyCodeL	;0->R_SteadyCodeL 
			CLRF	R_SteadyCodeH	;0->R_SteadyCodeH 
			BCF	R_PubFlag0,5	;0->R_PubFlag0.5 
			BSF	R_PubFlag0,6	;1->R_PubFlag0.6 
			BCF	R_KeyStatus,7	;0->R_KeyStatus.7 
			BCF	R_KeyStatus,6	;0->R_KeyStatus.6 
			BSF	R_KeyStatus,4	;1->R_KeyStatus.4 
L_Main_6: 
			CALL	S_MainFunc		;主要功能 
			BCF	R_KeyStatus,7	;0->R_KeyStatus.7 
			BCF	R_PubFlag0,4	;0->R_PubFlag0.4 
			BCF	R_PubFlag0,1	;0->R_PubFlag0.1 
			BCF	R_PubFlag0,0	;0->R_PubFlag0.0 
			GOTO	L_MainLoop 
;------------------------------------------------------------------------------ 
;子程序S_MainFunc		;主要功能 
S_MainFunc: 
			BTFSS	R_WorkStatus,7 
			GOTO	L_MainFunc_1	;[R_WorkStatus].7=0 转 
			MOVFW	R_PubCnt1 
			ANDLW	0FFH 
			BTFSC	STATUS,Z 
			GOTO	L_MainFunc_1	;[R_PubCnt1]=0 转 
			BTFSS	R_PubFlag0,0 
			GOTO	L_MainFuncRet	;[R_PubFlag0].0=0(未到1/16秒) 转,返回 
			DECFSZ	R_PubCnt1,1		;[R_PubCnt1]-1->R_PubCnt1 
			GOTO	L_MainFuncRet	;[R_PubCnt1]>0 转,返回 
L_MainFunc_1: 
			BCF	R_WorkStatus,7	;0->R_WorkStatus.7 
			MOVLW	0F0H 
			ANDWF	R_WorkStatus,0 
			BTFSC	STATUS,Z 
			GOTO	L_MainFunc0		;[R_WorkStatus].7:4=0 转 
			ADDLW	0F0H 
			BTFSC	STATUS,Z 
			GOTO	L_CalcHeft		;[R_WorkStatus].7:4=1 转 计算并显示重量值 
			ADDLW	0E0H 
			BTFSC	STATUS,Z 
			GOTO	L_CaliProc		;[R_WorkStatus].7:4=3 转 标定处理 
			ADDLW	0F0H 
			BTFSC	STATUS,Z 
			GOTO	L_OFF_Proc		;[R_WorkStatus].7:4=4 转 关机处理 
L_MainFuncRet: 
			RETURN 
;------------------------------------------------------------------------------ 
L_MainFunc0:						;找零点 
			BTFSS	R_DispFlag,0 
			GOTO    L_MainFunc0_0   ;[R_DispFlag].0=0(电池电压正常) 转 
			MOVLW   4 
			SUBWF   R_BattLowCnt,0 
			BTFSC   STATUS,C 
			GOTO	L_BattLowProc	;[R_BattLowCnt]≥4 转 
L_MainFunc0_0: 
;			CALL	S_DispCaliCode	;去显示内码 
			CALL	S_ClrDisp		;清LCD显示缓冲区LCD1-LCD6 
			INCF	R_WorkStatus,1	;[R_WorkStatus]+1->R_WorkStatus 
			BCF	R_WorkStatus,2	;0->R_WorkStatus.2 
			MOVFW	R_WorkStatus 
			ANDLW	03H 
			SUBLW	R_DispBuff3 
			MOVWF	FSR0 
			MOVLW	08H 
			MOVWF	IND0			;08H("8")->IND0 
			MOVLW	08H 
			MOVWF	R_DispMode		;1->R_DispMode.3 显示提示信息 
			CALL	S_Display		;显示 
			MOVLW	08H 
			MOVWF	R_PubCnt1		;08H->R_PubCnt1,定时0.5秒 
			BSF	R_WorkStatus,7	;1->R_WorkStatus.7 
; 
			BTFSS	R_PubFlag0,6 
			GOTO	L_MainFunc0Ret	;[R_PubFlag0].6=0 转 
			MOVLW	10H 
			MOVWF	R_WorkStatus	;10H->R_WorkStatus 进入称重状态 
            		CALL    S_CalcOffTime	;计算自动关机时间(单位:秒)->R_OffTimerH:R_OffTimerL 
L_MainFunc0Ret: 
			RETURN 
L_BattLowProc:						;电池低电压处理 
			MOVLW	20H 
			MOVWF	R_PubCnt1		;20H->R_PubCnt1,定时2秒 
			MOVLW	0C0H 
			MOVWF	R_WorkStatus	;0C0H->R_WorkStatus,2秒后关机 
			CALL	S_ClrDisp		;清LCD显示缓冲区LCD1-LCD6 
			MOVLW	12H 
			MOVWF	R_DispBuff2		;12H("L")->R_DispBuff2 
			MOVLW	13H 
			MOVWF	R_DispBuff1		;13H("o")->R_DispBuff1 
			MOVLW	08H 
			MOVWF	R_DispMode		;1->R_DispMode.3 显示提示信息 
			GOTO	S_Display		;去显示"  Lo " 
;------------------------------------------------------------------------------ 
L_CalcHeft:							;计算并显示重量值 
            		BTFSC   R_KeyStatus,3 
            		GOTO    L_CalcHeft3     ;[R_KeyStatus].3=1 转 
            		BTFSS   R_KeyStatus,7 
            		GOTO    L_CalcHeft4     ;[R_KeyStatus].7=0 转 
			MOVFW	R_KeyCode 
			SUBLW	0EH 
			BTFSC	STATUS,Z 
			GOTO	L_CalcHeft1		;[R_KeyCode]=0EH("TARE"键释放)转,去皮 
			MOVFW	R_KeyCode 
            		SUBLW   15H 
            		BTFSC	STATUS,Z 
            		GOTO    L_CalcHeft2     ;[R_KeyCode]=15H("Unit"键按下10秒) 转,快速标定 
			MOVFW	R_KeyCode 
            		SUBLW   0DH 
            		BTFSS	STATUS,Z 
            		GOTO    L_CalcHeft4     ;[R_KeyCode]≠0DH(不是"Unit"键短键释放) 转 
            		BSF     R_PubFlag0,4    ;1->R_PubFlag0.4 有效内码,待计算 
            		MOVFW   R_CaliP1L 
            		ANDLW   0FH 
            		BTFSS   STATUS,Z 
            		GOTO    L_SelectUnit    ;[R_CaliP1L].3:0≠0(P1.0≠0) 转 切换计量单位 
            		CLRF    R_UnitSelect    ;0->R_UnitSelect 默认单位为g 
            		GOTO    L_SelectUnit4 
;-----------  切换计量单位  -------- 
L_SelectUnit: 
            		INCF    R_UnitSelect,1  ;[R_UnitSelect]+1->R_UnitSelect 切换计量单位 
            		BCF     R_UnitSelect,2  ;0->R_UnitSelect.2 
            		MOVFW   R_UnitSelect 
 	    		ADDPCW 
            		GOTO    L_SelectUnit0   ;[R_UnitSelect]=0 
            		GOTO    L_SelectUnit1   ;[R_UnitSelect]=1 
            		GOTO    L_SelectUnit2   ;[R_UnitSelect]=2 
;           		GOTO    L_SelectUnit3   ;[R_UnitSelect]=3 
L_SelectUnit3: 
            		BTFSS   R_CaliP1L,1 
            		GOTO    L_SelectUnit    ;[R_CaliP1L].1=0(未选择lb) 转 重新切换下一个计量单位 
            		GOTO    L_SelectUnit4 
L_SelectUnit2: 
            		BTFSS   R_CaliP1L,0 
            		GOTO    L_SelectUnit    ;[R_CaliP1L].0=0(未选择kg) 转 重新切换下一个计量单位 
            		GOTO    L_SelectUnit4 
L_SelectUnit1: 
            		BTFSS   R_CaliP1L,3 
            		GOTO    L_SelectUnit    ;[R_CaliP1L].3=0(未选择oz) 转 重新切换下一个计量单位 
            		GOTO    L_SelectUnit4 
L_SelectUnit0: 
            		BTFSS   R_CaliP1L,2 
            		GOTO    L_SelectUnit    ;[R_CaliP1L].2(未选择g) 转 重新切换下一个计量单位 
L_SelectUnit4: 
            		GOTO    S_CalcUnitData	;计算1d对应的不同计量单位的值(浮点数), 
;            		结果->R_UnitData2(2的指数)、R_UnitData1:R_UnitData0(有效数字) 
;-----------  去皮  ---------------- 
L_CalcHeft1: 
            		BSF     R_PubFlag0,7    ;1->R_PubFlag0.7 读当前内码作为零点内码(去皮) 
            		GOTO    L_CalcHeftRet   ;返回 
;-----------  快速标定  ------------ 
L_CalcHeft2: 
            		MOVLW   20H 
            		MOVWF   R_PubCnt1       ;20H->R_PubCnt1 
            		BCF     R_WorkStatus,2  ;0->R_WorkStatus.2 
            		BSF     R_WorkStatus,3  ;1->R_WorkStatus.3 
            		MOVFW   R_CaliDataL     ;\ 
            		MOVWF   R_TempCaliDataL ; | [R_CaliDataH:R_CaliDataL] 
            		MOVFW   R_CaliDataH     ; | ->R_TempCaliDataH:R_TempCaliDataL 暂存 
            		MOVWF   R_TempCaliDataH ;/ 
	    		BTFSC	R_PubFlag0,5 
			GOTO	L_CalcHeft21	;[R_PubFlag0].5=1(称重数据稳定),转 
			MOVFW	R_LastAverageL	;\ 
			MOVWF	R_SteadyCodeL	; | [R_LastAverageH:R_LastAverageL] 
			MOVFW	R_LastAverageH	; | ->R_SteadyCodeH:R_SteadyCodeL 数据不稳,取当前的平均值 
			MOVWF	R_SteadyCodeH	;/ 
L_CalcHeft21: 
			MOVLW	00H		        ;\ 
			MOVWF	R_PubReg0		; | 0100H (快速标定分度数=1000) 
			MOVFW	01H		        ; | ->R_PubReg1:R_PubReg0 
			MOVWF	R_PubReg1		;/ 
            		GOTO    S_CaliCodeComm	;标定时计算每个内码相当于重量的分度数×65536->R_CaliDataH:R_CaliDataL 
; 
L_CalcHeft22: 
            		MOVFW   R_TempCaliDataL ;\ 
            		MOVWF   R_CaliDataL     ; | [R_TempCaliDataH:R_TempCaliDataL] 
            		MOVFW   R_TempCaliDataH ; | ->R_CaliDataH:R_CaliDataL 恢复原来的标定数据 
            		MOVWF   R_CaliDataH     ;/ 
L_CalcHeft23: 
            		BCF     R_WorkStatus,3  ;0->R_WorkStatus.3 
            		MOVFW   R_KeyStatus 
            		ANDLW   7FH 
            		IORLW   70H 
            		MOVWF   R_KeyStatus     ;7->R_KeyStatus.3:0 
            		GOTO    L_CalcHeftRet   ;返回 
; 
L_CalcHeft3: 
            		BCF     R_PubFlag1,4    ;0->R_PubFlag1.4 
            		BTFSC   R_KeyStatus,4 
            		GOTO    L_CalcHeft22    ;[R_KeyStatus].4=1 转 
            		BTFSS   R_PubFlag0,0 
            		GOTO    L_CalcHeftRet   ;[R_PubFlag0].0=0(未到1/16秒) 转,返回 
            		DECFSZ  R_PubCnt1,1     ;[R_PubCnt1]-1->R_PubCnt1 
            		GOTO   	L_CalcHeft31    ;[R_PubCnt1]>0 转 
            		CLRF    INTE            ;关所有中断 
            		CALL    S_WrCaliData	;将[R_CaliChksumH:R_CaliMarkL]的8个16位数据写入到93LC46的00H-07H中 
	    		CLRF	INTF 
	    		MOVLW	10010100B 
	    		MOVWF	INTE		;GIE=1,TMIE=1,ADIE=1 
            		GOTO    L_CalcHeft23 
L_CalcHeft31: 
            		BTFSS   R_PubFlag0,1 
            		GOTO    L_CalcHeftRet   ;[R_PubFlag0].1=0(未到1/2秒) 转,返回 
            		BTFSC   R_TimerCnt,2 
            		GOTO    S_ClrDisp       ;[R_TimerCnt].2=1 转,清显示 
;下面计算出重量值,并根据公/英制要求送显示缓冲区 
L_CalcHeft4: 
			BTFSS	R_PubFlag0,4 
			GOTO	L_CalcHeftRet	;[R_PubFlag0].4=0(无新的有效内码) 转,返回 
			MOVLW	01H 
			ANDWF	R_DispFlag,1	;0->R_DispFlag.7:1 
			BCF     R_PubFlag1,6	;0->R_PubFlag1.6 
			BTFSC	R_PubFlag1,4 
			GOTO	L_DispOverErr	;[R_PubFlag1].4=1(超载) 转,显示超载错误 
			MOVFW	R_ZeroCodeL		;\ 
			MOVWF	R_PubReg0		; | [R_ZeroCodeH:R_ZeroCodeL] (零点内码) 
			MOVFW	R_ZeroCodeH		; | ->R_PubReg1:R_PubReg0 
			MOVWF	R_PubReg1		;/ 
			MOVFW	R_LastAverageL		;\ 
			MOVWF	R_PubReg4		; | [R_LastAverageH:R_LastAverageL] (当前平均内码) 
			MOVFW	R_LastAverageH		; | ->R_PubReg5:R_PubReg4 
			MOVWF	R_PubReg5		;/ 
			CALL	S_CalcABS		;计算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]绝对值->R_PubReg5:R_PubReg4 
			BTFSC	R_PubFlag1,3 
			BSF	R_DispFlag,1	;[R_PubFlag1].3=1,1->R_DispFlag.1 显示负号 
			MOVFW	R_CaliDataL		;\ 
			MOVWF	R_PubReg2		; | 重量标定数据[R_CaliDataH:R_CaliDataL] 
			MOVFW	R_CaliDataH		; | ->R_PubReg3:R_PubReg2 
			MOVWF	R_PubReg3		;/ 
			CALL	S_Multi			;[R_PubReg3:R_PubReg2]×[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg0 
			MOVFW	R_PubReg3 
			ANDLW	0FFH 
			BTFSS	STATUS,Z 
			GOTO	L_CalcHeft42	;[R_PubReg3]>0 转 
			MOVFW	R_PubReg2 
			ANDLW	0FEH 
			BTFSS	STATUS,Z 
			GOTO	L_CalcHeft42	;[R_PubReg2]≥2 转 
			BTFSS	R_PubFlag0,5 
			GOTO	L_CalcHeft41	;[R_PubFlag0].5=0(称重数据不稳定) 转 
			MOVFW	R_LastAverageL	;\ 
			MOVWF	R_ZeroCodeL   	; | [R_LastAverageH:R_LastAverageL]->R_ZeroCodeH:R_ZeroCodeL 
			MOVFW	R_LastAverageH	; | 保存零点内码 
			MOVWF	R_ZeroCodeH	;/ 
			CLRF	R_PubReg2		;0->R_PubReg2 
L_CalcHeft41: 
			CLRF	R_PubReg1		;0->R_PubReg1 
			GOTO	L_DispHeft 
L_CalcHeft42: 
			MOVFW	R_MaxScaleMarkL		;\ 
			SUBWF	R_PubReg2,0		; | 
			MOVFW	R_MaxScaleMarkH		; | [R_PubReg3:R_PubReg2]≥[R_MaxScaleMarkH:R_MaxScaleMarkL] 
			SUBWFC	R_PubReg3,0		; | (称重结果≥最大分度数+9) 转 显示超载错误 
			BTFSC	STATUS,C		; | 
			GOTO	L_DispOverErr		;/ 
			CLRF	R_PubCnt3		;0->R_PubCnt3 
			CALL	S_LeftMove 		;[R_PubReg3:R_PubReg0]左移,直到[R_PubReg3]≥80H,最多移16次 
;					 				 实际移位次数加入[R_PubCnt3] 
			MOVFW	R_UnitData0		;\ 
			MOVWF	R_PubReg4		; | [R_UnitData1:R_UnitData0] 
			MOVFW	R_UnitData1		; | ->R_PubReg5:R_PubReg4 
			MOVWF	R_PubReg5		;/ 
			MOVFW	R_UnitData2 
			ADDWF	R_PubCnt3,1		;[R_PubCnt3]+[R_UnitData2]->R_PubCnt3 
			CALL	S_Multi			;[R_PubReg3:R_PubReg2]×[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg0 
L_CalcHeft4L1: 
			MOVFW	R_PubCnt3 
			ANDLW	0FFH 
			BTFSC	STATUS,Z 
			GOTO	L_DispHeft		;[R_PubCnt3]=0 转 
			BTFSC	R_PubCnt3,7 
			GOTO	L_CalcHeft43	;[R_PubCnt3]≥80H 转 
			DECF	R_PubCnt3,1		;[R_PubCnt3]-1->R_PubCnt3 
			BCF	STATUS,C		;0->Cy 
			RRF	R_PubReg3,1		;\ 
			RRF	R_PubReg2,1		; | [R_PubReg3:R_PubReg0]右移1位 
			RRF	R_PubReg1,1		; | ->R_PubReg3:R_PubReg0 
			RRF	R_PubReg0,1		;/ 
			GOTO	L_CalcHeft4L1 
L_CalcHeft43: 
			MOVLW	1 
			MOVWF	R_Count			;1->R_Count 
			CALL	S_RL1Bit	;[R_PubCnt3]+1->R_PubCnt3,[R_PubReg3:R_PubReg0]左移1位->R_PubReg3:R_PubReg0 
			GOTO	L_CalcHeft4L1 
L_DispHeft: 
			MOVFW	R_DecimalDigits 
			MOVWF	R_DispMode		;[R_DecimalDigits](小数位数)->R_DispMode 
			BSF	R_DispMode,2	;1->R_DispMode.2 显示计量单位 
			BTFSC	R_PubFlag0,5 
			BSF	R_PubFlag1,6	;[R_PubFlag0].5=1(称重数据稳定),1->R_PubFlag1.6 显示稳定符号 
			MOVFW	R_ScaleMarkV 
			ADDPCW 
			GOTO	L_DispHeft_11	;[R_ScaleMarkV]=0 
			GOTO	L_DispHeft_11	;[R_ScaleMarkV]=1 
			GOTO	L_DispHeft_12	;[R_ScaleMarkV]=2 
			GOTO	L_DispHeft_15	;[R_ScaleMarkV]=3 
			GOTO	L_DispHeft_15	;[R_ScaleMarkV]=4 
;			GOTO	L_DispHeft_15	;[R_ScaleMarkV]=5 
L_DispHeft_15:						;分度值=5 
			MOVLW	80H			;\ 
			ADDWF	R_PubReg1,0		; | 
			MOVLW	2			; | [R_PubReg3:R_PubReg2]+2.5 
			ADDWFC	R_PubReg2,1		; | ->R_PubReg3:R_PubReg2 
			MOVLW	0			; | (四舍五入) 
			ADDWFC	R_PubReg3,1		;/ 
			GOTO	L_DispHeft_2 
L_DispHeft_12:						;分度值=2 
			MOVLW	1			;\ 
			ADDWF	R_PubReg2,1		; | [R_PubReg3:R_PubReg2]+1 
			MOVLW	0			; | ->R_PubReg3:R_PubReg2 
			ADDWFC	R_PubReg3,1		;/  (四舍五入) 
			BCF	R_PubReg2,0	;0->R_PubReg2.0 
			GOTO	L_DispHeft_2 
L_DispHeft_11:						;分度值=1 
			MOVLW	80H			;\ 
			ADDWF	R_PubReg1,0		; | 
			MOVLW	0			; | [R_PubReg3:R_PubReg2]+0.5 
			ADDWFC	R_PubReg2,1		; | ->R_PubReg3:R_PubReg2 

⌨️ 快捷键说明

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