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

📄 9821h620.asm

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