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

📄 新建 文本文档.asm

📁 这是基于富晶单片机FS9821平台的有关电子秤的开发源程序。其中有AD判稳和温度自动补偿的子程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
L_InitOther: 
            		CALL   	S_CalcUnitData	;计算1d对应的不同计量单位的值(浮点数), 
;            		结果->R_UnitData2(2的指数)、R_UnitData1:R_UnitData0(有效数字) 
	    		CALL	S_CalcLockCode	;计算锁定判断的内码值->R_OffsetCode 
            		CALL    S_CalcOffTime	;计算自动关机时间(单位:秒)->R_OffTimerH:R_OffTimerL 
			CLRF	INTF 
			MOVLW	10010100B 
			MOVWF	INTE			;GIE=1,TMIE=1,ADIE=1 
L_InitEnd: 
; 
L_MainLoop:					;主循环 
      			BTFSS   R_PubFlag1,7 
      			GOTO	L_MainAdcProc	;[R_PubFlag1].7=0(未到1/16秒),转 
			BCF	R_PubFlag1,7	;0->R_PubFlag1.7 
      			BSF	R_PubFlag0,0	;1/16秒到 
                	CALL    S_ReadKey		;读按键,并作简单判断处理 
			MOVLW	04H 
			XORWF	R_PubFlag0,1	;R_PubFlag0.2取反 
			BTFSC	R_PubFlag0,2 
			GOTO	L_MainAdcProc	;[R_PubFlag0.2]=1 (未到1/8秒) 转 
			INCF	R_TimerCnt,1	;[R_TimerCnt]+1->R_TimerCnt 
; 
			BCF	R_DispFlag,0	;0->R_DispFlag.0(电池符号) 
			BTFSS	SVD,LBOUT 
            		GOTO    L_Main_BattLow  ;LBOUT=0(电池低电压) 转 
            		BCF     LCD1,0          ;电池电压正常,0->LCD1.0 不显示电池符号 
            		CLRF    R_BattLowCnt    ;电池电压正常,0->R_BattLowCnt 
            		GOTO    L_Main_0 
L_Main_BattLow: 
			BSF	R_DispFlag,0	;LBOUT=0(电池低电压),1->R_DispFlag.0 显示电池符号 
            		BSF     LCD1,0          ;电池低电压,1->LCD1.0 显示电池符号 
			INCF    R_BattLowCnt,1  ;电池电压低,[R_BattLowCnt]+1->R_BattLowCnt 
			BCF     R_BattLowCnt,7  ;0->R_BattLowCnt.7 
; 
L_Main_0: 
			MOVFW	R_WorkStatus 
			ANDLW	0F0H 
			SUBLW	10H 
			BTFSS	STATUS,Z 
			GOTO	L_Main_1		;[R_WorkStatus].7:4≠1(不是称重状态) 转 
			BTFSS	R_PubFlag0,5 
			CLRF	R_SteadyTimer	;[R_PubFlag0].5=0(称重不稳定),0->R_SteadyTimer 
			INCF	R_SteadyTimer,1	;[R_SteadyTimer]+1->R_SteadyTimer 
			BTFSC	STATUS,Z 
			DECF	R_SteadyTimer,1	;[R_SteadyTimer]=0,[R_SteadyTimer]-1->R_SteadyTimer 
L_Main_1: 
			MOVLW	03H 
			ANDWF	R_TimerCnt,0 
			BTFSS	STATUS,Z 
			GOTO	L_MainAdcProc	;[R_TimerCnt]&03H≠0(未到1/2秒) 转 
			BSF	R_PubFlag0,1	;1->R_PubFlag0.1 
			MOVLW	07H 
			ANDWF	R_TimerCnt,0 
			BTFSS	STATUS,Z 
			GOTO	L_MainAdcProc	;[R_TimerCnt]&07H≠0(未到1秒) 转 
  			CALL    S_DecOffTime ;自动关机时间(单位:秒)-1->R_OffTimerH:R_OffTimerL,若已减到0则准备关机 
; 
L_MainAdcProc: 
			BTFSS	R_PubFlag0,3 
			GOTO	L_Main_5		;未读到ADC内码,转 
			BCF	R_PubFlag0,3	;0->R_PubFlag0.3 
			MOVFW	R_AdcDataL		;\ 
			ADDWF	R_AdcSumL,1		; \ 
			MOVFW	R_AdcDataH		;  | [R_AdcSumH:R_AdcSumL]+[R_AdcDataH:R_AdcDataL] 
			ADDWFC	R_AdcSumM,1		;  | ->R_AdcSumH:R_AdcSumL 
			MOVLW	0			; / 
			ADDWFC	R_AdcSumH,1		;/ 
			INCF	R_AdcDataCnt,1	;[R_AdcDataCnt]+1->R_AdcDataCnt 
; 
			BTFSS	R_AdcDataCnt,3 
			GOTO	L_Main_5		;[R_AdcDataCnt]<8 转 
; 
			MOVFW	R_AdcSumL		;\ 
			MOVWF	R_PubReg0		; \ 
			MOVFW	R_AdcSumM		;  | 
			MOVWF	R_PubReg1		;  | [R_AdcSumH:R_AdcSumL]->R_PubReg3:R_PubReg0 
			MOVFW	R_AdcSumH		;  | 
			MOVWF	R_PubReg2		; / 
			CLRF	R_PubReg3		;/ 
			CLRF	R_AdcSumL		;0->R_AdcSumL 
			CLRF	R_AdcSumM		;0->R_AdcSumM 
			CLRF	R_AdcSumH		;0->R_AdcSumH 
			CLRF	R_AdcDataCnt	;0->R_AdcDataCnt 
; 
			MOVLW	4			;\ 
			MOVWF	R_PubReg4		; | 4->R_PubReg5:R_PubReg4 
			CLRF	R_PubReg5		;/ 
; 
			CALL	S_DivisM	;[R_PubReg3:R_PubReg0]÷[R_PubReg5:R_PubReg4]->R_PubReg1:R_PubReg0 
			BSF	R_PubFlag0,4	;1->R_PubFlag0.4 (有效内码) 
			INCF	R_CodePointer,1	;内码存储指针+1 
			BCF	R_CodePointer,3	;0->R_CodePointer.3 
			DECF	R_CodePointer,0		;\ 
			ANDLW	07H			; \ 
			BCF	STATUS,C		;  | 
			RLF	WORK,0			;  | 
			ADDLW	R_CodeBuffer		;  | 
			MOVWF	FSR0			;  | 新的有效内码[R_PubReg1:R_PubReg0] 
			MOVFW	R_PubReg0		;  | ->内码缓冲区保存 
			MOVWF	IND0			;  | 
			INCF	FSR0,1			;  | 
			MOVFW	R_PubReg1		; / 
			MOVWF	IND0			;/ 
; 
			MOVFW	R_LastAverageL		;\ 
			MOVWF	R_PubReg4		; | [R_LastAverageH:R_LastAverageL] 
			MOVFW	R_LastAverageH		; | ->R_PubReg5:R_PubReg4 
			MOVWF	R_PubReg5		;/ 
			CALL	S_CalcABS		;计算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]绝对值->R_PubReg5:R_PubReg4 
L_MainAdcP_1: 
            		MOVLW   20 
			SUBWF	R_PubReg4,0 
			MOVLW   0 
			SUBWFC	R_PubReg5,0 
; 
;			MOVFW	R_10dCodeL 
;			SUBWF	R_PubReg4,0 
;			MOVFW	R_10dCodeH 
;			SUBWFC	R_PubReg5,0 
; 
			BTFSC	STATUS,C 
			GOTO	L_MainAdcP_6	;[R_PubReg5:R_PubReg4]≥[R_10dCodeH:R_10dCodeL] (数据不稳)转 
			MOVLW	8 
			CALL	S_ReadCode	;计算最近4次的内码的平均值->R_PubReg1:R_PubReg0 
			MOVFW	R_LastAverageL		;\ 
			SUBWF	R_PubReg0,0		; \ 
			MOVWF	R_PubReg4		;  | [R_PubReg1:R_PubReg0]-[R_LastAverageH:R_LastAverageL] 
			MOVFW	R_LastAverageH		;  | ->R_PubReg5:R_PubReg4 
			SUBWFC	R_PubReg1,0		; /  
			MOVWF	R_PubReg5		;/ 
			MOVFW	R_PubReg0		;\ 
			MOVWF	R_LastAverageL		; | [R_PubReg1:R_PubReg0]->R_LastAverageH:R_LastAverageL 
			MOVFW	R_PubReg1		; | 
			MOVWF	R_LastAverageH		;/ 
			MOVFW	R_PubReg4		;\ 
			ADDWF	R_DifferenceL,1		; | [R_DifferenceH:R_DifferenceL]+[R_PubReg5:R_PubReg4] 
			MOVFW	R_PubReg5		; | ->R_DifferenceH:R_DifferenceL (累计差值) 
			ADDWFC	R_DifferenceH,1		;/ 
			MOVFW	R_DifferenceL		;\ 
			MOVWF	R_PubReg4		; | [R_DifferenceH:R_DifferenceL] 
			MOVFW	R_DifferenceH		; | ->R_PubReg5:R_PubReg4 
			MOVWF	R_PubReg5		;/ 
			BTFSS	R_PubReg5,7 
			GOTO	L_MainAdcP_2	;[R_PubReg5].7=0(正数) 转 
			CALL	S_CalcABS1		;计算[R_PubReg5:R_PubReg4]的补码->R_PubReg5:R_PubReg4 
L_MainAdcP_2:			 
			MOVLW	0 
			SUBWF	R_PubReg5,0 
			BTFSS	STATUS,Z 
			GOTO	L_MainAdcP_7	;[R_PubReg5]>0 (数据不稳) 转 
			MOVFW	R_PubReg4 
			SUBWF	R_OffsetCode,0 
			BTFSS	STATUS,C 
			GOTO	L_MainAdcP_7	;[R_PubReg4]>[R_OffsetCode] (数据不稳) 转 
			BTFSC	R_PubFlag0,5 
			GOTO	L_MainAdcP_5	;[R_PubFlag0].5=1(已锁定) 转 
			MOVFW	R_LockCodeNum 
			SUBWF	R_SteadyCnt,0 
			BTFSC	STATUS,C 
			GOTO	L_MainAdcP_3	;[R_SteadyCnt]≥[R_LockCodeNum](稳定次数到)转 
			INCF	R_SteadyCnt,1	;稳定次数未到,[R_SteadyCnt]+1->R_SteadyCnt 
			GOTO	L_MainAdcP_8 
L_MainAdcP_3: 
			BSF	R_PubFlag0,5	;1->R_PubFlag0.5 锁定 
			BTFSC	R_PubFlag0,6 
			GOTO	L_MainAdcP_4	;[R_PubFlag0].6=1 转 
			BSF	R_PubFlag0,6	;1->R_PubFlag0.6 
			BSF	R_PubFlag0,7	;1->R_PubFlag0.7 
L_MainAdcP_4: 
			MOVFW	R_WorkStatus 
			ANDLW	70H 
			XORLW	30H 
			BTFSS	STATUS,Z 
			GOTO	L_MainAdcP_41	;[R_WorkStatus]的高4位≠3且≠B,转 
			MOVFW	R_LastAverageL		;\ 
			MOVWF	R_ZeroCodeL   		; | [R_LastAverageH:R_LastAverageL]->R_ZeroCodeH:R_ZeroCodeL 
			MOVFW	R_LastAverageH		; | 标定中保存当前锁定内码 
			MOVWF	R_ZeroCodeH		;/ 
			GOTO	L_MainAdcP_8 
L_MainAdcP_41: 
			MOVFW	R_LastAverageL	;\ 
			MOVWF	R_SteadyCodeL	; | [R_LastAverageH:R_LastAverageL] 
			MOVFW	R_LastAverageH	; | ->R_SteadyCodeH:R_SteadyCodeL 保存稳定内码数据 
			MOVWF	R_SteadyCodeH	;/ 
			GOTO	L_MainAdcP_8 
; 
L_MainAdcP_5: 
            		BTFSC   R_CaliP1L,6 
			GOTO	L_MainAdcP_8    ;[R_CaliP1L].6=1(无自动追重) 转 
			MOVFW	R_WorkStatus 
			ANDLW	70H 
			XORLW	30H 
			BTFSC	STATUS,Z 
			GOTO	L_MainAdcP_8	;[R_WorkStatus]的高4位=3或=B(标定中),转 
;            DECFSZ  R_TraceCnt,1 
;            GOTO    L_MainAdcP_8    ;[R_TraceCnt]-1->R_TraceCnt,[R_TraceCnt]≠0 转 
;            MOVLW   D_TraceCnt 
;            MOVWF   R_TraceCnt      ;D_TraceCnt->R_TraceCnt 
            		MOVFW   R_SteadyCodeL   ;\ 
            		MOVWF   R_PubReg0       ; | [R_SteadyCodeH:R_SteadyCodeL] 
            		MOVFW   R_SteadyCodeH   ; | ->R_PubReg1:R_PubReg0 
            		MOVWF   R_PubReg1       ;/ 
			MOVFW	R_LastAverageL		;\ 
			MOVWF	R_PubReg4		; | [R_LastAverageH:R_LastAverageL] 
			MOVFW	R_LastAverageH		; | ->R_PubReg5:R_PubReg4 
			MOVWF	R_PubReg5		;/ 
			CALL	S_CalcABS		;计算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]绝对值->R_PubReg5:R_PubReg4 
;                                    R_PubFlag1.3	=1时减法结果为负数 
            		MOVFW   R_PubReg4 
            		IORWF   R_PubReg5,0 
            		BTFSC	STATUS,Z 
            		GOTO    L_MainAdcP_8    ;[R_PubReg5:R_PubReg4]=0(无需自动追重) 转 
            		BTFSC   R_PubFlag1,3 
            		GOTO    L_MainAdcP_51   ;[R_PubFlag1].3=1(减法结果为负数) 转 
           		BTFSC   R_PubFlag1,5 
            		GOTO    L_MainAdcP_52   ;[R_PubFlag1].5=1(上次减法结果为负数) 转 
            		DECFSZ  R_TraceCnt,1 
            		GOTO    L_MainAdcP_8    ;[R_TraceCnt]-1->R_TraceCnt,[R_TraceCnt]≠0 转 
            		MOVLW   D_TraceCnt 
            		MOVWF   R_TraceCnt      ;D_TraceCnt->R_TraceCnt 
            		MOVLW   1               ;\ 
            		ADDWF   R_SteadyCodeL,1 ; | [R_SteadyCodeH:R_SteadyCodeL]+1 
            		MOVLW   0               ; | ->R_SteadyCodeH:R_SteadyCodeL 
            		ADDWFC  R_SteadyCodeH,1 ;/ 
            		MOVLW   1               ;\ 
            		ADDWF   R_ZeroCodeL,1   ; | [R_ZeroCodeH:R_ZeroCodeL]+1 
            		MOVLW   0               ; | ->R_ZeroCodeH:R_ZeroCodeL 
            		ADDWFC  R_ZeroCodeH,1   ;/  零点微调 
			GOTO	L_MainAdcP_8 
L_MainAdcP_51: 
            		BTFSS   R_PubFlag1,5 
            		GOTO    L_MainAdcP_53   ;[R_PubFlag1].5=0(上次减法结果为正数) 转 
            		DECFSZ  R_TraceCnt,1 
            		GOTO    L_MainAdcP_8    ;[R_TraceCnt]-1->R_TraceCnt,[R_TraceCnt]≠0 转 
            		MOVLW   D_TraceCnt 
            		MOVWF   R_TraceCnt      ;D_TraceCnt->R_TraceCnt 
            		MOVLW   1               ;\ 
            		SUBWF   R_SteadyCodeL,1 ; | [R_SteadyCodeH:R_SteadyCodeL]-1 
            		MOVLW   0               ; | ->R_SteadyCodeH:R_SteadyCodeL 
            		SUBWFC  R_SteadyCodeH,1 ;/ 
            		MOVLW   1               ;\ 
            		SUBWF   R_ZeroCodeL,1   ; | [R_ZeroCodeH:R_ZeroCodeL]-1 
            		MOVLW   0               ; | ->R_ZeroCodeH:R_ZeroCodeL 
            		SUBWFC  R_ZeroCodeH,1   ;/  零点微调 
			GOTO	L_MainAdcP_8 
L_MainAdcP_52: 
            		BCF     R_PubFlag1,5    ;0->R_PubFlag1.5 
            		GOTO    L_MainAdcP_54 
L_MainAdcP_53: 
            		BSF     R_PubFlag1,5    ;1->R_PubFlag1.5 
L_MainAdcP_54: 
            		MOVLW   D_TraceCnt 
            		MOVWF   R_TraceCnt      ;D_TraceCnt->R_TraceCnt 
	    		GOTO	L_MainAdcP_8 
L_MainAdcP_6: 
			MOVLW	1 
			CALL	S_ReadCode		;读当前内码->R_PubReg1:R_PubReg0 
			MOVFW	R_PubReg0		;\ 
			MOVWF	R_LastAverageL		; | [R_PubReg1:R_PubReg0]->R_LastAverageH:R_LastAverageL 
			MOVFW	R_PubReg1		; | 
			MOVWF	R_LastAverageH		;/ 
			MOVLW	8 
			MOVWF	R_Count			;8->R_Count 
			MOVLW	R_CodeBuffer 
			MOVWF	FSR0			;R_CodeBuffer->FSR0 
L_MainAdcP_L1: 
			MOVFW	R_PubReg0 
			MOVWF	IND0 
			INCF	FSR0,1 
			MOVFW	R_PubReg1 
			MOVWF	IND0 
			INCF	FSR0,1 
			DECFSZ	R_Count,1 
			GOTO	L_MainAdcP_L1 
			CLRF	R_CodePointer	;0->R_CodePointer 
L_MainAdcP_7: 
			BCF	R_PubFlag0,5	;0->R_PubFlag0.5 (数据不稳) 
			CLRF	R_SteadyCnt		;0->R_SteadyCnt 
			CLRF	R_DifferenceL	;0->R_DifferenceL 
			CLRF	R_DifferenceH	;0->R_DifferenceH 
            		MOVLW   8 
            		MOVWF   R_TraceCnt      ;8->R_TraceCnt 
L_MainAdcP_8: 
			MOVLW	1 
			CALL	S_ReadCode		;读当前内码->R_PubReg1:R_PubReg0 
			BSF	R_PubFlag1,4	;1->R_PubFlag1.4 
			MOVLW	D_OverCodeL		;\ 
			SUBWF	R_PubReg0,0		; | [R_PubReg1:R_PubReg0]-D_OverCodeH:D_OverCodeL 
			MOVLW	D_OverCodeH		; | (内码超载判断) 
			SUBWFC	R_PubReg1,0		;/ 
			BTFSS	STATUS,C 
			BCF	R_PubFlag1,4	;内码不超载,0->R_PubFlag1.4 
			BTFSS	R_PubFlag0,5 
			GOTO	L_Main_5		;[R_PubFlag0].5=0(内码未锁定) 转 
			BTFSS	R_PubFlag0,7 
			GOTO	L_Main_5		;[R_PubFlag0].7=0, 转 
			BCF	R_PubFlag0,7	;0->R_PubFlag0.7 
			BTFSC	R_PubFlag1,4 
			GOTO	L_Main_5		;[R_PubFlag1]=1(内码超载) 转 
			MOVFW	R_LastAverageL	;\ 
			MOVWF	R_ZeroCodeL   	; | [R_LastAverageH:R_LastAverageL]->R_ZeroCodeH:R_ZeroCodeL 
			MOVFW	R_LastAverageH	; | 保存零点内码 
			MOVWF	R_ZeroCodeH	;/ 
L_Main_5: 
			BTFSS	R_KeyStatus,7 
			GOTO	L_Main_6		;[R_KeyStatus].7=0 转 
            		CALL    S_CalcOffTime	;计算自动关机时间(单位:秒)->R_OffTimerH:R_OffTimerL 
			MOVFW	R_WorkStatus 
			ANDLW	70H 
			XORLW	30H 
			BTFSC	STATUS,Z 
			GOTO	L_Main_6		;[R_WorkStatus]的高4位=3或=B(标定状态),转 
			MOVLW	0CH 
			SUBWF	R_KeyCode,0 
			BTFSS	STATUS,Z 
			GOTO	L_Main_51		;[R_KeyCode]≠0CH(不是"OFF"键短键释放) 转 
			MOVLW	40H				;"OFF"键短键释放 
			MOVWF	R_WorkStatus	;40H->R_WorkStatus 关机 
L_Main_51:			 
			MOVLW	0E5H 
			SUBWF	R_KeyStatus,0 

⌨️ 快捷键说明

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