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

📄 9821h620.asm

📁 用台湾富晶单片机开发的电子称包括源码和编译器
💻 ASM
📖 第 1 页 / 共 5 页
字号:
			MOVLW	07H
			ANDWF	R_TimerCnt,0
			BTFSS	STATUS,Z
			GOTO	L_MainAdcProc	;[R_TimerCnt]&07H≠0(未到1秒) 转
;  			CALL    S_DecOffTime ;自动关机时间(单位:秒)-1->3DH:3CH,若已减到0则4->46H,0->47H准备关机
;
L_MainAdcProc:
			BTFSS	R_PubFlag0,3
			GOTO	L_Main_5		;未读到ADC内码,转
			BCF		R_PubFlag0,3	;0->R_PubFlag0.3
			MOVFW	R_AdcDataL		;\
			ADDWF	R_AdcSumL,1		; \
			MOVFW	R_AdcDataH		;  | [R_AdcSumH:R_AdcSumL]+[R_AdcDataH:R_AdcDataL]
			ADDWFC	R_AdcSumM,1		;  | ->R_AdcSumH:R_AdcSumL
			MOVLW	0				; /
			ADDWFC	R_AdcSumH,1		;/
			INCF	R_AdcDataCnt,1	;[R_AdcDataCnt]+1->R_AdcDataCnt
;
			BTFSS	R_AdcDataCnt,3
			GOTO	L_Main_5		;[R_AdcDataCnt]<8 转
;
;			BTFSS	R_AdcDataCnt,3
;			GOTO	L_Main_5		;[R_AdcDataCnt]<8 转
;
			MOVFW	R_AdcSumL		;\
			MOVWF	R_PubReg0		; \
			MOVFW	R_AdcSumM		;  |
			MOVWF	R_PubReg1		;  | [R_AdcSumH:R_AdcSumL]->R_PubReg3:R_PubReg0
			MOVFW	R_AdcSumH		;  |
			MOVWF	R_PubReg2		; /
			CLRF	R_PubReg3		;/
			CLRF	R_AdcSumL		;0->R_AdcSumL
			CLRF	R_AdcSumM		;0->R_AdcSumM
			CLRF	R_AdcSumH		;0->R_AdcSumH
			CLRF	R_AdcDataCnt	;0->R_AdcDataCnt
;
			MOVLW	4				;\
			MOVWF	R_PubReg4		; | 4->R_PubReg5:R_PubReg4
			CLRF	R_PubReg5		;/
;
;			MOVLW	8				;\
;			MOVWF	R_PubReg4		; | 08H->R_PubReg5:R_PubReg4
;			CLRF	R_PubReg5		;/
;
			CALL	S_DivisM	;[R_PubReg3:R_PubReg0]÷[R_PubReg5:R_PubReg4]->R_PubReg1:R_PubReg0
			BSF		R_PubFlag0,4	;1->R_PubFlag0.4 (有效内码)
			INCF	R_CodePointer,1	;内码存储指针+1
			BCF		R_CodePointer,2	;0->R_CodePointer.2
			DECF	R_CodePointer,0	;\
			ANDLW	03H				; \
			BCF		STATUS,C		;  |
			RLF		WORK,0			;  |
			ADDLW	R_CodeBuffer	;  |
			MOVWF	FSR0			;  | 新的有效内码[R_PubReg1:R_PubReg0]
			MOVFW	R_PubReg0		;  | ->内码缓冲区保存
			MOVWF	IND0			;  |
			INCF	FSR0,1			;  |
			MOVFW	R_PubReg1		; /
			MOVWF	IND0			;/
;
			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
L_MainAdcP_1:			
			MOVFW	R_10dCodeL
			SUBWF	R_PubReg4,0
			MOVFW	R_10dCodeH
			SUBWFC	R_PubReg5,0
			BTFSC	STATUS,C
			GOTO	L_MainAdcP_6	;[R_PubReg5:R_PubReg4]≥[R_10dCodeH:R_10dCodeL] (数据不稳)转
			MOVLW	4
			CALL	S_ReadCode	;计算最近4次的内码的平均值->R_PubReg1:R_PubReg0
			MOVFW	R_LastAverageL	;\
			SUBWF	R_PubReg0,0		; \
			MOVWF	R_PubReg4		;  | [R_PubReg1:R_PubReg0]-[R_LastAverageH:R_LastAverageL]
			MOVFW	R_LastAverageH	;  | ->R_PubReg5:R_PubReg4
			SUBWFC	R_PubReg1,0		; / 
			MOVWF	R_PubReg5		;/
			MOVFW	R_PubReg0		;\
			MOVWF	R_LastAverageL	; | [R_PubReg1:R_PubReg0]->R_LastAverageH:R_LastAverageL
			MOVFW	R_PubReg1		; |
			MOVWF	R_LastAverageH	;/
			MOVFW	R_PubReg4		;\
			ADDWF	R_DifferenceL,1	; | [R_DifferenceH:R_DifferenceL]+[R_PubReg5:R_PubReg4]
			MOVFW	R_PubReg5		; | ->R_DifferenceH:R_DifferenceL (累计差值)
			ADDWFC	R_DifferenceH,1	;/
			MOVFW	R_DifferenceL	;\
			MOVWF	R_PubReg4		; | [R_DifferenceH:R_DifferenceL]
			MOVFW	R_DifferenceH	; | ->R_PubReg5:R_PubReg4
			MOVWF	R_PubReg5		;/
			BTFSS	R_PubReg5,7
			GOTO	L_MainAdcP_2	;[R_PubReg5].7=0(正数) 转
			CALL	S_CalcABS1		;计算[R_PubReg5:R_PubReg4]的补码->R_PubReg5:R_PubReg4
L_MainAdcP_2:			
			MOVLW	0
			SUBWF	R_PubReg5,0
			BTFSS	STATUS,Z
			GOTO	L_MainAdcP_7	;[R_PubReg5]>0 (数据不稳) 转
			MOVFW	R_PubReg4
			SUBWF	R_OffsetCode,0
			BTFSS	STATUS,C
			GOTO	L_MainAdcP_7	;[R_PubReg4]>[R_OffsetCode] (数据不稳) 转
			BTFSC	R_PubFlag0,5
			GOTO	L_MainAdcP_5	;[R_PubFlag0].5=1(已锁定) 转
			MOVFW	R_LockCodeNum
			SUBWF	R_SteadyCnt,0
			BTFSC	STATUS,C
			GOTO	L_MainAdcP_3	;[R_SteadyCnt]≥[R_LockCodeNum](稳定次数到)转
			INCF	R_SteadyCnt,1	;稳定次数未到,[R_SteadyCnt]+1->R_SteadyCnt
			GOTO	L_MainAdcP_8
L_MainAdcP_3:
			BSF		R_PubFlag0,5	;1->R_PubFlag0.5 锁定
			BTFSC	R_PubFlag0,6
			GOTO	L_MainAdcP_4	;[R_PubFlag0].6=1 转
			BSF		R_PubFlag0,6	;1->R_PubFlag0.6
			BSF		R_PubFlag0,7	;1->R_PubFlag0.7
L_MainAdcP_4:
			MOVFW	R_WorkStatus
			ANDLW	70H
			XORLW	30H
			BTFSS	STATUS,Z
			GOTO	L_MainAdcP_8	;[R_WorkStatus]的高4位≠3且≠B,转
			MOVFW	R_LastAverageL	;\
			MOVWF	R_ZeroCodeL   	; | [R_LastAverageH:R_LastAverageL]->R_ZeroCodeH:R_ZeroCodeL
			MOVFW	R_LastAverageH	; | 标定中保存当前锁定内码
			MOVWF	R_ZeroCodeH		;/
			GOTO	L_MainAdcP_8
L_MainAdcP_5:
;			自动追重暂不处理
			GOTO	L_MainAdcP_8
L_MainAdcP_6:
			MOVLW	1
			CALL	S_ReadCode		;读当前内码->R_PubReg1:R_PubReg0
			MOVFW	R_PubReg0		;\
			MOVWF	R_LastAverageL	; | [R_PubReg1:R_PubReg0]->R_LastAverageH:R_LastAverageL
			MOVFW	R_PubReg1		; |
			MOVWF	R_LastAverageH	;/
			MOVLW	8
			MOVWF	R_Count			;8->R_Count
			MOVLW	R_CodeBuffer
			MOVWF	FSR0			;R_CodeBuffer->FSR0
