📄 9821h620.asm
字号:
ADDWF R_TimerCnt,0
MOVWF R_KeyTimer2 ;[R_TimerCnt]+50H(10秒)->R_KeyTimer2
L_ReadKey4:
MOVFW R_TimerCnt
SUBWF R_KeyTimer1,0
BTFSS STATUS,Z
GOTO L_ReadKey5 ;[R_KeyTimer1]≠[R_TimerCnt] 转
INCF R_TimerCnt,0
MOVWF R_KeyTimer1 ;[R_TimerCnt]+1->R_KeyTimer1
BSF R_KeyStatus,5 ;1->R_KeyStatus.5
BSF R_KeyStatus,7 ;1->R_KeyStatus.7
MOVLW 0FH
SUBWF R_KeyCode,0
BTFSC STATUS,Z
GOTO L_ReadKey5 ;[R_KeyCode]=0FH 转
MOVLW 07H
ANDWF R_KeyCode,1 ;[R_KeyCode]&07H->R_KeyCode
L_ReadKey5:
BTFSC R_KeyStatus,6
GOTO L_ReadKeyRet ;[R_KeyStatus].6=1 转,返回
MOVFW R_TimerCnt
SUBWF R_KeyTimer2,0
BTFSS STATUS,Z
GOTO L_ReadKeyRet ;[R_KeyTimer2]≠[R_TimerCnt] 转,返回
BSF R_KeyStatus,6 ;1->R_KeyStatus.6
BSF R_KeyStatus,7 ;1->R_KeyStatus.7
BSF R_KeyCode,4 ;1->R_KeyCode.4
MOVLW 04H
SUBWF R_PubReg2,0
BTFSC STATUS,Z
BSF R_PubFlag1,0 ;[R_PubReg2]=04H("TARE"键按下),1->R_PubFlag1.0
L_ReadKeyRet:
RETURN
S_RdKeyCode: ;读键码
ADDPCW
RETLW 4 ;[R_PubCnt2]=001B,键码=100B
RETLW 5 ;[R_PubCnt2]=010B,键码=101B
RETLW 7 ;[R_PubCnt2]=011B,键码=111B
RETLW 6 ;[R_PubCnt2]=100B,键码=110B
RETLW 7 ;[R_PubCnt2]=101B,键码=111B
RETLW 7 ;[R_PubCnt2]=110B,键码=111B
RETLW 7 ;[R_PubCnt2]=111B,键码=111B
;------------------------------------------------------------------------------
;子程序S_ReadCode ;计算最近X次的内码的平均值->R_PubReg1:R_PubReg0,X=[WORK]
;Input: R_CodeBuffer[0:F],R_CodePointer,WORK
;Output: R_PubReg1:R_PubReg0
;Use RAM: WORK,FSR0,IND0,R_Count,R_PubReg3:R_PubReg2,R_PubReg5:R_PubReg4
;Goto: S_DivisM
S_ReadCode: MOVWF R_Count
MOVWF R_PubReg4
CLRF R_PubReg5
CLRF R_PubReg0
CLRF R_PubReg1
CLRF R_PubReg2
CLRF R_PubReg3
DECF R_CodePointer,0 ;\
ANDLW 07H ; |
BCF STATUS,C ; | 计算当前内码存放的地址
RLF WORK,0 ; | ->FSR0
ADDLW R_CodeBuffer ; |
MOVWF FSR0 ;/
L_RdCodeLoop:
MOVFW IND0
ADDWF R_PubReg0,1
INCF FSR0,1
MOVFW IND0
ADDWFC R_PubReg1,1
MOVLW 0
ADDWFC R_PubReg2,1
INCF FSR0,0
BTFSC STATUS,Z
MOVLW R_CodeBuffer
MOVWF FSR0
DECFSZ R_Count,1
GOTO L_RdCodeLoop ;次数未到,转L_RdCodeLoop继续
GOTO S_DivisM ;[R_PubReg3:R_PubReg0]÷[R_PubReg5:R_PubReg4]->R_PubReg1:R_PubReg0
;------------------------------------------------------------------------------
;子程序S_CalcABS ;计算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]绝对值->R_PubReg5:R_PubReg4
;Input: R_PubReg1:R_PubReg0
; R_PubReg5:R_PubReg4
;Output: R_PubReg5:R_PubReg4
; R_PubFlag1.3 =1时减法结果为负数
S_CalcABS:
BCF R_PubFlag1,3 ;0->R_PubFlag1.3
MOVFW R_PubReg0 ;\
SUBWF R_PubReg4,1 ; | [R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]
MOVFW R_PubReg1 ; | ->R_PubReg5:R_PubReg4
SUBWFC R_PubReg5,1 ;/
BTFSC STATUS,C ;
GOTO L_CalcABS_Ret ;结果为正数,转,返回
BSF R_PubFlag1,3 ;1->R_PubFlag1.3
S_CalcABS1: ;计算[R_PubReg5:R_PubReg4]的补码->R_PubReg5:R_PubReg4
COMF R_PubReg4,1 ;\
COMF R_PubReg5,1 ; \
MOVLW 1 ; | 计算[R_PubReg5:R_PubReg4]的补码
ADDWF R_PubReg4,1 ; | ->R_PubReg5:R_PubReg4
MOVLW 0 ; /
ADDWFC R_PubReg5,1 ;/
L_CalcABS_Ret:
RETURN
;------------------------------------------------------------------------------
;子程序S_CalcUnitData ;计算1d对应的不同计量单位的值(浮点数),
; 结果->R_UnitData2(2的指数)、R_UnitData1:R_UnitData0(有效数字)
;Input: R_CaliP1H,R_CaliP1L
;Output: R_UnitData1:R_UnitData0
; R_UnitData2
;Call: S_RdScaleMarkV
; S_InitUnitRate
; S_Multi
; S_LeftMove
;Use RAM: WORK,R_Temp
S_CalcUnitData:
MOVFW R_CaliP1H ;标定参数,D3:D0=P1.2(分度值)
ANDLW 03H ;P1.2=0-3
CALL S_RdScaleMarkV ;读出分度值
MOVWF R_ScaleMarkV ;分度值->R_ScaleMarkV
MOVWF R_PubReg4 ;
CLRF R_PubReg5 ;分度值->R_PubReg5:R_PubReg4
MOVFW R_CaliP1L ;标定参数,D7:D4=P1.1
CALL S_RR4Work ;[WORK]右移4位->WORK,0->WORK.7:4
ANDLW 03H
MOVWF R_DecimalDigits ;小数位数->R_DecimalDigits
MOVWF R_Temp ;小数位数->R_Temp 暂存
CALL S_InitUnitRate ;初始化计量单位的相关计算用数据->R_PubReg3:R_PubReg2等
MOVWF R_ScaleMarkV
ANDLW 03H
MOVWF R_DecimalDigits
MOVFW R_ScaleMarkV
CALL S_RR4Work ;[WORK]右移4位->WORK,0->WORK.7:4
ANDLW 07H
MOVWF R_ScaleMarkV
MOVLW 10H
SUBWF R_PubCnt3,1 ;[R_PubCnt3]-10H->R_PubCnt3
CALL S_Multi ;[R_PubReg3:R_PubReg2]×[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg0
CALL S_LeftMove ;[R_PubReg3:R_PubReg0]左移,直到[R_PubReg3]≥80H,最多移16次
; 实际移位次数加入[R_PubCnt3]
MOVFW R_DecimalDigits
SUBWF R_Temp,1 ;[R_Temp]-R_DecimalDigits->R_Temp
BTFSC STATUS,Z
GOTO L_CalcUnitD_2 ;[R_DecimalDigits]=[R_Temp] 转
MOVLW 0CDH ;\
MOVWF R_PubReg4 ; | 0CCCDH->R_PubReg5:R_PubReg4
MOVLW 0CCH ; | 0CCCDH÷10000H÷2的3次方=0.1
MOVWF R_PubReg5 ;/
MOVLW 03H
MOVWF R_PubCnt2 ;03H->R_PubCnt2,03H表示"2的3次方"
BTFSC STATUS,C
GOTO L_CalcUnitD_1 ;[R_DecimalDigits]<[R_Temp] 转
COMF R_Temp,1 ;\
INCF R_Temp,1 ;/ 计算[R_Temp]的补码->R_Temp
MOVLW 0AH ;\
MOVWF R_PubReg4 ; | 000AH->R_PubReg5:R_PubReg4
CLRF R_PubReg5 ;/ 000AH÷10000H÷2的-16次方=10
MOVLW 0F0H
MOVWF R_PubCnt2 ;0F0H->R_PubCnt2,0F0H表示"2的-16次方"
L_CalcUnitD_1:
MOVFW R_PubCnt2
ADDWF R_PubCnt3,1 ;[R_PubCnt3]+[R_PubCnt2]->R_PubCnt3
CALL S_Multi ;[R_PubReg3:R_PubReg2]×[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg0
CALL S_LeftMove ;[R_PubReg3:R_PubReg0]左移,直到[R_PubReg3]≥80H,最多移16次
; 实际移位次数加入[R_PubCnt3]
DECFSZ R_Temp,1 ;[R_Temp]-1->R_Temp
GOTO L_CalcUnitD_1 ;不等于0转L_CalcUnitD_1循环
L_CalcUnitD_2:
MOVFW R_PubReg2 ;\
MOVWF R_UnitData0 ; | [R_PubReg3:R_PubReg2]->R_UnitData1:R_UnitData0
MOVFW R_PubReg3 ; | (有效数字)
MOVWF R_UnitData1 ;/
MOVFW R_PubCnt3
MOVWF R_UnitData2 ;[R_PubCnt3]->R_UnitData2 (2的指数,≥80H为负数)
RETURN
S_RdScaleMarkV: ;读出分度值
ADDPCW
RETLW 1 ;P1.2=0时,
RETLW 1 ;P1.2=1时,
RETLW 2 ;P1.2=2时,
RETLW 5 ;P1.2=3时,
;------------------------------------------------------------------------------
;子程序S_LeftMove ;[R_PubReg3:R_PubReg0]左移,直到[R_PubReg3]≥80H,最多移16次
; 实际移位次数加入[R_PubCnt3]
S_LeftMove:
MOVLW 16
MOVWF R_Count ;16->R_Count,计数用,计16次。
L_LeftM_Loop:
BTFSC R_PubReg3,7
GOTO L_LeftM_Ret ;[R_PubReg3]≥80H 转L_LeftM_Ret返回
;-----------S_RL1Bit:[R_PubCnt3]+1->R_PubCnt3,[R_PubReg3:R_PubReg0]左移1位->R_PubReg3:R_PubReg0-----
S_RL1Bit: INCF R_PubCnt3,1 ;[R_PubCnt3]+1->R_PubCnt3
BCF STATUS,C ;0->Cy
RLF R_PubReg0,1 ;\
RLF R_PubReg1,1 ; | [R_PubReg3:R_PubReg0]左移1位
RLF R_PubReg2,1 ; | ->R_PubReg3:R_PubReg0
RLF R_PubReg3,1 ;/
DECFSZ R_Count,1
GOTO L_LeftM_Loop ;未到16次,转L_LeftM_Loop循环
L_LeftM_Ret:
RETURN
;------------------------------------------------------------------------------
;子程序S_InitUnitRate ;初始化计量单位的相关计算用数据
;Input: R_UnitSelect
; R_ScaleMarkV,R_DecimalDigits
;Output: R_PubReg3:R_PubReg2
; WORK,R_Temp
S_InitUnitRate:
MOVLW 03H
ANDWF R_UnitSelect,1
BTFSC STATUS,Z
GOTO L_InitUnit_g ;[R_UnitSelect]=0,计量单位=g
BTFSS R_UnitSelect,1
GOTO L_InitUnit_oz ;[R_UnitSelect]=1,计量单位=oz
BTFSS R_UnitSelect,0
GOTO L_InitUnit_kg ;[R_UnitSelect]=2,计量单位=kg
L_InitUnit_lb: ;[R_UnitSelect]=3,计量单位=lb
MOVLW 18H ;\
MOVWF R_PubReg2 ; | 1kg=2.205lb
MOVLW 8DH ; | 8D18H->R_PubReg3:R_PubReg2
MOVWF R_PubReg3 ; | 8D18H÷65536÷2的-2次方=2.205
MOVLW 0FEH ; | 0FEH->R_PubCnt3,0FEH表示"2的-2次方"
MOVWF R_PubCnt3 ;/
MOVLW 3
MOVWF R_DecimalDigits ;小数位数=3
MOVWF R_Temp
MOVLW 20H ;分度值固定为2
ADDWF R_DecimalDigits,0 ;返回结果:WORK的D7-D4=分度值,D3-D0=小数位数
RETURN
L_InitUnit_oz: ;计量单位=oz
MOVLW 7BH ;\
MOVWF R_PubReg2 ; | 1g=0.03527oz
MOVLW 90H ; | 907BH->R_PubReg3:R_PubReg2
MOVWF R_PubReg3 ; | 907BH÷65536÷2的4次方=0.03527
MOVLW 04H ; | 04H->R_PubCnt3,04H表示"2的4次方"
MOVWF R_PubCnt3 ;/
MOVFW R_CaliP1H ;标定参数,D3:D0=P1.2(分度值)
ANDLW 03H ;P1.2=0-3
BTFSS STATUS,Z
DECF WORK,1
ADDWF R_DecimalDigits,0
ADDWF R_DecimalDigits,0
ADDWF R_DecimalDigits,0
ADDPCW
RETLW 52H ;(g数据小数位数=0,分度值=1) oz分度值=5,小数位数=2
RETLW 52H ;(g数据小数位数=0,分度值=2) oz分度值=5,小数位数=2
RETLW 21H ;(g数据小数位数=0,分度值=3) oz分度值=2,小数位数=1
RETLW 53H ;(g数据小数位数=1,分度值=1) oz分度值=5,小数位数=3
RETLW 12H ;(g数据小数位数=1,分度值=2) oz分度值=1,小数位数=2
RETLW 22H ;(g数据小数位数=1,分度值=3) oz分度值=2,小数位数=2
RETLW 13H ;(g数据小数位数=2,分度值=1) oz分度值=1,小数位数=3
RETLW 13H ;(g数据小数位数=2,分度值=2) oz分度值=1,小数位数=3
RETLW 13H ;(g数据小数位数=2,分度值=3) oz分度值=1,小数位数=3
RETLW 13H ;(g数据小数位数=3,分度值=1) oz分度值=1,小数位数=3
RETLW 13H ;(g数据小数位数=3,分度值=2) oz分度值=1,小数位数=3
RETLW 13H ;(g数据小数位数=3,分度值=3) oz分度值=1,小数位数=3
L_InitUnit_kg: ;计量单位=kg
MOVLW 3
MOVWF R_DecimalDigits ;小数位数=3
MOVWF R_Temp
L_InitUnit_g: ;计量单位=g
MOVLW 1 ;\
MOVWF R_PubReg2 ; | 1->R_PubReg3:R_PubReg2,0001H÷65536÷2的-16次方=1
CLRF R_PubReg3 ; |
MOVLW 0F0H ; | 0F0H->R_PubCnt3,0F0H表示"2的-16次方"
MOVWF R_PubCnt3 ;/
MOVFW R_CaliP1H ;标定参数,D3:D0=P1.2(分度值)
; ANDLW 03H ;P1.2=0-3
RLF WORK,0
RLF WORK,0
RLF WORK,0
RLF WORK,0
ANDLW 30H
ADDWF R_DecimalDigits,0 ;返回结果:WORK的D7-D4=分度值,D3-D0=小数位数
RETURN
;------------------------------------------------------------------------------
;子程序S_CalcLockCode ;计算锁定判断的内码值->R_OffsetCode,10d内码->R_10dCodeH:R_10dCodeL
; 锁定所有的连续有效数据个数最大值->R_LockCodeNum
S_CalcLockCode:
MOVLW D_CaliMark2
SUBWF R_CaliCodeFlag,0
BTFSS STATUS,Z
GOTO L_CalcLockC_1 ;[R_CaliCodeFlag]≠D_CaliMark2 (未标定内码) 转
MOVFW R_CaliDataL ;\
MOVWF R_PubReg4 ; | [R_CaliDataH:R_CaliDataL]
MOVFW R_CaliDataH ; | ->R_PubReg5:R_PubReg4
MOVWF R_PubReg5 ;/
GOTO L_CalcLockC_2
L_CalcLockC_1:
CLRF R_PubReg4 ;\
MOVLW 20H ; | 未标定重量,2000H->R_PubReg5:R_PubReg4
MOVWF R_PubReg5 ;/
L_CalcLockC_2:
MOVFW R_PubReg4 ;\
MOVWF R_10dCodeL ; | [R_PubReg5:R_PubReg4]
MOVFW R_PubReg5 ; | ->R_10dCodeH:R_10dCodeL暂存
MOVWF R_10dCodeH ;/
MOVFW R_CaliP2L ;标定参数,D3-D0=P2.0(称重锁定参数=0-7)
ANDLW 07H
CALL S_RdLockPara ;读称重锁定参数
MOVWF R_PubReg2
CLRF R_PubReg3
CALL S_Divis ;[R_PubReg3:R_PubReg2]×65536÷[R_PubReg5:R_PubReg4]->R_PubReg1:R_PubReg0
MOVLW 8 ;\
ADDWF R_PubReg0,1 ; \
MOVLW 0 ; |
ADDWFC R_PubReg1,1 ; |
MOVLW 4 ; | ([R_PubReg1:R_PubReg0]+8)×16
MOVWF R_Count ; | ->R_PubReg1:R_PubReg0
L_CalcLockC_L1: ; |
RLF R_PubReg0,1 ; |
RLF R_PubReg1,1 ; |
DECFSZ R_Count,1 ; /
GOTO L_CalcLockC_L1 ;/
MOVLW 3
SUBWF R_PubReg1,0
BTFSC STATUS,C
GOTO L_CalcLockC_3 ;[R_PubReg1]≥3 转
MOVLW 3
MOVWF R_PubReg1 ;3->R_PubReg1
L_CalcLockC_3:
MOVFW R_PubReg1
MOVWF R_OffsetCode ;[R_PubReg1]->R_OffsetCode
;
MOVFW R_10dCodeL ;\
MOVWF R_PubReg4 ; | [R_10dCodeH:R_10dCodeL]
MOVFW R_10dCodeH ; | ->R_PubReg5:R_PubReg4
MOVWF R_PubReg5 ;/
MOVLW 10 ;\
MOVWF R_PubReg2 ; | 10->R_PubReg3:R_PubReg2
CLRF R_PubReg3 ;/ (用于计算10d内码)
CALL S_Divis ;[R_PubReg3:R_PubReg2]×65536÷[R_PubReg5:R_PubReg4]->R_PubReg1:R_PubReg0
MOVFW R_PubReg0 ;\
MOVWF R_10dCodeL ; | [R_PubReg1:R_PubReg0]
MOVFW R_PubReg1 ; | ->R_10dCodeH:R_10dCodeL
MOVWF R_10dCodeH ;/ 保存10d内码
MOVFW R_CaliP2H ;标定参数,D7:D4=P2.3(称重速度参数)
CALL S_RR4Work ;[WORK]右移4位->WORK,0->WORK.7:4
ANDLW 03H
CALL S_RdScaleSpeed ;读称重速度参数
MOVWF R_LockCodeNum
RETURN
S
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -