?? 9821h620.asm
字號:
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 01H
ANDWF R_DispFlag,1 ;0->R_DispFlag.7:1
BCF R_PubFlag1,6 ;0->R_PubFlag1.6
BTFSC R_WorkStatus,1
GOTO L_CaliPara ;[R_WorkStatus].1=1 轉去標定功能狀態字
BTFSC R_WorkStatus,0
GOTO L_CaliCode_1 ;[R_WorkStatus].0=1 轉
BTFSS R_PubFlag0,5
GOTO L_DispCaliCode ;[R_PubFlag0].5=0(稱重數據不穩定) 轉去顯示內碼
MOVFW R_ZeroCodeL ;\
MOVWF R_CaliCode0L ; | [R_ZeroCodeH:R_ZeroCodeL]
MOVFW R_ZeroCodeH ; | ->R_CaliCode0H:R_CaliCode0L 保存零點內碼
MOVWF R_CaliCode0H ;/
INCF R_WorkStatus,1 ;[R_WorkStatus]+1->R_WorkStatus
GOTO L_DispCaliCode ;去顯示內碼
L_CaliCode_1:
BTFSS R_PubFlag0,4
GOTO L_CaliCode_11 ;[R_PubFlag0].4=0(無新的有效內碼) 轉
BTFSS R_PubFlag0,5
GOTO L_CaliCode_11 ;[R_PubFlag0].5=0(稱重數據不穩定) 轉
MOVFW R_ZeroCodeL ;\
MOVWF R_PubReg4 ; | [R_ZeroCodeH:R_ZeroCodeL]
MOVFW R_ZeroCodeH ; | ->R_PubReg5:R_PubReg4
MOVWF R_PubReg5 ;/
MOVFW R_CaliCode0L ;\
MOVWF R_PubReg0 ; | [R_CaliCode0H:R_CaliCode0L]
MOVFW R_CaliCode0H ; | ->R_PubReg1:R_PubReg0
MOVWF R_PubReg1 ;/
CALL S_CalcABS ;計算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]絕對值->R_PubReg5:R_PubReg4
MOVFW R_PubReg5
ANDLW 0FFH
BTFSS STATUS,Z
GOTO L_CaliCode_11 ;[R_PubReg5]>0 轉
MOVFW R_ZeroCodeL ;\
MOVWF R_CaliCode0L ; | [R_ZeroCodeH:R_ZeroCodeL]
MOVFW R_ZeroCodeH ; | ->R_CaliCode0H:R_CaliCode0L 保存零點內碼
MOVWF R_CaliCode0H ;/
L_CaliCode_11:
BTFSC R_KeyStatus,7
GOTO L_CaliCode_2 ;[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_CaliCode_2:
MOVLW 0CH
SUBWF R_KeyCode,0
BTFSS STATUS,Z
GOTO L_CaliProcRet ;[R_KeyCode]≠0CH(不是"OFF"鍵短鍵釋放) 轉,返回
BTFSC R_PubFlag0,5
GOTO L_CaliCode_3 ;[R_PubFlag0].5=1(稱重數據穩定),轉
MOVFW R_LastAverageL ;\
MOVWF R_SteadyCodeL ; | [R_LastAverageH:R_LastAverageL]
MOVFW R_LastAverageH ; | ->R_SteadyCodeH:R_SteadyCodeL 數據不穩,取當前的平均值
MOVWF R_SteadyCodeH ;/
GOTO L_CaliCode_4
L_CaliCode_3:
MOVFW R_ZeroCodeL ;\ 稱重數據穩定
MOVWF R_SteadyCodeL ; | [R_ZeroCodeH:R_ZeroCodeL]
MOVFW R_ZeroCodeH ; | ->R_SteadyCodeH:R_SteadyCodeL
MOVWF R_SteadyCodeH ;/
L_CaliCode_4:
CLRF R_PubCnt1 ;0->R_PubCnt1
BCF R_KeyStatus,7 ;0->R_KeyStatus.7
MOVLW 70H
IORWF R_KeyStatus,1 ;07H->R_KeyStatus.7:4
INCF R_WorkStatus,1 ;[R_WorkStatus]+1->R_WorkStatus
;
L_CaliPara: ;標定功能狀態字
BTFSS R_KeyStatus,7
GOTO L_DispCaliP_0 ;[R_KeyStatus].7=0 轉 顯示標定參數
MOVLW 05H
SUBWF R_KeyCode,0
BTFSC STATUS,Z
GOTO L_AdjustPara ;[R_KeyCode]=05H(是"UNIT"鍵按下) 轉 調整標定值
MOVLW 0F0H
ANDWF R_KeyStatus,0
SUBLW 80H
BTFSS STATUS,Z
GOTO L_CaliPara_1 ;[R_KeyStatus].7:4≠8 轉
MOVLW 06H
SUBWF R_KeyCode,0
BTFSC STATUS,Z
GOTO L_SeleParaBit ;[R_KeyCode]=6("TARE"鍵按下) 轉 選擇標定數據位
L_CaliPara_1:
MOVLW 0CH
SUBWF R_KeyCode,0
BTFSC STATUS,Z
GOTO L_AdjustPara ;[R_KeyCode]=0CH("OFF"短鍵釋放) 轉 調整標定值
BTFSS R_KeyStatus,5
GOTO L_DispCaliP_0 ;[R_KeyStatus].5=0(按鍵未到2秒) 轉
MOVLW 04H
SUBWF R_KeyCode,0
BTFSC STATUS,Z
GOTO L_CaliNextPara ;[R_KeyCode]=04H("OFF"鍵按下2秒) 轉 進入下一個項目
L_DispCaliP_0:
BTFSS R_TimerCnt,2
GOTO L_DispCaliPara ;[R_TimerCnt].2=0 轉 顯示標定參數
MOVFW R_PubCnt1
ANDLW 03H
SUBLW R_DispBuff3
MOVWF FSR0
MOVLW 10H ;" "
MOVWF IND0 ;10H(" ")->IND0
GOTO L_DispCaliPa_1
L_DispCaliPara: ;顯示當前標定的參數
RRF R_PubCnt1,0
RRF WORK,0
RRF WORK,0
ANDLW 06H
ADDLW R_CaliMarkL
MOVWF FSR0 ;根據[R_PubCnt1].5:4計算出當前參數的地址->FSR0
MOVFW IND0
ANDLW 0FH
MOVWF R_DispBuff0
MOVFW IND0
CALL S_RR4Work ;[WORK]右移4位->WORK,0->WORK.7:4
MOVWF R_DispBuff1
INCF FSR0,1
MOVFW IND0
ANDLW 0FH
MOVWF R_DispBuff2
MOVFW IND0
CALL S_RR4Work ;[WORK]右移4位->WORK,0->WORK.7:4
MOVWF R_DispBuff3
MOVLW 10H
MOVWF R_DispBuff4 ;10H(" ")->R_DispBuff4
L_DispCaliPa_1:
MOVLW 08H
MOVWF R_DispMode ;08H->R_DispMode,無小數點,16進制顯示方式
GOTO S_Display ;去顯示
;
L_SeleParaBit: ;"TARE"鍵按下,選擇標定數據位
INCF R_PubCnt1,1 ;[R_PubCnt1]+1->R_PubCnt1
BCF R_PubCnt1,2 ;0->R_PubCnt1.2,[R_PubCnt1]=0-3
GOTO L_DispCaliPara ;去顯示當前標定的參數
;
L_AdjustPara: ;UNIT"鍵按下或"OFF"短鍵釋放,調整標定值
RRF R_PubCnt1,0
RRF WORK,0
RRF WORK,0
ANDLW 06H
ADDLW R_CaliMarkL
MOVWF FSR0 ;根據[R_PubCnt1].5:4計算出當前參數的地址->FSR0
BTFSS R_PubCnt1,1
INCF FSR0,1
MOVLW 0FH ;0FH->WORK
BTFSS R_PubCnt1,0
MOVLW 0F0H ;[R_PubCnt1].0=0,0F0H->WORK
MOVWF R_PubReg1 ;[WORK]->R_PubReg1
MOVLW 01H ;01H->WORK
BTFSS R_PubCnt1,0
MOVLW 10H ;[R_PubCnt1].0=0,10H->WORK
ADDWF IND0,1 ;[IND0]+[WORK]->IND0
BTFSS R_PubCnt1,0
GOTO L_AdjPara_1 ;[R_PubCnt1].0=0 轉
MOVFW IND0 ;[R_PubCnt1].1=1
ANDLW 0FH
BTFSS STATUS,Z
GOTO L_AdjPara_1 ;[IND0].3:0>0 轉
MOVLW 10H
SUBWF IND0,1 ;[IND0]-10H->IND0
L_AdjPara_1:
MOVLW R_CaliMarkL
SUBWF FSR0,0
CALL S_RdParaMaxV ;讀出當前參數的最大值
ANDWF R_PubReg1,0
MOVWF R_PubReg0
MOVFW R_PubReg1
ANDWF IND0,0
SUBWF R_PubReg0,0
BTFSC STATUS,C
GOTO L_DispCaliPara ;當前設定的參數未超過最大值,去顯示當前標定的參數
COMF R_PubReg1,0
ANDWF IND0,1 ;超過最大值,當前設定值清0
GOTO L_DispCaliPara ;當前設定的參數未超過最大值,去顯示當前標定的參數
;
L_CaliNextPara: ;"OFF"鍵按下2秒,進入下一個項目
BSF R_KeyStatus,4 ;1->R_KeyStatus.4
BSF R_KeyStatus,5 ;1->R_KeyStatus.5
MOVLW 0F0H
ANDWF R_PubCnt1,0
BTFSC STATUS,Z
CALL S_CaliCodeProc ;[R_PubCnt1].7:4=0 處理重量標定數據
MOVLW 20H
SUBWF R_PubCnt1,0
BTFSC STATUS,C
GOTO L_CaliParaOver ;[R_PubCnt1].7:4≥2 轉 標定完成處理
MOVFW R_PubCnt1
ADDLW 10H
ANDLW 30H
MOVWF R_PubCnt1
GOTO L_DispCaliPara ;去顯示下一個標定參數
L_CaliParaOver: ;標定完成處理
CALL S_ClrDisp ;清LCD顯示緩沖區LCD1-LCD6
MOVLW D_CaliMark1
MOVWF R_CaliParaFlag ;D_CaliMark1->R_CaliParaFlag
CALL S_WrCaliData ;將[R_CaliChksumH:R_CaliMarkL]的8個16位數據寫入到93LC46的00H-07H中
MOVLW 20H
MOVWF R_PubCnt1 ;20H->R_PubCnt1,定時2秒
MOVLW 0C0H
MOVWF R_WorkStatus ;0C0H->R_WorkStatus,2秒后關機。
MOVLW 15H ;"H" ;\
MOVWF R_DispBuff4 ;15H("H")->R_DispBuff4 ; |
MOVLW 06H ; | 顯示版本號
MOVWF R_DispBuff3 ;06H("6")->R_DispBuff3 ; | "H620 "
MOVLW 02H ; |
MOVWF R_DispBuff2 ;02H("2")->R_DispBuff2 ; |
MOVLW 00H ; |
MOVWF R_DispBuff1 ;00H("0")->R_DispBuff1 ;/
MOVLW 08H
MOVWF R_DispMode ;08H->R_DispMode,無小數點,16進制顯示方式
GOTO S_Display ;去顯示
L_CaliProcRet:
RETURN
;
S_DispCaliCode: ;顯示內碼
L_DispCaliCode: ;顯示內碼
BTFSS R_PubFlag0,4
GOTO L_CaliProcRet ;[R_PubFlag0].4=0(未得到新的有效內碼) 轉,返回
BCF R_PubFlag1,6 ;0->R_PubFlag1.6
BTFSC R_PubFlag0,5
BSF R_PubFlag1,6 ;[R_PubFlag0].5=1(稱重數據穩定),1->R_PubFlag1.6 顯示穩定符號
; MOVLW 1
; CALL S_ReadCode ;讀當前內碼->R_PubReg1:R_PubReg0
; MOVFW R_PubReg0 ;\
; MOVWF R_PubReg2 ; | [R_PubReg1:R_PubReg0]
; MOVFW R_PubReg1 ; | ->R_PubReg3:R_PubReg2
; MOVWF R_PubReg3 ;/
MOVFW R_LastAverageL ;\
MOVWF R_PubReg2 ; | [R_LastAverageH:R_LastAverageL]
MOVFW R_LastAverageH ; | ->R_PubReg3:R_PubReg2
MOVWF R_PubReg3 ;/
CALL S_Hex2BCD ;將[R_PubReg3:R_PubReg2]轉換為5位BCD碼->R_DispBuff4:R_DispBuff0
MOVLW 08H
MOVWF R_DispMode ;08H->R_DispMode,無小數點,16進制顯示方式
BTFSC R_TimerCnt,3
BSF R_DispMode,0
GOTO S_Display ;去顯示
;
L_DispDate: ;顯示日期
MOVLW D_MonthH ;修改日期的月十位
MOVWF R_DispBuff4 ;->R_DispBuff4
MOVLW D_MonthL ;修改日期的月個位
MOVWF R_DispBuff3 ;->R_DispBuff3
MOVLW 11H
MOVWF R_DispBuff2 ;11H("-")->R_DispBuff2
MOVLW D_DayH ;修改日期的日十位
MOVWF R_DispBuff1 ;->R_DispBuff1
MOVLW D_DayL ;修改日期的日個位
MOVWF R_DispBuff0 ;->R_DispBuff0
CLRF R_DispMode ;0->R_DispMode,無小數點,10進制數顯示
GOTO S_Display ;去顯示
;------------------------------------------------------------------------------
L_OFF_Proc: ;關機處理
CLRF INTE ;關所有中斷
CALL S_ClrDisp ;清LCD顯示緩沖區LCD1-LCD6
BCF LCDENR,LCDEN ;關LCD輸出
L_OFF_Wait:
MOVLW 00H
MOVWF PT2 ;07H->PT2
MOVLW 00H
MOVWF PT1 ;00H->PT1
NOP
GOTO L_OFF_Wait
RETURN
;------------------------------------------------------------------------------
;子程序S_CalcOffTime ;計算自動關機時間(單位:秒)->R_OffTimerH:R_OffTimerL
;Input: R_CaliP2H -- D3:D0=P2.2 自動關機時間
; R_WorkStatus
;Output: R_OffTimerH:R_OffTimerL
;Call: S_RdOffTime
;Use RAM: WORK,R_Temp
S_CalcOffTime:
MOVFW R_CaliP2H ;D3:D0=P2.2 自動關機時間,0=無自動關機,
ANDLW 0FH ;1-7對應30秒-210秒,8=10秒,9=300秒后自動關機
MOVWF R_Temp ;P2.2->R_Temp
BTFSS STATUS,Z
GOTO L_CalcOffTime1 ;P2.2>0 轉
BSF R_OffTimerH,7 ;P2.2=0(無自動關機),1->R_OffTimerH.7
GOTO L_CalcOffTimeRet
L_CalcOffTime1:
CLRF R_OffTimerH,7 ;P2.2>0,0->R_OffTimerH
MOVFW R_WorkStatus
ANDLW 70H
SUBLW 30H
BTFSS STATUS,Z
GOTO L_CalcOffTime2 ;[R_WorkStatus].6:4≠3(不在標定期間) 轉
BSF R_OffTimerH,0 ;[R_WorkStatus].6:4=3(標定期間) 1->R_OffTimerH.0
GOTO L_CalcOffTimeRet
L_CalcOffTime2:
DECF R_Temp,0
CALL S_RdOffTime ;讀出自動關機時間
MOVWF R_OffTimerL ;\
ADDWF R_OffTimerL,1 ; | 讀出的自動關機時間×2
MOVLW 0 ; | ->R_OffTimerH:R_OffTimerL
ADDWFC R_OffTimerH,1 ;/
L_CalcOffTimeRet:
RETURN
S_RdOffTime: ;讀出自動關機時間
ADDPCW
RETLW 15 ;P2.2=1 自動關機時間為30秒
RETLW 30 ;P2.2=2 自動關機時間為60秒
RETLW 45 ;P2.2=3 自動關機時間為90秒
RETLW 60 ;P2.2=4 自動關機時間為120秒
RETLW 75 ;P2.2=5 自動關機時間為150秒
RETLW 90 ;P2.2=6 自動關機時間為180秒
RETLW 105 ;P2.2=7 自動關機時間為210秒
RETLW 5 ;P2.2=8 自動關機時間為10秒
RETLW 150 ;P2.2=9 自動關機時間為300秒
;------------------------------------------------------------------------------
;子程序S_DecOffTime ;自動關機時間(單位:秒)-1->R_OffTimerH:R_OffTimerL,若已減到0則準備關機
;Input: R_OffTimerH:R_OffTimerL
;Output: R_OffTimerH:R_OffTimerL
; R_WorkStatus
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -