⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9821h621.asm

📁 用台湾富晶单片机开发的电子称包括源码和编译器
💻 ASM
📖 第 1 页 / 共 5 页
字号:
			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 + -