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

📄 9821h620.asm

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