📄 9821h620.asm
字号:
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_RdScaleSpeed: ;读称重速度参数
ADDPCW
RETLW 07H ;P2.3=0时,
RETLW 06H ;P2.3=1时,
RETLW 05H ;P2.3=2时,
RETLW 04H ;P2.3=3时,
S_RdLockPara: ;读称重锁定参数
ADDPCW
RETLW 04H ;P2.0=0时,锁定参数=4/16d
RETLW 08H ;P2.0=1时,锁定参数=8/16d
RETLW 0CH ;P2.0=2时,锁定参数=12/16d
RETLW 10H ;P2.0=3时,锁定参数=16/16d
RETLW 14H ;P2.0=4时,锁定参数=20/16d
RETLW 18H ;P2.0=5时,锁定参数=24/16d
RETLW 1CH ;P2.0=6时,锁定参数=28/16d
RETLW 20H ;P2.0=7时,锁定参数=32/16d
;------------------------------------------------------------------------------
;子程序S_RdScaleMark:读分度数
S_RdScaleMark:
ADDPCW
RETLW 10 ;P1.3=0,分度数=10×100=1000
RETLW 12 ;P1.3=1,分度数=12×100=1200
RETLW 15 ;P1.3=2,分度数=15×100=1500
RETLW 20 ;P1.3=3,分度数=20×100=2000
RETLW 25 ;P1.3=4,分度数=25×100=2500
RETLW 30 ;P1.3=5,分度数=30×100=3000
RETLW 40 ;P1.3=6,分度数=40×100=4000
RETLW 50 ;P1.3=7,分度数=50×100=5000
RETLW 60 ;P1.3=8,分度数=60×100=6000
RETLW 100 ;P1.3=9,分度数=100×100=10000
;------------------------------------------------------------------------------
;子程序 S_ClrDisp ;清LCD显示缓冲区LCD1-LCD6
S_ClrDisp:
CLRF LCD1 ;0->LCD1
CLRF LCD2 ;0->LCD2
CLRF LCD3 ;0->LCD3
CLRF LCD4 ;0->LCD4
CLRF LCD5 ;0->LCD5
CLRF LCD6 ;0->LCD6
MOVLW 10H
MOVWF R_DispBuff0 ;10H(" ")->R_DispBuff0
MOVWF R_DispBuff1 ;10H(" ")->R_DispBuff1
MOVWF R_DispBuff2 ;10H(" ")->R_DispBuff2
MOVWF R_DispBuff3 ;10H(" ")->R_DispBuff3
MOVWF R_DispBuff4 ;10H(" ")->R_DispBuff4
MOVLW 01H
ANDWF R_DispFlag,1 ;0->R_DispFlag.7:1
RETURN
;;------------------------------------------------------------------------------
;;子程序 S_DispAll ;LCD全显
;S_DispAll:
; MOVLW 0FFH
; MOVWF LCD1 ;0FFH->LCD1
; MOVWF LCD2 ;0FFH->LCD2
; MOVWF LCD3 ;0FFH->LCD3
; MOVWF LCD4 ;0FFH->LCD4
; MOVWF LCD5 ;0FFH->LCD5
; MOVWF LCD6 ;0FFH->LCD6
; RETURN
;------------------------------------------------------------------------------
;LCD显示" 93C46"
S_Disp9346:
MOVLW 9
MOVWF R_DispBuff4 ;9->R_DispBuff4
MOVLW 3
MOVWF R_DispBuff3 ;3->R_DispBuff3
MOVLW 0CH
MOVWF R_DispBuff2 ;0CH->R_DispBuff2
MOVLW 4
MOVWF R_DispBuff1 ;4->R_DispBuff1
MOVLW 6
MOVWF R_DispBuff0 ;6->R_DispBuff0
MOVLW 08H
MOVWF R_DispMode ;08H->R_DispMode,显示提示信息
GOTO S_Display
;------------------------------------------------------------------------------
;显示子程序 S_Display
;Input: R_DispBuff0、R_DispBuff1、R_DispBuff2
; R_DispBuff3、R_DispBuff4、R_DispFlag
;Output: LCD1、LCD2、LCD3、LCD4、LCD5、LCD6
;Call: S_DispSub
;Use RAM: R_Count,FSR0,IND0,WORK
S_Display:
BTFSC R_DispMode,3
GOTO L_DispM_1 ;[R_DispMode].3=1 不进行数据预处理,转
; ----显示数据预处理,高位为0不显示----
MOVLW R_DispBuff4
MOVWF FSR0
MOVLW 4
MOVWF R_Count
L_DispM_Loop1:
CLRF WORK
ADDWF IND0,0
BTFSS STATUS,Z
GOTO L_DispM_1
MOVLW 10H ;" "
MOVWF IND0
DECF FSR0,1
DECFSZ R_Count,1
GOTO L_DispM_Loop1
L_DispM_1:
MOVLW 0FH
ANDWF R_DispFlag,1 ;0->R_DispFlag.7:4
BTFSS R_DispMode,2
GOTO L_DispM_2 ;[R_DispMode].2=0 不显示计量单位,转
MOVFW R_UnitSelect
ANDLW 03H ;计量单位=0-3
CALL S_RdUnitData ;读计量单位数据
IORWF R_DispFlag,1
L_DispM_2:
MOVFW R_DispFlag
MOVWF LCD6
MOVFW R_DispBuff0
CALL S_DispSub
MOVWF LCD1
MOVFW R_DispBuff1
CALL S_DispSub
MOVWF LCD2
MOVFW R_DispBuff2
CALL S_DispSub
MOVWF LCD3
MOVFW R_DispBuff3
CALL S_DispSub
MOVWF LCD4
MOVFW R_DispBuff4
ANDLW 7FH
CALL S_DispSub
MOVWF LCD5
MOVLW 03H
ANDWF R_DispMode,0
BTFSC STATUS,Z
GOTO L_DispM_Ret ;[R_DispMode].1:0=0 不显示小数点,转,返回
DECF WORK,0
CALL S_RdDPloca ;读要显示的小数点位置
MOVWF FSR0
BSF IND0,0 ;显示小数点
L_DispM_Ret:
RETURN
S_RdDPloca: ;读要显示的小数点位置
ADDPCW
RETLW LCD2 ;1位小数,小数点的位置
RETLW LCD3 ;2位小数,小数点的位置
RETLW LCD4 ;3位小数,小数点的位置
S_RdUnitData: ;读计量单位数据
ADDPCW
RETLW 00100000B ;[R_UnitSelect]=0 显示"g"
RETLW 00010000B ;[R_UnitSelect]=1 显示"oz"
RETLW 10000000B ;[R_UnitSelect]=2 显示"kg"
RETLW 01000000B ;[R_UnitSelect]=3 显示"lb"
S_DispSub: ;读7段码
ADDPCW
RETLW Lcdch0 ;0 (work=0)
RETLW Lcdch1 ;1 (work=1)
RETLW Lcdch2 ;2 (work=2)
RETLW Lcdch3 ;3 (work=3)
RETLW Lcdch4 ;4 (work=4)
RETLW Lcdch5 ;5 (work=5)
RETLW Lcdch6 ;6 (work=6)
RETLW Lcdch7 ;7 (work=7)
RETLW Lcdch8 ;8 (work=8)
RETLW Lcdch9 ;9 (work=9)
RETLW LcdchA ;A (work=a)
RETLW Lcdchb ;b (work=b)
RETLW LcdchC ;C (work=c)
RETLW Lcdchd ;d (work=d)
RETLW LcdchE ;E (work=e)
RETLW LcdchF ;F (work=f)
RETLW LcdNull ;10H ;" "
RETLW LcdDash ;11H ;"-"
RETLW LcdchL ;12H ;"L"
RETLW Lcdcho ;13H ;"o"
RETLW Lcdchr ;14H ;"r"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -