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

📄 9821h621.asm

📁 用台湾富晶单片机开发的电子称包括源码和编译器
💻 ASM
📖 第 1 页 / 共 5 页
字号:
			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
			BSF		R_DispFlag,0	;LBOUT=0(电池低电压),1->R_DispFlag.0 显示电池符号
;
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:
			GOTO	L_MainAdcP_8
;
L_MainAdcP_5:
			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
			CLRF    R_2dWeightCnt   ;0->R_2dWeightCnt
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].4=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_6		;[R_KeyCode]≠0CH(不是"Cali"键短键释放) 转
			MOVLW	30H
			MOVWF	R_WorkStatus	;"Cali"键短键释放进入标定状态
			CLRF	R_ZeroCodeL		;0->R_ZeroCodeL
			CLRF	R_ZeroCodeH		;0->R_ZeroCodeH
			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
			BCF		R_PubFlag1,5	;0->R_PubFlag1.5
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
;------------------------------------------------------------------------------
;子程序S_MainFunc		;主要功能
S_MainFunc:
			BTFSS	R_WorkStatus,7
			GOTO	L_MainFunc_1	;[R_WorkStatus].7=0 转
			MOVFW	R_PubCnt1
			ANDLW	0FFH
			BTFSC	STATUS,Z
			GOTO	L_MainFunc_1	;[R_PubCnt1]=0 转
			BTFSS	R_PubFlag0,0
			GOTO	L_MainFuncRet	;[R_PubFlag0].0=0(未到1/16秒) 转,返回
			DECFSZ	R_PubCnt1,1		;[R_PubCnt1]-1->R_PubCnt1
			GOTO	L_MainFuncRet	;[R_PubCnt1]>0 转,返回
L_MainFunc_1:
			BCF		R_WorkStatus,7	;0->R_WorkStatus.7
			MOVLW	0F0H
			ANDWF	R_WorkStatus,0
			BTFSC	STATUS,Z
			GOTO	L_MainFunc0		;[R_WorkStatus].7:4=0 转
			ADDLW	0F0H
			BTFSC	STATUS,Z
			GOTO	L_CalcHeft		;[R_WorkStatus].7:4=1 转 计算并显示重量值
			ADDLW	0E0H
			BTFSC	STATUS,Z
			GOTO	L_CaliProc		;[R_WorkStatus].7:4=3 转 标定处理
			ADDLW	0F0H
			BTFSC	STATUS,Z
			GOTO	L_OFF_Proc		;[R_WorkStatus].7:4=4 转 关机处理
L_MainFuncRet:
			RETURN
;------------------------------------------------------------------------------
L_MainFunc0:						;找零点
			BTFSS	R_DispFlag,0
			GOTO    L_MainFunc0_0   ;[R_DispFlag].0=0(电池电压正常) 转
			INCF    R_BattLowCnt,1  ;[R_DispFlag].0=1(电池电压低),[R_BattLowCnt]+1->R_BattLowCnt
;			MOVLW   4
;			SUBWF   R_BattLowCnt,0
;			BTFSC   STATUS,C
;			GOTO	L_BattLowProc	;[R_BattLowCnt]≥4 转
L_MainFunc0_0:
			BTFSS	R_DispFlag,0
            CLRF    R_BattLowCnt    ;[R_DispFlag].0=0(电池电压正常),0->R_BattLowCnt
;
;			CALL	S_DispCaliCode	;去显示内码
;
			BTFSS	R_PubFlag0,6
			GOTO	L_MainFunc0Ret	;[R_PubFlag0].6=0 转
			BTFSC   R_WorkStatus,0
			GOTO    L_MainFunc0_1   ;[R_WorkStatus].0=1 转
			BSF     PT1,7           ;1->PT1.7 点亮背光灯
			BSF     R_WorkStatus,0  ;1->R_WorkStatus.0
			CLRF    R_PubFlag0,6    ;0->R_PubFlag0.6
			GOTO    L_MainFunc0_2
L_MainFunc0_1:
			MOVLW	10H
			MOVWF	R_WorkStatus	;10H->R_WorkStatus 进入称重状态
L_MainFunc0_2:
            CALL    S_CalcOffTime	;计算自动关机时间(单位:秒)->R_OffTimerH:R_OffTimerL
L_MainFunc0Ret:
			RETURN
L_BattLowProc:						;电池低电压处理
			MOVLW	20H
			MOVWF	R_PubCnt1		;20H->R_PubCnt1,定时2秒
			MOVLW	0C0H
			MOVWF	R_WorkStatus	;0C0H->R_WorkStatus,2秒后关机
			CALL	S_ClrDisp		;清LCD显示缓冲区LCD1-LCD6
			MOVLW	12H
			MOVWF	R_DispBuff2		;12H("L")->R_DispBuff2
			MOVLW	13H
			MOVWF	R_DispBuff1		;13H("o")->R_DispBuff1
			MOVLW	08H
			MOVWF	R_DispMode		;1->R_DispMode.3 显示提示信息
			GOTO	S_Display		;去显示"  Lo "
;------------------------------------------------------------------------------
;下面计算出重量值,并根据公/英制要求送显示缓冲区
L_CalcHeft:							;计算并显示重量值
			BTFSS	R_PubFlag0,4
			GOTO	L_CalcHeftRet	;[R_PubFlag0].4=0(无新的有效内码) 转,返回
			MOVLW	01H
			ANDWF	R_DispFlag,1	;0->R_DispFlag.7:1
			BTFSC	R_PubFlag1,4
			GOTO	L_DispOverErr	;[R_PubFlag1].4=1(超载) 转,显示超载错误
L_CalcHeft_1:
			MOVFW   R_ZeroCodeL     ;\
			MOVWF   R_PubReg4       ; | 当前零点内码[R_ZeroCodeH:R_ZeroCodeL]
			MOVFW   R_ZeroCodeH     ; | ->R_PubReg5:R_PubReg4
			MOVWF   R_PubReg5       ;/
			CALL    S_CalcRelWeight ;计算[R_PubReg5:R_PubReg4]中的内码相对于标定零点的重量
;			                          ->R_PubReg3:R_PubReg0,[R_PubFlag1].3=1为负数
            MOVFW   R_PubReg0       ;\
            MOVWF   R_TmpPubReg0    ; \
            MOVFW   R_PubReg1       ;  |
            MOVWF   R_TmpPubReg1    ;  | [R_PubReg3:R_PubReg0]
            MOVFW   R_PubReg2       ;  | ->R_TmpPubReg3:R_TmpPubReg0 暂存
            MOVWF   R_TmpPubReg2    ;  |
            MOVFW   R_PubReg3       ; /
            MOVWF   R_TmpPubReg3    ;/
            BCF     R_PubFlag1,6    ;0->R_PubFlag1.6
            BTFSC   R_PubFlag1,3
            BSF     R_PubFlag1,6    ;[R_PubFlag1].3=1,1->R_PubFlag1.6
L_CalcHeft_11:
			MOVFW	R_LastAverageL	;\
			MOVWF	R_PubReg4		; | [R_LastAverageH:R_LastAverageL] (当前平均内码)
			MOVFW	R_LastAverageH	; | ->R_PubReg5:R_PubReg4
			MOVWF	R_PubReg5		;/
			CALL    S_CalcRelWeight ;计算[R_PubReg5:R_PubReg4]中的内码相对于标定零点的重量

⌨️ 快捷键说明

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