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

📄 新建 文本文档.asm

📁 这是基于富晶单片机FS9821平台的有关电子秤的开发源程序。其中有AD判稳和温度自动补偿的子程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
			MOVLW	0			; | (四舍五入) 
			ADDWFC	R_PubReg3,1		;/ 
L_DispHeft_2: 
			MOVFW	R_PubReg2 
			IORWF	R_PubReg3,0 
			BTFSS	STATUS,Z 
			GOTO	L_DispHeft_3	;[R_PubReg3:R_PubReg2]>0 转 
			BCF	R_DispFlag,1	;[R_PubReg3:R_PubReg2]=0,0->R_DispFlag.1 不显示负号 
			BCF	R_PubFlag1,6	;[R_PubReg3:R_PubReg2]=0,0->R_PubFlag1.6 不显示稳定符号 
L_DispHeft_3: 
			MOVLW	8 
			SUBWF	R_SteadyTimer,0 
			BTFSC	STATUS,C 
			BCF	PT1,7			;[R_SteadyTimer]≥8(称重稳定到1秒),0->PT1.7(关背光灯) 
			CALL    S_Hex2BCD		;将[R_PubReg3:R_PubReg2]转换为5位BCD码->R_DispBuff4:R_DispBuff0 
			MOVLW	3 
			SUBWF	R_ScaleMarkV,0 
			BTFSS	STATUS,C 
			GOTO	L_DispHeft_4	;[R_ScaleMarkV]<3(分度值≠5) 转 
			MOVLW	5				;分度值=5 
			SUBWF	R_DispBuff0,0 
			MOVLW	5				;[R_DispBuff0]≥5,5->R_DispBuff0 
			BTFSS	STATUS,C 
			MOVLW	0				;[R_DispBuff0]<5,0->R_DispBuff0 
			MOVWF	R_DispBuff0 
L_DispHeft_4: 
			GOTO	S_Display		;去显示 
L_CalcHeftRet: 
			RETURN 
; 
L_DispOverErr:						;显示超载错误 
			CALL	S_ClrDisp 
			MOVLW	0FH 
			MOVWF	R_DispBuff3		;0FH("F")->R_DispBuff3 
			MOVWF	R_DispBuff2		;0FH("F")->R_DispBuff2 
			MOVWF	R_DispBuff1		;0FH("F")->R_DispBuff1 
			MOVWF	R_DispBuff0		;0FH("F")->R_DispBuff0 
			MOVLW	08H	 
			MOVWF	R_DispMode		;08H->R_DispMode,无小数点,16进制显示方式 
			GOTO	S_Display		;去显示 
;------------------------------------------------------------------------------ 
L_CaliProc:							;标定处理		 
			MOVLW	01H 
			ANDWF	R_DispFlag,1	;0->R_DispFlag.7:1 
			BCF     R_PubFlag1,6	;0->R_PubFlag1.6 
			BTFSC	R_WorkStatus,1 
			GOTO	L_CaliPara		;[R_WorkStatus].1=1 转去标定功能状态字 
			BTFSC	R_WorkStatus,0 
			GOTO	L_CaliCode_1	;[R_WorkStatus].0=1 转 
			BTFSS	R_PubFlag0,5 
			GOTO	L_DispCaliCode	;[R_PubFlag0].5=0(称重数据不稳定) 转去显示内码 
			MOVFW	R_ZeroCodeL		;\ 
			MOVWF	R_CaliCode0L	; | [R_ZeroCodeH:R_ZeroCodeL] 
			MOVFW	R_ZeroCodeH		; | ->R_CaliCode0H:R_CaliCode0L 保存零点内码 
			MOVWF	R_CaliCode0H	;/ 
			INCF	R_WorkStatus,1	;[R_WorkStatus]+1->R_WorkStatus 
			GOTO	L_DispCaliCode	;去显示内码 
L_CaliCode_1: 
			BTFSS	R_PubFlag0,4 
			GOTO	L_CaliCode_11	;[R_PubFlag0].4=0(无新的有效内码) 转 
			BTFSS	R_PubFlag0,5 
			GOTO	L_CaliCode_11	;[R_PubFlag0].5=0(称重数据不稳定) 转 
			MOVFW	R_ZeroCodeL		;\ 
			MOVWF	R_PubReg4		; | [R_ZeroCodeH:R_ZeroCodeL] 
			MOVFW	R_ZeroCodeH		; | ->R_PubReg5:R_PubReg4 
			MOVWF	R_PubReg5		;/ 
			MOVFW	R_CaliCode0L	;\ 
			MOVWF	R_PubReg0	; | [R_CaliCode0H:R_CaliCode0L] 
			MOVFW	R_CaliCode0H	; | ->R_PubReg1:R_PubReg0 
			MOVWF	R_PubReg1	;/ 
			CALL	S_CalcABS		;计算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]绝对值->R_PubReg5:R_PubReg4 
			MOVFW	R_PubReg5 
			ANDLW	0FFH 
			BTFSS	STATUS,Z 
			GOTO	L_CaliCode_11	;[R_PubReg5]>0 转 
			MOVFW	R_ZeroCodeL	;\ 
			MOVWF	R_CaliCode0L	; | [R_ZeroCodeH:R_ZeroCodeL] 
			MOVFW	R_ZeroCodeH	; | ->R_CaliCode0H:R_CaliCode0L 保存零点内码 
			MOVWF	R_CaliCode0H	;/ 
L_CaliCode_11: 
			BTFSC	R_KeyStatus,7 
			GOTO	L_CaliCode_2	;[R_KeyStatus].7=1 转 
			BTFSC	R_KeyStatus,4	;[R_KeyStatus].7=0 
			GOTO	L_DispCaliCode	;[R_KeyStatus].4=1 转去显示内码 
			MOVFW	R_KeyCode 
			ANDLW	0FH 
			SUBLW	06H 
			BTFSC	STATUS,Z 
			GOTO	L_DispDate		;[R_KeyCode].2:0=6("TARE"键按下)转去显示日期 
			GOTO	L_DispCaliCode	;去显示内码 
L_CaliCode_2: 
			MOVLW	0CH 
			SUBWF	R_KeyCode,0 
			BTFSS	STATUS,Z 
			GOTO	L_CaliProcRet	;[R_KeyCode]≠0CH(不是"OFF"键短键释放) 转,返回 
			BTFSC	R_PubFlag0,5 
			GOTO	L_CaliCode_3	;[R_PubFlag0].5=1(称重数据稳定),转 
			MOVFW	R_LastAverageL	;\ 
			MOVWF	R_SteadyCodeL	; | [R_LastAverageH:R_LastAverageL] 
			MOVFW	R_LastAverageH	; | ->R_SteadyCodeH:R_SteadyCodeL 数据不稳,取当前的平均值 
			MOVWF	R_SteadyCodeH	;/ 
			GOTO	L_CaliCode_4 
L_CaliCode_3: 
			MOVFW	R_ZeroCodeL	;\  称重数据稳定 
			MOVWF	R_SteadyCodeL	; | [R_ZeroCodeH:R_ZeroCodeL] 
			MOVFW	R_ZeroCodeH	; | ->R_SteadyCodeH:R_SteadyCodeL 
			MOVWF	R_SteadyCodeH	;/ 
L_CaliCode_4: 
			CLRF	R_PubCnt1		;0->R_PubCnt1 
			BCF	R_KeyStatus,7	;0->R_KeyStatus.7 
			MOVLW	70H 
			IORWF	R_KeyStatus,1	;07H->R_KeyStatus.7:4 
			INCF	R_WorkStatus,1	;[R_WorkStatus]+1->R_WorkStatus 
; 
L_CaliPara:							;标定功能状态字 
			BTFSS	R_KeyStatus,7 
			GOTO	L_DispCaliP_0	;[R_KeyStatus].7=0 转 显示标定参数 
			MOVLW	05H 
			SUBWF	R_KeyCode,0 
			BTFSC	STATUS,Z 
			GOTO	L_AdjustPara	;[R_KeyCode]=05H(是"UNIT"键按下) 转 调整标定值 
			MOVLW	0F0H 
			ANDWF	R_KeyStatus,0 
			SUBLW	80H 
			BTFSS	STATUS,Z 
			GOTO	L_CaliPara_1	;[R_KeyStatus].7:4≠8 转 
			MOVLW	06H 
			SUBWF	R_KeyCode,0 
			BTFSC	STATUS,Z 
			GOTO	L_SeleParaBit	;[R_KeyCode]=6("TARE"键按下) 转 选择标定数据位 
L_CaliPara_1: 
			MOVLW	0CH 
			SUBWF	R_KeyCode,0 
			BTFSC	STATUS,Z 
			GOTO	L_AdjustPara	;[R_KeyCode]=0CH("OFF"短键释放) 转 调整标定值 
			BTFSS	R_KeyStatus,5 
			GOTO	L_DispCaliP_0	;[R_KeyStatus].5=0(按键未到2秒) 转 
			MOVLW	04H 
			SUBWF	R_KeyCode,0 
			BTFSC	STATUS,Z 
			GOTO	L_CaliNextPara	;[R_KeyCode]=04H("OFF"键按下2秒) 转 进入下一个项目 
L_DispCaliP_0: 
			BTFSS	R_TimerCnt,2 
			GOTO	L_DispCaliPara	;[R_TimerCnt].2=0 转 显示标定参数 
			MOVFW	R_PubCnt1 
			ANDLW	03H 
			SUBLW	R_DispBuff3 
			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_PubFlag1,6	;0->R_PubFlag1.6 
			BTFSC	R_PubFlag0,5 
			BSF	R_PubFlag1,6	;[R_PubFlag0].5=1(称重数据稳定),1->R_PubFlag1.6 显示稳定符号 
;			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_CalcOffTime	;计算自动关机时间(单位:秒)->R_OffTimerH:R_OffTimerL 
;Input:     R_CaliP2H       -- D3:D0=P2.2 自动关机时间 
;           R_WorkStatus 
;Output:    R_OffTimerH:R_OffTimerL 
;Call:      S_RdOffTime 
;Use RAM:   WORK,R_Temp 
;==============================================================================
S_CalcOffTime: 

⌨️ 快捷键说明

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