?? 9821h620.asm
字號:
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
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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -