📄 9821h621.asm
字号:
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对应的KG/LB的值(浮点数),
; 结果->R_UnitData2(2的指数)、R_UnitData1:R_UnitData0(有效数字)
;Input: R_PubFlag1.5
;Output: R_UnitData1:R_UnitData0
; R_UnitData2
;Use RAM: WORK
S_CalcUnitData:
BTFSC R_PubFlag1,5
GOTO L_CalcUnit_lb ;[R_PubFlag1].5=1(计量单位="lb") 转
MOVLW 01H ;\ 计量单位="kg"
MOVWF R_UnitData0 ; | 0001H->R_UnitData1:R_UnitData0(有效数字)
CLRF R_UnitData1 ;/ 0001H÷65536÷2的-16次方=1
MOVLW 0F0H ; 0F0H->R_UnitData2(2的指数)
MOVWF R_UnitData2 ; [R_UnitData2]=0F0H表示"2的-16次方"
GOTO L_CalcUnitD_Ret
L_CalcUnit_lb:
MOVLW 18H ;\ 计量单位="lb",1kg=2.205lb
MOVWF R_UnitData0 ; | 8D18H->R_UnitData1:R_UnitData0(有效数字)
MOVLW 8DH ; | 8D18H÷65536÷2的-2次方=2.205
MOVWF R_UnitData1 ;/
MOVLW 0FEH ; 0FEH->R_UnitData2(2的指数)
MOVWF R_UnitData2 ; [R_UnitData2]=0FEH表示"2的-2次方"
L_CalcUnitD_Ret:
RETURN
;------------------------------------------------------------------------------
;子程序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_CalcLockCode ;计算锁定判断的内码值->R_OffsetCode,10d内码->R_10dCodeH:R_10dCodeL
; 锁定所有的连续有效数据个数最大值->R_LockCodeNum
S_CalcLockCode:
MOVLW D_CaliMark
SUBWF R_CaliFlag,0
BTFSS STATUS,Z
GOTO L_CalcLockC_13 ;[R_CaliFlag]≠D_CaliMark (未标定内码) 转
MOVLW 02H
SUBWF R_CaliData3H,0
BTFSS STATUS,C
GOTO L_CalcLockC_11 ;[R_CaliData3H:R_CaliData3L]<200H (120KG未标定) 转
MOVLW R_CaliData3L
MOVWF FSR0 ;R_CaliData3L(120KG标定数据首地址)->FSR0
GOTO L_CalcLockC_14
L_CalcLockC_11:
MOVLW 02H
SUBWF R_CaliData2H,0
BTFSS STATUS,C
GOTO L_CalcLockC_12 ;[R_CaliData2H:R_CaliData2L]<200H (80KG未标定) 转
MOVLW R_CaliData2L
MOVWF FSR0 ;R_CaliData2L(80KG标定数据首地址)->FSR0
GOTO L_CalcLockC_14
L_CalcLockC_12:
MOVLW 02H
SUBWF R_CaliData1H,0
BTFSS STATUS,C
GOTO L_CalcLockC_13 ;[R_CaliData1H:R_CaliData1L]<200H (40KG未标定) 转
MOVLW R_CaliData1L
MOVWF FSR0 ;R_CaliData1L(40KG标定数据首地址)->FSR0
L_CalcLockC_14:
MOVFW IND0
MOVWF R_PubReg4 ;[IND0](标定数据低字节)->R_PubReg4
INCF FSR0,1 ;[FSR0]+1->FSR0
MOVFW IND0
MOVWF R_PubReg5 ;[IND0](标定数据高字节)->R_PubReg4
GOTO L_CalcLockC_2
L_CalcLockC_13:
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 ;/
MOVLW D_P11 ;称重锁定参数=0-7
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内码
MOVLW D_P12 ;称重速度参数=0-3
CALL S_RdScaleSpeed ;读称重速度参数
MOVWF R_LockCodeNum
RETURN
S_RdScaleSpeed: ;读称重速度参数
ADDPCW
RETLW 07H ;D_P12=0时,
RETLW 06H ;D_P12=1时,
RETLW 05H ;D_P12=2时,
RETLW 04H ;D_P12=3时,
S_RdLockPara: ;读称重锁定参数
ADDPCW
RETLW 04H ;D_P11=0时,锁定参数=4/16d
RETLW 08H ;D_P11=1时,锁定参数=8/16d
RETLW 0CH ;D_P11=2时,锁定参数=12/16d
RETLW 10H ;D_P11=3时,锁定参数=16/16d
RETLW 14H ;D_P11=4时,锁定参数=20/16d
RETLW 18H ;D_P11=5时,锁定参数=24/16d
RETLW 1CH ;D_P11=6时,锁定参数=28/16d
RETLW 20H ;D_P11=7时,锁定参数=32/16d
;------------------------------------------------------------------------------
;子程序S_RdScaleMark:读分度数
S_RdScaleMark:
ADDPCW
RETLW 25 ;D_P20=0,分度数=25×20=500
RETLW 30 ;D_P20=1,分度数=30×20=600
RETLW 40 ;D_P20=2,分度数=40×20=800
RETLW 50 ;D_P20=3,分度数=50×20=1000
RETLW 60 ;D_P20=4,分度数=60×20=1200
RETLW 68 ;D_P20=5,分度数=68×20=1360
RETLW 75 ;D_P20=6,分度数=75×20=1500
RETLW 90 ;D_P20=7,分度数=90×20=1800
RETLW 100 ;D_P20=8,分度数=100×20=2000
RETLW 150 ;D_P20=9,分度数=150×20=3000
;------------------------------------------------------------------------------
;子程序 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 80H
ANDWF R_DispFlag,1 ;0->R_DispFlag.6:0
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 10H
MOVWF R_DispBuff4 ;10H(" ")->R_DispBuff4
MOVLW 9
MOVWF R_DispBuff3 ;9->R_DispBuff3
MOVLW 3
MOVWF R_DispBuff2 ;3->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:
MOVFW R_DispMode
ANDLW 03H
SUBWF R_Count,0
BTFSC STATUS,Z
GOTO L_DispM_1
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 0F0H
ANDWF R_DispFlag,1 ;0->R_DispFlag.3:0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -