?? 9821h620.asm
字號:
;------------------------------------------------------------------------------
;子程序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(電池電壓正常) 轉
MOVLW 4
SUBWF R_BattLowCnt,0
BTFSC STATUS,C
GOTO L_BattLowProc ;[R_BattLowCnt]≥4 轉
L_MainFunc0_0:
; CALL S_DispCaliCode ;去顯示內碼
CALL S_ClrDisp ;清LCD顯示緩沖區LCD1-LCD6
INCF R_WorkStatus,1 ;[R_WorkStatus]+1->R_WorkStatus
BCF R_WorkStatus,2 ;0->R_WorkStatus.2
MOVFW R_WorkStatus
ANDLW 03H
SUBLW R_DispBuff3
MOVWF FSR0
MOVLW 08H
MOVWF IND0 ;08H("8")->IND0
MOVLW 08H
MOVWF R_DispMode ;1->R_DispMode.3 顯示提示信息
CALL S_Display ;顯示
MOVLW 08H
MOVWF R_PubCnt1 ;08H->R_PubCnt1,定時0.5秒
BSF R_WorkStatus,7 ;1->R_WorkStatus.7
;
BTFSS R_PubFlag0,6
GOTO L_MainFunc0Ret ;[R_PubFlag0].6=0 轉
MOVLW 10H
MOVWF R_WorkStatus ;10H->R_WorkStatus 進入稱重狀態
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: ;計算并顯示重量值
BTFSC R_KeyStatus,3
GOTO L_CalcHeft3 ;[R_KeyStatus].3=1 轉
BTFSS R_KeyStatus,7
GOTO L_CalcHeft4 ;[R_KeyStatus].7=0 轉
MOVFW R_KeyCode
SUBLW 0EH
BTFSC STATUS,Z
GOTO L_CalcHeft1 ;[R_KeyCode]=0EH("TARE"鍵釋放)轉,去皮
MOVFW R_KeyCode
SUBLW 15H
BTFSC STATUS,Z
GOTO L_CalcHeft2 ;[R_KeyCode]=15H("Unit"鍵按下10秒) 轉,快速標定
MOVFW R_KeyCode
SUBLW 0DH
BTFSS STATUS,Z
GOTO L_CalcHeft4 ;[R_KeyCode]≠0DH(不是"Unit"鍵短鍵釋放) 轉
BSF R_PubFlag0,4 ;1->R_PubFlag0.4 有效內碼,待計算
MOVFW R_CaliP1L
ANDLW 0FH
BTFSS STATUS,Z
GOTO L_SelectUnit ;[R_CaliP1L].3:0≠0(P1.0≠0) 轉 切換計量單位
CLRF R_UnitSelect ;0->R_UnitSelect 默認單位為g
GOTO L_SelectUnit4
;----------- 切換計量單位 --------
L_SelectUnit:
INCF R_UnitSelect,1 ;[R_UnitSelect]+1->R_UnitSelect 切換計量單位
BCF R_UnitSelect,2 ;0->R_UnitSelect.2
MOVFW R_UnitSelect
ADDPCW
GOTO L_SelectUnit0 ;[R_UnitSelect]=0
GOTO L_SelectUnit1 ;[R_UnitSelect]=1
GOTO L_SelectUnit2 ;[R_UnitSelect]=2
; GOTO L_SelectUnit3 ;[R_UnitSelect]=3
L_SelectUnit3:
BTFSS R_CaliP1L,1
GOTO L_SelectUnit ;[R_CaliP1L].1=0(未選擇lb) 轉 重新切換下一個計量單位
GOTO L_SelectUnit4
L_SelectUnit2:
BTFSS R_CaliP1L,0
GOTO L_SelectUnit ;[R_CaliP1L].0=0(未選擇kg) 轉 重新切換下一個計量單位
GOTO L_SelectUnit4
L_SelectUnit1:
BTFSS R_CaliP1L,3
GOTO L_SelectUnit ;[R_CaliP1L].3=0(未選擇oz) 轉 重新切換下一個計量單位
GOTO L_SelectUnit4
L_SelectUnit0:
BTFSS R_CaliP1L,2
GOTO L_SelectUnit ;[R_CaliP1L].2(未選擇g) 轉 重新切換下一個計量單位
L_SelectUnit4:
GOTO S_CalcUnitData ;計算1d對應的不同計量單位的值(浮點數),
; 結果->R_UnitData2(2的指數)、R_UnitData1:R_UnitData0(有效數字)
;----------- 去皮 ----------------
L_CalcHeft1:
BSF R_PubFlag0,7 ;1->R_PubFlag0.7 讀當前內碼作為零點內碼(去皮)
GOTO L_CalcHeftRet ;返回
;----------- 快速標定 ------------
L_CalcHeft2:
MOVLW 20H
MOVWF R_PubCnt1 ;20H->R_PubCnt1
BCF R_WorkStatus,2 ;0->R_WorkStatus.2
BSF R_WorkStatus,3 ;1->R_WorkStatus.3
MOVFW R_CaliDataL ;\
MOVWF R_TempCaliDataL ; | [R_CaliDataH:R_CaliDataL]
MOVFW R_CaliDataH ; | ->R_TempCaliDataH:R_TempCaliDataL 暫存
MOVWF R_TempCaliDataH ;/
BTFSC R_PubFlag0,5
GOTO L_CalcHeft21 ;[R_PubFlag0].5=1(稱重數據穩定),轉
MOVFW R_LastAverageL ;\
MOVWF R_SteadyCodeL ; | [R_LastAverageH:R_LastAverageL]
MOVFW R_LastAverageH ; | ->R_SteadyCodeH:R_SteadyCodeL 數據不穩,取當前的平均值
MOVWF R_SteadyCodeH ;/
L_CalcHeft21:
MOVLW 00H ;\
MOVWF R_PubReg0 ; | 0100H (快速標定分度數=1000)
MOVFW 01H ; | ->R_PubReg1:R_PubReg0
MOVWF R_PubReg1 ;/
GOTO S_CaliCodeComm ;標定時計算每個內碼相當于重量的分度數×65536->R_CaliDataH:R_CaliDataL
;
L_CalcHeft22:
MOVFW R_TempCaliDataL ;\
MOVWF R_CaliDataL ; | [R_TempCaliDataH:R_TempCaliDataL]
MOVFW R_TempCaliDataH ; | ->R_CaliDataH:R_CaliDataL 恢復原來的標定數據
MOVWF R_CaliDataH ;/
L_CalcHeft23:
BCF R_WorkStatus,3 ;0->R_WorkStatus.3
MOVFW R_KeyStatus
ANDLW 7FH
IORLW 70H
MOVWF R_KeyStatus ;7->R_KeyStatus.3:0
GOTO L_CalcHeftRet ;返回
;
L_CalcHeft3:
BCF R_PubFlag1,4 ;0->R_PubFlag1.4
BTFSC R_KeyStatus,4
GOTO L_CalcHeft22 ;[R_KeyStatus].4=1 轉
BTFSS R_PubFlag0,0
GOTO L_CalcHeftRet ;[R_PubFlag0].0=0(未到1/16秒) 轉,返回
DECFSZ R_PubCnt1,1 ;[R_PubCnt1]-1->R_PubCnt1
GOTO L_CalcHeft31 ;[R_PubCnt1]>0 轉
CLRF INTE ;關所有中斷
CALL S_WrCaliData ;將[R_CaliChksumH:R_CaliMarkL]的8個16位數據寫入到93LC46的00H-07H中
CLRF INTF
MOVLW 10010100B
MOVWF INTE ;GIE=1,TMIE=1,ADIE=1
GOTO L_CalcHeft23
L_CalcHeft31:
BTFSS R_PubFlag0,1
GOTO L_CalcHeftRet ;[R_PubFlag0].1=0(未到1/2秒) 轉,返回
BTFSC R_TimerCnt,2
GOTO S_ClrDisp ;[R_TimerCnt].2=1 轉,清顯示
;下面計算出重量值,并根據公/英制要求送顯示緩沖區
L_CalcHeft4:
BTFSS R_PubFlag0,4
GOTO L_CalcHeftRet ;[R_PubFlag0].4=0(無新的有效內碼) 轉,返回
MOVLW 01H
ANDWF R_DispFlag,1 ;0->R_DispFlag.7:1
BCF R_PubFlag1,6 ;0->R_PubFlag1.6
BTFSC R_PubFlag1,4
GOTO L_DispOverErr ;[R_PubFlag1].4=1(超載) 轉,顯示超載錯誤
MOVFW R_ZeroCodeL ;\
MOVWF R_PubReg0 ; | [R_ZeroCodeH:R_ZeroCodeL] (零點內碼)
MOVFW R_ZeroCodeH ; | ->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
BTFSC R_PubFlag1,3
BSF R_DispFlag,1 ;[R_PubFlag1].3=1,1->R_DispFlag.1 顯示負號
MOVFW R_CaliDataL ;\
MOVWF R_PubReg2 ; | 重量標定數據[R_CaliDataH:R_CaliDataL]
MOVFW R_CaliDataH ; | ->R_PubReg3:R_PubReg2
MOVWF R_PubReg3 ;/
CALL S_Multi ;[R_PubReg3:R_PubReg2]×[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg0
MOVFW R_PubReg3
ANDLW 0FFH
BTFSS STATUS,Z
GOTO L_CalcHeft42 ;[R_PubReg3]>0 轉
MOVFW R_PubReg2
ANDLW 0FEH
BTFSS STATUS,Z
GOTO L_CalcHeft42 ;[R_PubReg2]≥2 轉
BTFSS R_PubFlag0,5
GOTO L_CalcHeft41 ;[R_PubFlag0].5=0(稱重數據不穩定) 轉
MOVFW R_LastAverageL ;\
MOVWF R_ZeroCodeL ; | [R_LastAverageH:R_LastAverageL]->R_ZeroCodeH:R_ZeroCodeL
MOVFW R_LastAverageH ; | 保存零點內碼
MOVWF R_ZeroCodeH ;/
CLRF R_PubReg2 ;0->R_PubReg2
L_CalcHeft41:
CLRF R_PubReg1 ;0->R_PubReg1
GOTO L_DispHeft
L_CalcHeft42:
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 ;/
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:
MOVFW R_DecimalDigits
MOVWF R_DispMode ;[R_DecimalDigits](小數位數)->R_DispMode
BSF R_DispMode,2 ;1->R_DispMode.2 顯示計量單位
BTFSC R_PubFlag0,5
BSF R_PubFlag1,6 ;[R_PubFlag0].5=1(稱重數據穩定),1->R_PubFlag1.6 顯示穩定符號
MOVFW R_ScaleMarkV
ADDPCW
GOTO L_DispHeft_11 ;[R_ScaleMarkV]=0
GOTO L_DispHeft_11 ;[R_ScaleMarkV]=1
GOTO L_DispHeft_12 ;[R_ScaleMarkV]=2
GOTO L_DispHeft_15 ;[R_ScaleMarkV]=3
GOTO L_DispHeft_15 ;[R_ScaleMarkV]=4
; GOTO L_DispHeft_15 ;[R_ScaleMarkV]=5
L_DispHeft_15: ;分度值=5
MOVLW 80H ;\
ADDWF R_PubReg1,0 ; |
MOVLW 2 ; | [R_PubReg3:R_PubReg2]+2.5
ADDWFC R_PubReg2,1 ; | ->R_PubReg3:R_PubReg2
MOVLW 0 ; | (四舍五入)
ADDWFC R_PubReg3,1 ;/
GOTO L_DispHeft_2
L_DispHeft_12: ;分度值=2
MOVLW 1 ;\
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
GOTO L_DispHeft_2
L_DispHeft_11: ;分度值=1
MOVLW 80H ;\
ADDWF R_PubReg1,0 ; |
MOVLW 0 ; | [R_PubReg3:R_PubReg2]+0.5
ADDWFC R_PubReg2,1 ; | ->R_PubReg3:R_PubReg2
MOVLW 0 ; | (四舍五入)
ADDWFC R_PubReg3,1 ;/
L_DispHeft_2:
MOVFW R_PubReg2
IORWF R_PubReg3,0
BTFSS STATUS,Z
GOTO L_DispHeft_3 ;[R_PubReg3:R_PubReg2]>0 轉
BCF R_DispFlag,1 ;[R_PubReg3:R_PubReg2]=0,0->R_DispFlag.1 不顯示負號
BCF R_PubFlag1,6 ;[R_PubReg3:R_PubReg2]=0,0->R_PubFlag1.6 不顯示穩定符號
L_DispHeft_3:
MOVLW 8
SUBWF R_SteadyTimer,0
BTFSC STATUS,C
BCF PT1,7 ;[R_SteadyTimer]≥8(稱重穩定到1秒),0->PT1.7(關背光燈)
CALL S_Hex2BCD ;將[R_PubReg3:R_PubReg2]轉換為5位BCD碼->R_DispBuff4:R_DispBuff0
MOVLW 3
SUBWF R_ScaleMarkV,0
BTFSS STATUS,C
GOTO L_DispHeft_4 ;[R_ScaleMarkV]<3(分度值≠5) 轉
MOVLW 5 ;分度值=5
SUBWF R_DispBuff0,0
MOVLW 5 ;[R_DispBuff0]≥5,5->R_DispBuff0
BTFSS STATUS,C
MOVLW 0 ;[R_DispBuff0]<5,0->R_DispBuff0
MOVWF R_DispBuff0
L_DispHeft_4:
GOTO S_Display ;去顯示
L_CalcHeftRet:
RETURN
;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -