📄 新建 文本文档.asm
字号:
L_InitOther:
CALL S_CalcUnitData ;计算1d对应的不同计量单位的值(浮点数),
; 结果->R_UnitData2(2的指数)、R_UnitData1:R_UnitData0(有效数字)
CALL S_CalcLockCode ;计算锁定判断的内码值->R_OffsetCode
CALL S_CalcOffTime ;计算自动关机时间(单位:秒)->R_OffTimerH:R_OffTimerL
CLRF INTF
MOVLW 10010100B
MOVWF INTE ;GIE=1,TMIE=1,ADIE=1
L_InitEnd:
;
L_MainLoop: ;主循环
BTFSS R_PubFlag1,7
GOTO L_MainAdcProc ;[R_PubFlag1].7=0(未到1/16秒),转
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
GOTO L_Main_BattLow ;LBOUT=0(电池低电压) 转
BCF LCD1,0 ;电池电压正常,0->LCD1.0 不显示电池符号
CLRF R_BattLowCnt ;电池电压正常,0->R_BattLowCnt
GOTO L_Main_0
L_Main_BattLow:
BSF R_DispFlag,0 ;LBOUT=0(电池低电压),1->R_DispFlag.0 显示电池符号
BSF LCD1,0 ;电池低电压,1->LCD1.0 显示电池符号
INCF R_BattLowCnt,1 ;电池电压低,[R_BattLowCnt]+1->R_BattLowCnt
BCF R_BattLowCnt,7 ;0->R_BattLowCnt.7
;
L_Main_0:
MOVFW R_WorkStatus
ANDLW 0F0H
SUBLW 10H
BTFSS STATUS,Z
GOTO L_Main_1 ;[R_WorkStatus].7:4≠1(不是称重状态) 转
BTFSS R_PubFlag0,5
CLRF R_SteadyTimer ;[R_PubFlag0].5=0(称重不稳定),0->R_SteadyTimer
INCF R_SteadyTimer,1 ;[R_SteadyTimer]+1->R_SteadyTimer
BTFSC STATUS,Z
DECF R_SteadyTimer,1 ;[R_SteadyTimer]=0,[R_SteadyTimer]-1->R_SteadyTimer
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:
MOVFW R_LastAverageL ;\
MOVWF R_SteadyCodeL ; | [R_LastAverageH:R_LastAverageL]
MOVFW R_LastAverageH ; | ->R_SteadyCodeH:R_SteadyCodeL 保存稳定内码数据
MOVWF R_SteadyCodeH ;/
GOTO L_MainAdcP_8
;
L_MainAdcP_5:
BTFSC R_CaliP1L,6
GOTO L_MainAdcP_8 ;[R_CaliP1L].6=1(无自动追重) 转
MOVFW R_WorkStatus
ANDLW 70H
XORLW 30H
BTFSC STATUS,Z
GOTO L_MainAdcP_8 ;[R_WorkStatus]的高4位=3或=B(标定中),转
; DECFSZ R_TraceCnt,1
; GOTO L_MainAdcP_8 ;[R_TraceCnt]-1->R_TraceCnt,[R_TraceCnt]≠0 转
; MOVLW D_TraceCnt
; MOVWF R_TraceCnt ;D_TraceCnt->R_TraceCnt
MOVFW R_SteadyCodeL ;\
MOVWF R_PubReg0 ; | [R_SteadyCodeH:R_SteadyCodeL]
MOVFW R_SteadyCodeH ; | ->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
; R_PubFlag1.3 =1时减法结果为负数
MOVFW R_PubReg4
IORWF R_PubReg5,0
BTFSC STATUS,Z
GOTO L_MainAdcP_8 ;[R_PubReg5:R_PubReg4]=0(无需自动追重) 转
BTFSC R_PubFlag1,3
GOTO L_MainAdcP_51 ;[R_PubFlag1].3=1(减法结果为负数) 转
BTFSC R_PubFlag1,5
GOTO L_MainAdcP_52 ;[R_PubFlag1].5=1(上次减法结果为负数) 转
DECFSZ R_TraceCnt,1
GOTO L_MainAdcP_8 ;[R_TraceCnt]-1->R_TraceCnt,[R_TraceCnt]≠0 转
MOVLW D_TraceCnt
MOVWF R_TraceCnt ;D_TraceCnt->R_TraceCnt
MOVLW 1 ;\
ADDWF R_SteadyCodeL,1 ; | [R_SteadyCodeH:R_SteadyCodeL]+1
MOVLW 0 ; | ->R_SteadyCodeH:R_SteadyCodeL
ADDWFC R_SteadyCodeH,1 ;/
MOVLW 1 ;\
ADDWF R_ZeroCodeL,1 ; | [R_ZeroCodeH:R_ZeroCodeL]+1
MOVLW 0 ; | ->R_ZeroCodeH:R_ZeroCodeL
ADDWFC R_ZeroCodeH,1 ;/ 零点微调
GOTO L_MainAdcP_8
L_MainAdcP_51:
BTFSS R_PubFlag1,5
GOTO L_MainAdcP_53 ;[R_PubFlag1].5=0(上次减法结果为正数) 转
DECFSZ R_TraceCnt,1
GOTO L_MainAdcP_8 ;[R_TraceCnt]-1->R_TraceCnt,[R_TraceCnt]≠0 转
MOVLW D_TraceCnt
MOVWF R_TraceCnt ;D_TraceCnt->R_TraceCnt
MOVLW 1 ;\
SUBWF R_SteadyCodeL,1 ; | [R_SteadyCodeH:R_SteadyCodeL]-1
MOVLW 0 ; | ->R_SteadyCodeH:R_SteadyCodeL
SUBWFC R_SteadyCodeH,1 ;/
MOVLW 1 ;\
SUBWF R_ZeroCodeL,1 ; | [R_ZeroCodeH:R_ZeroCodeL]-1
MOVLW 0 ; | ->R_ZeroCodeH:R_ZeroCodeL
SUBWFC R_ZeroCodeH,1 ;/ 零点微调
GOTO L_MainAdcP_8
L_MainAdcP_52:
BCF R_PubFlag1,5 ;0->R_PubFlag1.5
GOTO L_MainAdcP_54
L_MainAdcP_53:
BSF R_PubFlag1,5 ;1->R_PubFlag1.5
L_MainAdcP_54:
MOVLW D_TraceCnt
MOVWF R_TraceCnt ;D_TraceCnt->R_TraceCnt
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
MOVLW 8
MOVWF R_TraceCnt ;8->R_TraceCnt
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_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_51 ;[R_KeyCode]≠0CH(不是"OFF"键短键释放) 转
MOVLW 40H ;"OFF"键短键释放
MOVWF R_WorkStatus ;40H->R_WorkStatus 关机
L_Main_51:
MOVLW 0E5H
SUBWF R_KeyStatus,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -