📄 9821h621.asm
字号:
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 + -