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

📄 9821h620.asm

📁 用台湾富晶单片机开发的电子称包括源码和编译器
💻 ASM
📖 第 1 页 / 共 5 页
字号:
			MOVWF	FSR0
			MOVLW	10H				;" "
			MOVWF	IND0			;10H(" ")->IND0
			GOTO	L_DispCaliPa_1
L_DispCaliPara:						;显示当前标定的参数
			RRF		R_PubCnt1,0
			RRF		WORK,0
			RRF		WORK,0
			ANDLW	06H
			ADDLW	R_CaliMarkL
			MOVWF	FSR0			;根据[R_PubCnt1].5:4计算出当前参数的地址->FSR0
			MOVFW	IND0
			ANDLW	0FH
			MOVWF	R_DispBuff0
			MOVFW	IND0
			CALL	S_RR4Work		;[WORK]右移4位->WORK,0->WORK.7:4
			MOVWF	R_DispBuff1
			INCF	FSR0,1
			MOVFW	IND0
			ANDLW	0FH
			MOVWF	R_DispBuff2
			MOVFW	IND0
			CALL	S_RR4Work		;[WORK]右移4位->WORK,0->WORK.7:4
			MOVWF	R_DispBuff3
			MOVLW	10H
			MOVWF	R_DispBuff4		;10H(" ")->R_DispBuff4
L_DispCaliPa_1:
			MOVLW	08H	
			MOVWF	R_DispMode		;08H->R_DispMode,无小数点,16进制显示方式
			GOTO	S_Display		;去显示
;
L_SeleParaBit:						;"TARE"键按下,选择标定数据位
			INCF	R_PubCnt1,1		;[R_PubCnt1]+1->R_PubCnt1
			BCF		R_PubCnt1,2		;0->R_PubCnt1.2,[R_PubCnt1]=0-3
			GOTO	L_DispCaliPara	;去显示当前标定的参数
;
L_AdjustPara:						;UNIT"键按下或"OFF"短键释放,调整标定值
			RRF		R_PubCnt1,0
			RRF		WORK,0
			RRF		WORK,0
			ANDLW	06H
			ADDLW	R_CaliMarkL
			MOVWF	FSR0			;根据[R_PubCnt1].5:4计算出当前参数的地址->FSR0
			BTFSS	R_PubCnt1,1
			INCF	FSR0,1
			MOVLW	0FH				;0FH->WORK
			BTFSS	R_PubCnt1,0
			MOVLW	0F0H			;[R_PubCnt1].0=0,0F0H->WORK
			MOVWF	R_PubReg1		;[WORK]->R_PubReg1
			MOVLW	01H				;01H->WORK
			BTFSS	R_PubCnt1,0
			MOVLW	10H				;[R_PubCnt1].0=0,10H->WORK
			ADDWF	IND0,1			;[IND0]+[WORK]->IND0
			BTFSS	R_PubCnt1,0
			GOTO	L_AdjPara_1		;[R_PubCnt1].0=0 转
			MOVFW	IND0			;[R_PubCnt1].1=1
			ANDLW	0FH
			BTFSS	STATUS,Z
			GOTO	L_AdjPara_1		;[IND0].3:0>0 转
			MOVLW	10H
			SUBWF	IND0,1			;[IND0]-10H->IND0
L_AdjPara_1:
			MOVLW	R_CaliMarkL
			SUBWF	FSR0,0
			CALL	S_RdParaMaxV	;读出当前参数的最大值
			ANDWF	R_PubReg1,0
			MOVWF	R_PubReg0
			MOVFW	R_PubReg1
			ANDWF	IND0,0
			SUBWF	R_PubReg0,0
			BTFSC	STATUS,C
			GOTO	L_DispCaliPara	;当前设定的参数未超过最大值,去显示当前标定的参数
			COMF	R_PubReg1,0
			ANDWF	IND0,1			;超过最大值,当前设定值清0
			GOTO	L_DispCaliPara	;当前设定的参数未超过最大值,去显示当前标定的参数
;
L_CaliNextPara:						;"OFF"键按下2秒,进入下一个项目
			BSF		R_KeyStatus,4	;1->R_KeyStatus.4
			BSF		R_KeyStatus,5	;1->R_KeyStatus.5
			MOVLW	0F0H
			ANDWF	R_PubCnt1,0
			BTFSC	STATUS,Z
			CALL	S_CaliCodeProc	;[R_PubCnt1].7:4=0 处理重量标定数据
			MOVLW	20H
			SUBWF	R_PubCnt1,0
			BTFSC	STATUS,C
			GOTO	L_CaliParaOver	;[R_PubCnt1].7:4≥2 转 标定完成处理
			MOVFW	R_PubCnt1
			ADDLW	10H
			ANDLW	30H
			MOVWF	R_PubCnt1
			GOTO	L_DispCaliPara	;去显示下一个标定参数
L_CaliParaOver:						;标定完成处理
			CALL	S_ClrDisp		;清LCD显示缓冲区LCD1-LCD6
			MOVLW	D_CaliMark1
			MOVWF	R_CaliParaFlag	;D_CaliMark1->R_CaliParaFlag
			CALL	S_WrCaliData	;将[R_CaliChksumH:R_CaliMarkL]的8个16位数据写入到93LC46的00H-07H中
			MOVLW	20H
			MOVWF	R_PubCnt1		;20H->R_PubCnt1,定时2秒
			MOVLW	0C0H
			MOVWF	R_WorkStatus	;0C0H->R_WorkStatus,2秒后关机。
			MOVLW	15H				;"H"					;\
			MOVWF	R_DispBuff4		;15H("H")->R_DispBuff4	; |
			MOVLW	06H										; | 显示版本号
			MOVWF	R_DispBuff3		;06H("6")->R_DispBuff3	; | "H620 "
			MOVLW	02H										; |
			MOVWF	R_DispBuff2		;02H("2")->R_DispBuff2	; |
			MOVLW	00H										; |
			MOVWF	R_DispBuff1		;00H("0")->R_DispBuff1	;/
			MOVLW	08H	
			MOVWF	R_DispMode		;08H->R_DispMode,无小数点,16进制显示方式
			GOTO	S_Display		;去显示
L_CaliProcRet:
			RETURN
;
S_DispCaliCode:						;显示内码
L_DispCaliCode:						;显示内码
			BTFSS	R_PubFlag0,4
			GOTO	L_CaliProcRet	;[R_PubFlag0].4=0(未得到新的有效内码) 转,返回
			BCF		R_DispFlag,3	;0->R_DispFlag.3
			BTFSC	R_PubFlag0,5
			BSF		R_DispFlag,3	;[R_PubFlag0].5=1(称重数据稳定),1->R_DispFlag.3 显示锁符
;			MOVLW	1
;			CALL	S_ReadCode		;读当前内码->R_PubReg1:R_PubReg0
;			MOVFW	R_PubReg0		;\
;			MOVWF	R_PubReg2		; | [R_PubReg1:R_PubReg0]
;			MOVFW	R_PubReg1		; | ->R_PubReg3:R_PubReg2
;			MOVWF	R_PubReg3		;/
			MOVFW	R_LastAverageL	;\
			MOVWF	R_PubReg2		; | [R_LastAverageH:R_LastAverageL]
			MOVFW	R_LastAverageH	; | ->R_PubReg3:R_PubReg2
			MOVWF	R_PubReg3		;/
			CALL	S_Hex2BCD		;将[R_PubReg3:R_PubReg2]转换为5位BCD码->R_DispBuff4:R_DispBuff0
			MOVLW	08H	
			MOVWF	R_DispMode		;08H->R_DispMode,无小数点,16进制显示方式
			BTFSC	R_TimerCnt,3
			BSF		R_DispMode,0
			GOTO	S_Display		;去显示
;
L_DispDate:							;显示日期
			MOVLW	D_MonthH		;修改日期的月十位
			MOVWF	R_DispBuff4		;->R_DispBuff4
			MOVLW	D_MonthL		;修改日期的月个位
			MOVWF	R_DispBuff3		;->R_DispBuff3
			MOVLW	11H
			MOVWF	R_DispBuff2		;11H("-")->R_DispBuff2
			MOVLW	D_DayH			;修改日期的日十位
			MOVWF	R_DispBuff1		;->R_DispBuff1
			MOVLW	D_DayL			;修改日期的日个位
			MOVWF	R_DispBuff0		;->R_DispBuff0
			CLRF	R_DispMode		;0->R_DispMode,无小数点,10进制数显示
			GOTO	S_Display		;去显示
;------------------------------------------------------------------------------
L_OFF_Proc:							;关机处理
			CLRF	INTE			;关所有中断
			CALL	S_ClrDisp		;清LCD显示缓冲区LCD1-LCD6
			BCF		LCDENR,LCDEN	;关LCD输出
L_OFF_Wait:
			MOVLW	00H
			MOVWF	PT2				;07H->PT2
			MOVLW	00H
			MOVWF	PT1				;00H->PT1
			NOP
			GOTO	L_OFF_Wait
			RETURN
;------------------------------------------------------------------------------
;子程序S_CaliCodeProc	;[R_PubCnt1].7:4=0 处理重量标定数据
;Input:		R_CaliMarkH:R_CaliMarkL
;			R_CaliCode0H:R_CaliCode0L
;			R_SteadyCodeH:R_SteadyCodeL
;Output:	R_CaliDataH:R_CaliDataL
;Call:		S_AddSub1,S_Mul2Sub1
;			S_CalcABS
;			S_Divis
;Use RAM:	WORK,R_Count,R_PubCnt0
;			R_PubReg1:R_PubReg0,R_PubReg3:R_PubReg2,R_PubReg5:R_PubReg4
S_CaliCodeProc:
			MOVFW	R_CaliMarkL		;\
			MOVWF	R_PubReg0		; | [R_CaliMarkH:R_CaliMarkL]
			MOVFW	R_CaliMarkH		; | ->R_PubReg1:R_PubReg0
			MOVWF	R_PubReg1		;/
S_CaliCodeComm:			;标定时计算每个内码相当于重量的分度数×65536->R_CaliDataH:R_CaliDataL
			MOVFW	R_PubReg1
			ANDLW	0FFH
			BTFSC	STATUS,Z
			GOTO	L__CaliCodeP_Ret ;[R_PubReg1]=0(标定分度值<1000) 转,返回
;下面的程序将4位BCD码[R_PubReg1:R_PubReg0]转换为二进制数->R_PubReg3:R_PubReg2
			CLRF	R_PubReg2		;0->R_PubReg2
			CLRF	R_PubReg3		;0->R_PubReg3
			MOVLW	4
			MOVWF	R_PubCnt0		;4->R_PubCnt0
L_BCD2HexLoop:
			CLRF	R_PubReg4		;0->R_PubReg4
			CLRF	R_PubReg5		;0->R_PubReg5
			MOVLW	4
			MOVWF	R_Count			;4->R_Count
L_BCD2HexL_1:
			RLF		R_PubReg0,1
			RLF		R_PubReg1,1
			RLF		R_PubReg4,1
			DECFSZ	R_Count,1
			GOTO	L_BCD2HexL_1
;
			CALL	S_AddSub1	;[R_PubReg3:R_PubReg2]+[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg2
			CALL	S_Mul2Sub1	;[R_PubReg3:R_PubReg2]×2->R_PubReg3:R_PubReg2
			MOVFW	R_PubReg2		;\
			MOVWF	R_PubReg4		; | [R_PubReg3:R_PubReg2]
			MOVFW	R_PubReg3		; | ->R_PubReg5:R_PubReg4
			MOVWF	R_PubReg5		;/
			CALL	S_Mul2Sub1	;[R_PubReg3:R_PubReg2]×2->R_PubReg3:R_PubReg2
			CALL	S_Mul2Sub1	;[R_PubReg3:R_PubReg2]×2->R_PubReg3:R_PubReg2
			CALL	S_AddSub1	;[R_PubReg3:R_PubReg2]+[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg2
;								以上17行相当于[R_PubReg3:R_PubReg2]×10
L_BCD2Hex_Next:			
			DECFSZ	R_PubCnt0,1
			GOTO	L_BCD2HexLoop
;上面的程序将4位BCD码[R_PubReg1:R_PubReg0]转换为二进制数->R_PubReg3:R_PubReg2
			MOVFW	R_CaliCode0L	;\
			MOVWF	R_PubReg0		; | [R_CaliCode0H:R_CaliCode0L]
			MOVFW	R_CaliCode0H	; | ->R_PubReg1:R_PubReg0
			MOVWF	R_PubReg1		;/
			MOVFW	R_SteadyCodeL	;\
			MOVWF	R_PubReg4		; | [R_SteadyCodeH:R_SteadyCodeL]
			MOVFW	R_SteadyCodeH	; | ->R_PubReg5:R_PubReg4
			MOVWF	R_PubReg5		;/
			CALL	S_CalcABS		;计算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]绝对值->R_PubReg5:R_PubReg4
			MOVFW	R_PubReg4
			SUBWF	R_PubReg2,0
			MOVFW	R_PubReg5
			SUBWFC	R_PubReg3,0
			BTFSC	STATUS,C
			GOTO	L__CaliCodeP_Ret ;[R_PubReg3:R_PubReg2]≥[R_PubReg5:R_PubReg4] 转,返回
			CALL    S_Divis	;[R_PubReg3:R_PubReg2]×65536÷[R_PubReg5:R_PubReg4]->R_PubReg1:R_PubReg0
			BTFSC	R_PubReg1,7
			GOTO	L__CaliCodeP_Ret ;[R_PubReg1]≥80H(每个内码对应的重量≥0.5d) 转,返回
			MOVFW	R_PubReg0		;\
			MOVWF	R_CaliDataL		; | [R_PubReg1:R_PubReg0]
			MOVFW	R_PubReg1		; | ->R_CaliDataH:R_CaliDataL
			MOVWF	R_CaliDataH		;/
			MOVLW	D_CaliMark2
			MOVWF	R_CaliCodeFlag	;D_CaliMark2->R_CaliCodeFlag 重量标定成功
L__CaliCodeP_Ret:
			RETURN
;子程序S_AddSub1	;[R_PubReg3:R_PubReg2]+[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg2
S_AddSub1:
			MOVFW	R_PubReg4		;\
			ADDWF	R_PubReg2,1		; | [R_PubReg3:R_PubReg2]+[R_PubReg5:R_PubReg4]
			MOVFW	R_PubReg5		; | ->R_PubReg3:R_PubReg2
			ADDWFC	R_PubReg3,1		;/ 
			RETURN
;子程序S_Mul2Sub1	;[R_PubReg3:R_PubReg2]×2->R_PubReg3:R_PubReg2
S_Mul2Sub1:
			BCF		STATUS,C		;\
			RLF		R_PubReg2,1		; | [R_PubReg3:R_PubReg2]×2->R_PubReg3:R_PubReg2
			RLF		R_PubReg3,1		;/
			RETURN
;------------------------------------------------------------------------------
;子程序S_RdParaMaxV	;读出当前参数的最大值
S_RdParaMaxV:
			ADDPCW
			RETLW	99H		;P0.1、P0.0的最大值
			RETLW	29H		;P0.3、P0.2的最大值
			RETLW	7FH		;P1.1、P1.0的最大值
			RETLW	93H		;P1.3、P1.2的最大值
			RETLW	97H		;P2.1、P2.0的最大值
			RETLW	39H		;P2.3、P2.2的最大值
;------------------------------------------------------------------------------
;子程序S_RR4Work		;[WORK]右移4位->WORK,0->WORK.7:4
S_RR4Work:	RRF		WORK,0
			RRF		WORK,0
			RRF		WORK,0
			RRF		WORK,0
			ANDLW	0FH
			RETURN
;------------------------------------------------------------------------------
;子程序S_ReadKey		;读按键,并作简单判断处理
;Output:	R_KeyStatus,R_KeyCode
;Call:		S_RdKeyCode
;Use RAM:	WORK,R_PubCnt2,R_PubCnt3
S_ReadKey:	MOVFW	PT2
			XORLW	07H
			ANDLW	07H
			MOVWF	R_PubCnt2		;PT.2:0取反->R_PubCnt2.2:0,R_PubCnt2:7:3=00000B
			BTFSS	STATUS,Z
			GOTO	L_ReadKey2		;[R_PubCnt2]≠0(有键按下) 转
			BCF		R_PubFlag1,0	;0->R_PubFlag1.0
			MOVFW	R_KeyStatus
			ANDLW	0F0H
			BTFSS	STATUS,Z
			GOTO	L_ReadKey1		;[R_KeyStatus].7:4≠0 转
			BSF		R_KeyCode,3		;1->R_KeyCode.3 (按键释放)
			BSF		R_KeyStatus,7	;1->R_KeyStatus.7
			BSF		R_KeyStatus,4	;1->R_KeyStatus.4
			GOTO	L_ReadKeyRet
L_ReadKey1:	
			MOVLW	1FH
			ANDWF	R_KeyStatus,1	;0->R_KeyStatus.7:5
			BSF		R_KeyStatus,4	;1->R_KeyStatus.4
			GOTO	L_ReadKeyRet
L_ReadKey2:
			MOVFW	R_KeyStatus
			ANDLW	0F0H
			XORLW	70H
			BTFSC	STATUS,Z
			GOTO	L_ReadKeyRet	;[R_KeyStatus].7:4=7 转
			DECF	R_PubCnt2,0
			CALL	S_RdKeyCode		;读键码
			MOVWF	R_PubCnt3		;键码->R_PubCnt3
			BTFSC	R_KeyStatus,4
			GOTO	L_ReadKey3		;[R_KeyStatus].4=1 转
			MOVFW	R_KeyStatus
			ANDLW	0FH
			XORWF	R_PubCnt2,0
			BTFSC	STATUS,Z
			GOTO	L_ReadKey4		;[R_PubCnt2]=[R_KeyStatus].3:0 (按键状态未变) 转
L_ReadKey3:
			MOVLW	0F0H
			ANDWF	R_KeyStatus,0
			IORWF	R_PubCnt2,0
			MOVWF	R_KeyStatus		;[R_PubCnt2]->[R_KeyStatus].3:0 保存按键状态
			MOVFW	R_PubCnt3
			MOVWF	R_KeyCode		;[R_PubCnt3]->R_KeyCode 保存键码
			MOVFW	R_KeyStatus
			ANDLW	0F0H
			XORLW	30H
			BTFSS	STATUS,Z
			BSF		R_KeyStatus,7	;[R_KeyStatus].7:4≠3,1->R_KeyStatus.7
			BCF		R_KeyStatus,4	;0->R_KeyStatus.4
			BCF		R_KeyStatus,6	;0->R_KeyStatus.6
			MOVLW	10H				;10H=2秒
			ADDWF	R_TimerCnt,0
			MOVWF	R_KeyTimer1		;[R_TimerCnt]+10H(2秒)->R_KeyTimer1
			MOVLW	28H				;28H=5秒
			ADDWF	R_TimerCnt,0
			MOVWF	R_KeyTimer2		;[R_TimerCnt]+28H(5秒)->R_KeyTimer2
			MOVLW	05H
			SUBWF	R_KeyCode,0
			BTFSS	STATUS,Z
			GOTO	L_ReadKey4		;[R_KeyCode]≠05H(不是"UNIT"键按下) 转
			MOVLW	50H				;50H=10秒,按住"UNIT"键进入快速标定的时间为10秒

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -