📄 9821h620.asm
字号:
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_DispFlag,3 ;[R_PubFlag0].5=1(称重数据稳定),1->R_DispFlag.3 显示锁符
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,2 ;[R_PubReg3:R_PubReg2]=0,0->R_DispFlag.2 不显示负号
BCF R_DispFlag,3 ;[R_PubReg3:R_PubReg2]=0,0->R_DispFlag.3 不显示锁符
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
;
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
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_DispFlag,3 ;0->R_DispFlag.3
BTFSC R_PubFlag0,5
BSF R_DispFlag,3 ;[R_PubFlag0].5=1(称重数据稳定),1->R_DispFlag.3 显示锁符
; 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 ;修改日期的日个位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -