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

📄 9821h621.asm

📁 用台湾富晶单片机开发的电子称包括源码和编译器
💻 ASM
📖 第 1 页 / 共 5 页
字号:
            MOVFW   R_PubReg1       ;  |
            MOVWF   R_TmpPubReg1    ;  | [R_PubReg3:R_PubReg0]
            MOVFW   R_PubReg2       ;  | ->R_TmpPubReg3:R_TmpPubReg0 暂存
            MOVWF   R_TmpPubReg2    ;  |
            MOVFW   R_PubReg3       ; /
            MOVWF   R_TmpPubReg3    ;/
            BCF     R_PubFlag1,6    ;0->R_PubFlag1.6
            BTFSC   R_PubFlag1,3
            BSF     R_PubFlag1,6    ;[R_PubFlag1].3=1,1->R_PubFlag1.6
L_CalcHeft_11:
			MOVFW	R_LastAverageL	;\
			MOVWF	R_PubReg4		; | [R_LastAverageH:R_LastAverageL] (当前平均内码)
			MOVFW	R_LastAverageH	; | ->R_PubReg5:R_PubReg4
			MOVWF	R_PubReg5		;/
			CALL    S_CalcRelWeight ;计算[R_PubReg5:R_PubReg4]中的内码相对于标定零点的重量
;			                          ->R_PubReg3:R_PubReg0,[R_PubFlag1].3=1为负数
            BCF     R_DispFlag,5	;0->R_DispFlag.5 负号显示
            BTFSS   R_PubFlag1,3
            GOTO    L_CalcHeft_14   ;[R_PubFlag1].3=0 转
            BTFSS   R_PubFlag1,6    ;[R_PubFlag1].3=1;
            GOTO    L_CalcHeft_15   ;[R_PubFlag1].6=0 转
L_CalcHeft_12:      ;[R_PubFlag1].3=1,[R_PubFlag1].6=1 //[R_PubFlag1].3=0,[R_PubFlag1].6=0
            MOVFW   R_TmpPubReg0    ;\
            SUBWF   R_PubReg0,1     ; \
            MOVFW   R_TmpPubReg1    ;  |
            SUBWFC  R_PubReg1,1     ;  | [R_PubReg3:R_PubReg0]-[R_TmpPubReg3:R_TmpPubReg0]
            MOVFW   R_TmpPubReg2    ;  | ->R_PubReg3:R_PubReg0
            SUBWFC  R_PubReg2,1     ;  |
            MOVFW   R_TmpPubReg3    ; /
            SUBWFC  R_PubReg3,1     ;/
            BTFSC	STATUS,C
            GOTO    L_CalcHeft_13   ;无借位,转
            MOVLW   0FFH            ;\
            XORWF   R_PubReg0,1     ; \
            MOVLW   0FFH            ;  |
            XORWF   R_PubReg1,1     ;  |
            MOVLW   0FFH            ;  |
            XORWF   R_PubReg2,1     ;  |
            MOVLW   0FFH            ;  | 有借位,计算[R_PubReg3:R_PubReg0]的补码
            XORWF   R_PubReg3,1     ;  | ->R_PubReg3:R_PubReg0
            MOVLW   1               ;  |
            ADDWF   R_PubReg0,1     ;  |
            MOVLW   0               ;  |
            ADDWFC  R_PubReg1,1     ;  |
            MOVLW   0               ;  |
            ADDWFC  R_PubReg2,1     ;  |
            MOVLW   0               ; /
            ADDWFC  R_PubReg3,1     ;/
            BTFSS   R_PubFlag1,6
			BSF		R_DispFlag,5	;[R_PubFlag1].6=0,1->R_DispFlag.5 显示负号
            GOTO    L_CalcHeft_2
L_CalcHeft_13:
            BTFSC   R_PubFlag1,6
			BSF		R_DispFlag,5	;[R_PubFlag1].6=0,1->R_DispFlag.5 显示负号
            GOTO    L_CalcHeft_2
L_CalcHeft_14:
            BTFSS   R_PubFlag1,6    ;[R_PubFlag1].3=0;
			GOTO	L_CalcHeft_12	;[R_PubFlag1].6=0 转
L_CalcHeft_15:      ;[R_PubFlag1].3=1,[R_PubFlag1].6=0 //[R_PubFlag1].3=0,[R_PubFlag1].6=1
            MOVFW   R_TmpPubReg0    ;\
            ADDWF   R_PubReg0,1     ; \
            MOVFW   R_TmpPubReg1    ;  |
            ADDWFC  R_PubReg1,1     ;  | [R_PubReg3:R_PubReg0]+[R_TmpPubReg3:R_TmpPubReg0]
            MOVFW   R_TmpPubReg2    ;  | ->R_PubReg3:R_PubReg0
            ADDWFC  R_PubReg2,1     ;  |
            MOVFW   R_TmpPubReg3    ; /
            ADDWFC  R_PubReg3,1     ;/
            BTFSC   R_PubFlag1,3
			BSF		R_DispFlag,5	;[R_PubFlag1].3=1,1->R_DispFlag.5 显示负号
L_CalcHeft_2:
            MOVFW   R_PubReg0       ;\
            MOVWF   R_TmpPubReg0    ; \
            MOVFW   R_PubReg1       ;  |
            MOVWF   R_TmpPubReg1    ;  | [R_PubReg3:R_PubReg0]
            MOVFW   R_PubReg2       ;  | ->R_TmpPubReg3:R_TmpPubReg0 暂存
            MOVWF   R_TmpPubReg2    ;  |
            MOVFW   R_PubReg3       ; /
            MOVWF   R_TmpPubReg3    ;/
;
            MOVFW   R_PubReg2       ;\
            MOVWF   R_PubReg0       ; | [R_PubReg3:R_PubReg2]
            MOVFW   R_PubReg3       ; | ->R_PubReg1:R_PubReg0
            MOVWF   R_PubReg1       ;/
            MOVFW   R_LockWeightL   ;\
            MOVWF   R_PubReg4       ; | [R_LockWeightH:R_LockWeightL]
            MOVFW   R_LockWeightH   ; | ->R_PubReg5:R_PubReg4
            MOVWF   R_PubReg5       ;/
			CALL	S_CalcABS		;计算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]绝对值->R_PubReg5:R_PubReg4
;
            MOVFW   R_TmpPubReg0    ;\
            MOVWF   R_PubReg0       ; \
            MOVFW   R_TmpPubReg1    ;  |
            MOVWF   R_PubReg1       ;  | [R_TmpPubReg3:R_TmpPubReg0]
            MOVFW   R_TmpPubReg2    ;  | ->R_PubReg3:R_PubReg0
            MOVWF   R_PubReg2       ;  |
            MOVFW   R_TmpPubReg3    ; /
            MOVWF   R_PubReg3       ;/
;
            MOVLW   10
            SUBWF   R_PubReg4,0
            MOVLW   0
            SUBWFC  R_PubReg5,0
            BTFSS   STATUS,C
            GOTO    L_CalcHeft_21   ;[R_PubReg5:R_PubReg4]<10 转
            MOVFW   R_PubReg2       ;\
            MOVWF   R_LockWeightL   ; | [R_PubReg3:R_PubReg0]
            MOVFW   R_PubReg3       ; | ->R_LockWeightH:R_LockWeightL
            MOVWF   R_LockWeightH   ;/
            CALL    S_CalcOffTime	;计算自动关机时间(单位:秒)->R_OffTimerH:R_OffTimerL
L_CalcHeft_21:
            MOVLW   2
            SUBWF   R_PubReg2,0
            MOVLW   0
            SUBWFC  R_PubReg3,0
            BTFSC   STATUS,C
            GOTO    L_CalcHeft_3    ;[R_PubReg3:R_PubReg2]≥2 转
			BTFSS	R_PubFlag0,5
			GOTO	L_CalcHeft_23	;[R_PubFlag0].5=0(称重数据不稳定) 转
			MOVFW	R_LockCodeNum
			SUBWF	R_2dWeightCnt,0
			BTFSC   STATUS,C
			GOTO	L_CalcHeft_22	;[R_2dWeightCnt]≥[R_LockCodeNum] 转
			INCF	R_2dWeightCnt,1	;[R_2dWeightCnt]+1->R_2dWeightCnt
			GOTO	L_CalcHeft_23
L_CalcHeft_22:
			MOVFW	R_LastAverageL	;\
			MOVWF	R_ZeroCodeL   	; | [R_LastAverageH:R_LastAverageL]->R_ZeroCodeH:R_ZeroCodeL
			MOVFW	R_LastAverageH	; | 保存零点内码
			MOVWF	R_ZeroCodeH		;/
L_CalcHeft_23:
            BCF     R_DispFlag,5	;0->R_DispFlag.5 不显示负号
			GOTO	L_CalcHeft_31
L_CalcHeft_3:
			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	;/
			MOVLW   D_P21
			CALL	S_RdMinDispV	;读最小显示值
			SUBWF	R_PubReg2,0
			MOVLW	0
			SUBWFC	R_PubReg3,0
			BTFSC	STATUS,C
			GOTO	L_CalcHeft_32	;[R_PubReg3:R_PubReg2]≥最小显示分度数 转
L_CalcHeft_31:
			CLRF	R_PubReg3	    ;0->R_PubReg3
			CLRF	R_PubReg2	    ;0->R_PubReg2
			CLRF	R_PubReg1	    ;0->R_PubReg1
			GOTO	L_CalcHeft_33
L_CalcHeft_32:
			MOVLW	14H
			SUBWF	R_PubReg2,0
			MOVLW	0
			SUBWFC	R_PubReg3,0
			BTFSC	STATUS,C
			GOTO	L_CalcHeft_35	;[R_PubReg3:R_PubReg2]≥0014H 转
L_CalcHeft_33:
			BTFSS	R_PubFlag1,1
			GOTO	L_CalcHeft_34	;[R_PubFlag1].1=0(未锁定) 转
			BCF		R_PubFlag1,1	;0->R_PubFlag1.1 解锁
L_CalcHeft_34:
			GOTO	L_CalcHeft_4
L_CalcHeft_35:
			BTFSC	R_PubFlag1,1
			GOTO	L_CalcHeft_36	;[R_PubFlag1].1=1(已锁定) 转
			CALL	S_CalcOffTime	;计算自动关机时间(单位:秒)->R_OffTimerH:R_OffTimerL
			BTFSS	R_PubFlag0,5
			GOTO	L_CalcHeft_4	;[R_PubFlag0].5=0 (称重数据不稳定) 转
			BSF		R_PubFlag1,1	;1->R_PubFlag1.1 锁定
            MOVFW   R_PubReg2       ;\
            MOVWF   R_LockWeightL   ; | [R_PubReg3:R_PubReg0]
            MOVFW   R_PubReg3       ; | ->R_LockWeightH:R_LockWeightL
            MOVWF   R_LockWeightH   ;/
			GOTO	L_CalcHeft_4
L_CalcHeft_36:
			BSF		R_DispFlag,4	;1->R_DispFlag.4 显示锁符
			GOTO	L_CalcHeftRet
;
L_CalcHeft_4:
			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:
            BTFSC   R_PubFlag1,5
            GOTO    L_DispHeft_11   ;[R_PubFlag1].5=1 (计量单位=lb) 转
			MOVLW	80H				;\
			ADDWF	R_PubReg1,0		; | 计量单位=kg,分度值=1
			MOVLW	0				; | [R_PubReg3:R_PubReg2]+0.5
			ADDWFC	R_PubReg2,1		; | ->R_PubReg3:R_PubReg2
			MOVLW	0				; | (四舍五入)
			ADDWFC	R_PubReg3,1		;/
            GOTO    L_DispHeft_12
L_DispHeft_11:
			MOVLW	1				;\  计量单位=lb,分度值=2
			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
L_DispHeft_12:
			MOVLW	D_DecimalDigits
			MOVWF	R_DispMode		;D_DecimalDigits(小数位数)->R_DispMode
			BSF		R_DispMode,2	;1->R_DispMode.2 显示计量单位
			BTFSS	R_PubFlag1,1
			GOTO	L_DispHeft_2	;[R_PubFlag1].1=0(未锁定) 转
			BSF		R_DispFlag,4	;[R_PubFlag1].1=1(称重数据锁定),1->R_DispFlag.4 显示锁符
			MOVLW	0A0H
			MOVWF	R_PubCnt1		;0A0H->R_PubCnt1,定时10秒
			MOVLW	0C0H
			MOVWF	R_WorkStatus	;0C0H->R_WorkStatus,2秒后关机
			BCF     NETE,ENVS       ;0->NETE.ENVS 关VS输出
			BCF     PT2,2           ;0->PT2.2 关传感器电源
L_DispHeft_2:
			CALL    S_Hex2BCD		;将[R_PubReg3:R_PubReg2]转换为5位BCD码->R_DispBuff4:R_DispBuff0
			GOTO	S_Display		;去显示
L_CalcHeftRet:
			RETURN
;
S_RdMinDispV:		;读最小显示值
			ADDPCW
			RETLW	2		;D_P21=0,最小显示值=0.2KG
			RETLW	4		;D_P21=1,最小显示值=0.4KG
			RETLW	5		;D_P21=2,最小显示值=0.5KG
			RETLW	8		;D_P21=3,最小显示值=0.8KG
			RETLW	10		;D_P21=4,最小显示值=1.0KG
			RETLW	12		;D_P21=5,最小显示值=1.2KG
			RETLW	15		;D_P21=6,最小显示值=1.5KG
			RETLW	20		;D_P21=7,最小显示值=2.0KG
			RETLW	25		;D_P21=8,最小显示值=2.5KG
			RETLW	50		;D_P21=9,最小显示值=5.0KG
;
L_DispOverErr:						;显示超载错误
			CALL	S_ClrDisp
			MOVLW	0FH
			MOVWF	R_DispBuff3		;0FH("F")->R_DispBuff3
			MOVWF	R_DispBuff2		;0FH("F")->R_DispBuff2
			MOVWF	R_DispBuff1		;0FH("F")->R_DispBuff1
			MOVWF	R_DispBuff0		;0FH("F")->R_DispBuff0
			MOVLW	08H	
			MOVWF	R_DispMode		;08H->R_DispMode,无小数点,16进制显示方式
			GOTO	S_Display		;去显示
;------------------------------------------------------------------------------
L_CaliProc:							;标定处理		
			MOVLW	80H
			ANDWF	R_DispFlag,1	;0->R_DispFlag.6:0
			BTFSC	R_WorkStatus,3
			GOTO	L_CaliOver	    ;[R_WorkStatus].3=1(标定完成) 转
			BTFSC	R_KeyStatus,7
			GOTO	L_CaliProc_1	;[R_KeyStatus].7=1 转
			BTFSC	R_KeyStatus,4	;[R_KeyStatus].7=0
			GOTO	L_DispCaliCode	;[R_KeyStatus].4=1 转去显示内码
			MOVFW	R_KeyCode
			ANDLW	0FH
			SUBLW	06H
			BTFSC	STATUS,Z
			GOTO	L_DispDate		;[R_KeyCode].2:0=6("TARE"键按下)转去显示日期
			GOTO	L_DispCaliCode	;去显示内码
L_CaliProc_1:
			MOVLW	0CH
			SUBWF	R_KeyCode,0
			BTFSS	STATUS,Z
			GOTO	L_CaliProcRet	;[R_KeyCode]≠0CH(不是"Cali"键短键释放) 转,返回
			MOVLW	70H
			IORWF	R_KeyStatus,1	;7->R_KeyStatus.7:4
			BTFSC	R_WorkStatus,0
			GOTO	L_CaliProc_3	;[R_WorkStatus].0=1 转
			MOVFW	R_ZeroCodeL		;\
			MOVWF	R_CaliCode0L	; | [R_ZeroCodeH:R_ZeroCodeL]
			MOVFW	R_ZeroCodeH		; | ->R_CaliCode0H:R_CaliCode0L
			MOVWF	R_CaliCode0H	;/  暂存零点内码
			BSF     R_WorkStatus,0  ;1->R_WorkStatus.0
			CALL	S_ClrDisp       ;清显示,然后显示“0.0KG”
L_CaliProc_2:
			CLRF    R_DispBuff0     ;0->R_DispBuff0
			CLRF    R_DispBuff1     ;0->R_DispBuff1
			MOVLW   05H
			MOVWF   R_DispMode      ;05H->R_DispMode(显示计量单位、1位小数)
			MOVLW	10H
			MOVWF	R_PubCnt1		;10H->R_PubCnt1,定时1秒
			BSF     R_WorkStatus,7  ;1->R_WorkStatus.7
			GOTO    S_Display
L_CaliProc_3:
			MOVLW	R_CaliCode0L
			MOVWF	FSR0
			BTFSS	R_WorkStatus,1
			GOTO	L_CaliProc_31	;[R_WorkStatus].1=0 转
			INCF	FSR0,1			;[FSR0]+1->FSR
			INCF	FSR0,1			;[FSR0]+1->FSR
			BTFSS	R_WorkStatus,2
			GOTO	L_CaliProc_31	;[R_WorkStatus].2=0 转
			INCF	FSR0,1			;[FSR0]+1->FSR
			INCF	FSR0,1			;[FSR0]+1->FSR
L_CaliProc_31:
			MOVFW	IND0
			MOVWF	R_PubReg0		;[IND0]->R_PubReg0
			INCF	FSR0,1			;[FSR0]+1->FSR
			MOVFW	IND0
			MOVWF	R_PubReg1		;[IND0]->R_PubReg1
			BTFSC	R_WorkStatus,2
			GOTO	L_CaliProc_30	;[R_WorkStatus].2=1(标定120KG) 转
			INCF	FSR0,1			;[FSR0]+1->FSR
            MOVFW   R_ZeroCodeL
            MOVWF   IND0            ;保存标定内码低字节
			INCF	FSR0,1			;[FSR0]+1->FSR
            MOVFW   R_ZeroCodeH
            MOVWF   IND0            ;保存标定内码高字节
L_CaliProc_30:

⌨️ 快捷键说明

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