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

📄 9821h620.asm

📁 厨房秤的源代码和液晶说明书基于FS9821
💻 ASM
📖 第 1 页 / 共 5 页
字号:
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
			BTFSS	STATUS,Z
			GOTO	L_Main_6		;[R_KeyStatus]≠0E5H 转
			MOVLW	30H
			MOVWF	R_WorkStatus	;同时按"OFF"+"TARE"键5秒以上进入标定状态
			CLRF	R_ZeroCodeL		;0->R_ZeroCodeL
			CLRF	R_ZeroCodeH		;0->R_ZeroCodeH
			CLRF	R_SteadyCodeL	;0->R_SteadyCodeL
			CLRF	R_SteadyCodeH	;0->R_SteadyCodeH
			BCF		R_PubFlag0,5	;0->R_PubFlag0.5
			BSF		R_PubFlag0,6	;1->R_PubFlag0.6
			BCF		R_KeyStatus,7	;0->R_KeyStatus.7
			BCF		R_KeyStatus,6	;0->R_KeyStatus.6
			BSF		R_KeyStatus,4	;1->R_KeyStatus.4
L_Main_6:
			CALL	S_MainFunc		;主要功能
			BCF		R_KeyStatus,7	;0->R_KeyStatus.7
			BCF		R_PubFlag0,4	;0->R_PubFlag0.4
			BCF		R_PubFlag0,1	;0->R_PubFlag0.1
			BCF		R_PubFlag0,0	;0->R_PubFlag0.0
			GOTO	L_MainLoop

⌨️ 快捷键说明

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