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

📄 9821h620.asm

📁 厨房秤的源代码和液晶说明书基于FS9821
💻 ASM
📖 第 1 页 / 共 5 页
字号:
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:
            MOVFW   R_CaliP2H       ;D3:D0=P2.2 自动关机时间,0=无自动关机,
            ANDLW   0FH             ;1-7对应30秒-210秒,8=10秒,9=300秒后自动关机
            MOVWF   R_Temp          ;P2.2->R_Temp
            BTFSS   STATUS,Z
            GOTO    L_CalcOffTime1  ;P2.2>0 转
            BSF     R_OffTimerH,7   ;P2.2=0(无自动关机),1->R_OffTimerH.7
            GOTO    L_CalcOffTimeRet
L_CalcOffTime1:
            CLRF    R_OffTimerH,7   ;P2.2>0,0->R_OffTimerH
            MOVFW   R_WorkStatus
            ANDLW   70H
            SUBLW   30H
            BTFSS   STATUS,Z
            GOTO    L_CalcOffTime2  ;[R_WorkStatus].6:4≠3(不在标定期间) 转
            BSF     R_OffTimerH,0   ;[R_WorkStatus].6:4=3(标定期间) 1->R_OffTimerH.0
            GOTO    L_CalcOffTimeRet
L_CalcOffTime2:
            DECF    R_Temp,0
            CALL    S_RdOffTime     ;读出自动关机时间
            MOVWF   R_OffTimerL     ;\
            ADDWF   R_OffTimerL,1   ; | 读出的自动关机时间×2
            MOVLW   0               ; | ->R_OffTimerH:R_OffTimerL
            ADDWFC  R_OffTimerH,1   ;/
L_CalcOffTimeRet:
			RETURN
S_RdOffTime:                ;读出自动关机时间
			ADDPCW
			RETLW	15      ;P2.2=1 自动关机时间为30秒
			RETLW	30      ;P2.2=2 自动关机时间为60秒
			RETLW	45      ;P2.2=3 自动关机时间为90秒
			RETLW	60      ;P2.2=4 自动关机时间为120秒
			RETLW	75      ;P2.2=5 自动关机时间为150秒
			RETLW	90      ;P2.2=6 自动关机时间为180秒
			RETLW	105     ;P2.2=7 自动关机时间为210秒
			RETLW	5       ;P2.2=8 自动关机时间为10秒
			RETLW	150     ;P2.2=9 自动关机时间为300秒
;------------------------------------------------------------------------------
;子程序S_DecOffTime ;自动关机时间(单位:秒)-1->R_OffTimerH:R_OffTimerL,若已减到0则准备关机
;Input:     R_OffTimerH:R_OffTimerL
;Output:    R_OffTimerH:R_OffTimerL
;           R_WorkStatus

⌨️ 快捷键说明

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