L_MainAdcP_L1:
			MOVFW	R_PubReg0
			MOVWF	IND0
			INCF	FSR0,1
			MOVFW	R_PubReg1
			MOVWF	IND0
			INCF	FSR0,1
			DECFSZ	R_Count,1
			GOTO	L_MainAdcP_L1
			CLRF	R_CodePointer	;0->R_CodePointer
L_MainAdcP_7:
			BCF		R_PubFlag0,5	;0->R_PubFlag0.5 (数据不稳)
			CLRF	R_SteadyCnt		;0->R_SteadyCnt
			CLRF	R_DifferenceL	;0->R_DifferenceL
			CLRF	R_DifferenceH	;0->R_DifferenceH
L_MainAdcP_8:
			MOVLW	1
			CALL	S_ReadCode		;读当前内码->R_PubReg1:R_PubReg0
			BSF		R_PubFlag1,4	;1->R_PubFlag1.4
			MOVLW	D_OverCodeL		;\
			SUBWF	R_PubReg0,0		; | [R_PubReg1:R_PubReg0]-D_OverCodeH:D_OverCodeL
			MOVLW	D_OverCodeH		; | (内码超载判断)
			SUBWFC	R_PubReg1,0		;/
			BTFSS	STATUS,C
			BCF		R_PubFlag1,4	;内码不超载,0->R_PubFlag1.4
			BTFSS	R_PubFlag0,5
			GOTO	L_Main_5		;[R_PubFlag0].5=0(内码未锁定) 转
			BTFSS	R_PubFlag0,7
			GOTO	L_Main_5		;[R_PubFlag0].7=0, 转
			BCF		R_PubFlag0,7	;0->R_PubFlag0.7
			BTFSC	R_PubFlag1,4
			GOTO	L_Main_5		;[R_PubFlag1]=1(内码超载) 转
			MOVFW	R_LastAverageL	;\
			MOVWF	R_ZeroCodeL   	; | [R_LastAverageH:R_LastAverageL]->R_ZeroCodeH:R_ZeroCodeL
			MOVFW	R_LastAverageH	; | 保存零点内码
			MOVWF	R_ZeroCodeH		;/
L_Main_5:
			BTFSS	R_KeyStatus,7
			GOTO	L_Main_6		;[R_KeyStatus].7=0 转
;            CALL    S_CalcDelay	;计算自动关机时间(单位:秒)->3DH:3CH
			MOVFW	R_WorkStatus
			ANDLW	70H
			XORLW	30H
			BTFSC	STATUS,Z
			GOTO	L_Main_6		;[R_WorkStatus]的高4位=3或=B(标定状态),转
			MOVLW	0CH
			SUBWF	R_KeyCode,0
			BTFSS	STATUS,Z
			GOTO	L_Main_51		;[R_KeyCode]≠0CH(不是"OFF"键短键释放) 转
			MOVLW	40H				;"OFF"键短键释放
			MOVWF	R_WorkStatus	;40H->R_WorkStatus 关机
L_Main_51:			
			MOVLW	0E5H
			SUBWF	R_KeyStatus,0
			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:						;找零点
			BTFSC	R_DispFlag,0
			GOTO	L_BattLowProc	;[R_DispFlag].0=1(电池电压低) 转
;
			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_CalcDelay	;计算自动关机时间(单位:秒)->3DH:3CH
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:							;计算并显示重量值
;			GOTO	L_DispCaliCode	;去显示内码
;下面计算出重量值,并根据公/英制要求送显示缓冲区
L_CalcHeft4:
			BTFSS	R_PubFlag0,4
			GOTO	L_CalcHeftRet	;[R_PubFlag0].4=0(无新的有效内码) 转,返回
			MOVLW	01H
			ANDWF	R_DispFlag,1	;0->R_DispFlag.7:1
			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		;/
;;
;			MOVFW	R_PubReg4
;			MOVWF	R_PubReg2
;			MOVFW	R_PubReg5
;			MOVWF	R_PubReg3
;			GOTO	L_DispHeft
;;
			CALL	S_CalcABS		;计算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]绝对值->R_PubReg5:R_PubReg4
			BTFSC	R_PubFlag1,3
			BSF		R_DispFlag,2	;[R_PubFlag1].3=1,1->R_DispFlag.2 显示负号
			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]

⌨️ 快捷键说明

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