📄 9821h621.asm
字号:
BCF R_PubFlag1,7 ;0->R_PubFlag1.7
BSF R_PubFlag0,0 ;1/16秒到
CALL S_ReadKey ;读按键,并作简单判断处理
MOVLW 04H
XORWF R_PubFlag0,1 ;R_PubFlag0.2取反
BTFSC R_PubFlag0,2
GOTO L_MainAdcProc ;[R_PubFlag0.2]=1 (未到1/8秒) 转
INCF R_TimerCnt,1 ;[R_TimerCnt]+1->R_TimerCnt
;
BCF R_DispFlag,0 ;0->R_DispFlag.0(电池符号)
BTFSS SVD,LBOUT
BSF R_DispFlag,0 ;LBOUT=0(电池低电压),1->R_DispFlag.0 显示电池符号
;
L_Main_1:
MOVLW 03H
ANDWF R_TimerCnt,0
BTFSS STATUS,Z
GOTO L_MainAdcProc ;[R_TimerCnt]&03H≠0(未到1/2秒) 转
BSF R_PubFlag0,1 ;1->R_PubFlag0.1
MOVLW 07H
ANDWF R_TimerCnt,0
BTFSS STATUS,Z
GOTO L_MainAdcProc ;[R_TimerCnt]&07H≠0(未到1秒) 转
CALL S_DecOffTime ;自动关机时间(单位:秒)-1->R_OffTimerH:R_OffTimerL,若已减到0则准备关机
;
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 转
;
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 ;/
;
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,3 ;0->R_CodePointer.3
DECF R_CodePointer,0 ;\
ANDLW 07H ; \
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:
MOVLW 20
SUBWF R_PubReg4,0
MOVLW 0
SUBWFC R_PubReg5,0
;
; 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 8
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_41 ;[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_41:
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
CLRF R_2dWeightCnt ;0->R_2dWeightCnt
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].4=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_CalcOffTime ;计算自动关机时间(单位:秒)->R_OffTimerH:R_OffTimerL
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_6 ;[R_KeyCode]≠0CH(不是"Cali"键短键释放) 转
MOVLW 30H
MOVWF R_WorkStatus ;"Cali"键短键释放进入标定状态
CLRF R_ZeroCodeL ;0->R_ZeroCodeL
CLRF R_ZeroCodeH ;0->R_ZeroCodeH
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
BCF R_PubFlag1,5 ;0->R_PubFlag1.5
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(电池电压正常) 转
INCF R_BattLowCnt,1 ;[R_DispFlag].0=1(电池电压低),[R_BattLowCnt]+1->R_BattLowCnt
; MOVLW 4
; SUBWF R_BattLowCnt,0
; BTFSC STATUS,C
; GOTO L_BattLowProc ;[R_BattLowCnt]≥4 转
L_MainFunc0_0:
BTFSS R_DispFlag,0
CLRF R_BattLowCnt ;[R_DispFlag].0=0(电池电压正常),0->R_BattLowCnt
;
; CALL S_DispCaliCode ;去显示内码
;
BTFSS R_PubFlag0,6
GOTO L_MainFunc0Ret ;[R_PubFlag0].6=0 转
BTFSC R_WorkStatus,0
GOTO L_MainFunc0_1 ;[R_WorkStatus].0=1 转
BSF PT1,7 ;1->PT1.7 点亮背光灯
BSF R_WorkStatus,0 ;1->R_WorkStatus.0
CLRF R_PubFlag0,6 ;0->R_PubFlag0.6
GOTO L_MainFunc0_2
L_MainFunc0_1:
MOVLW 10H
MOVWF R_WorkStatus ;10H->R_WorkStatus 进入称重状态
L_MainFunc0_2:
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: ;计算并显示重量值
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(超载) 转,显示超载错误
L_CalcHeft_1:
MOVFW R_ZeroCodeL ;\
MOVWF R_PubReg4 ; | 当前零点内码[R_ZeroCodeH:R_ZeroCodeL]
MOVFW R_ZeroCodeH ; | ->R_PubReg5:R_PubReg4
MOVWF R_PubReg5 ;/
CALL S_CalcRelWeight ;计算[R_PubReg5:R_PubReg4]中的内码相对于标定零点的重量
; ->R_PubReg3:R_PubReg0,[R_PubFlag1].3=1为负数
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 ;/
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]中的内码相对于标定零点的重量
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -