📄 新建 文本文档.asm
字号:
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
;------------------------------------------------------------------------------
;子程序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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -