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

📄 9821h621.asm

📁 用台湾富晶单片机开发的电子称包括源码和编译器
💻 ASM
📖 第 1 页 / 共 5 页
字号:
			MOVFW	R_ZeroCodeL		;\
			MOVWF	R_PubReg4		; | [R_ZeroCodeH:R_ZeroCodeL]
			MOVFW	R_ZeroCodeH		; | ->R_PubReg5:R_PubReg4
			MOVWF	R_PubReg5		;/
			CALL	S_CalcABS		;计算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]绝对值->R_PubReg5:R_PubReg4
			BTFSC	R_PubFlag1,3
			GOTO	L_CaliProcErr	;[R_PubFlag1].3=1(减法结果为负数) 转 标定错误处理
            MOVLW   90H		    ;\
            MOVWF   R_PubReg2	; | 0190H->R_PubReg3:R_PubReg2
            MOVLW   01H		    ; | 400->R_PubReg3:R_PubReg2
            MOVWF   R_PubReg3   ;/
			MOVFW	R_PubReg4
			SUBWF	R_PubReg2,0
			MOVFW	R_PubReg5
			SUBWFC	R_PubReg3,0
			BTFSC	STATUS,C
			GOTO	L_CaliProcErr ;[R_PubReg3:R_PubReg2]≥[R_PubReg5:R_PubReg4] 转,返回
			CALL    S_Divis	;[R_PubReg3:R_PubReg2]×65536÷[R_PubReg5:R_PubReg4]->R_PubReg1:R_PubReg0
			BTFSC	R_PubReg1,7
			GOTO	L_CaliProcErr ;[R_PubReg1]≥80H(每个内码对应的重量≥0.5d) 转,返回
			BTFSC	R_WorkStatus,2
			GOTO	L_CaliProc_33	;[R_WorkStatus].2=1(标定120KG) 转
			BTFSC	R_WorkStatus,1
			GOTO	L_CaliProc_32	;[R_WorkStatus].1=1(标定80KG) 转
			BTFSS	R_WorkStatus,0
			GOTO	L_CaliProcErr	;[R_WorkStatus].0=0(不是标定40KG) 转
			MOVFW   R_PubReg0       ;\
			MOVWF   R_CaliData1L    ; | [R_PubReg1:R_PubReg0]->R_CaliData1H:R_CaliData1L
			MOVFW   R_PubReg1       ; | 保存 40KG 标定数据
			MOVWF   R_CaliData1H    ;/
			CALL	S_ClrDisp
			MOVLW   04H
			MOVWF   R_DispBuff2     ;4->R_DispBuff2 ;显示“40.0KG”
            BSF     R_WorkStatus,1  ;1->R_WorkStatus.1
            GOTO    L_CaliProc_2
L_CaliProc_32:
			MOVFW   R_PubReg0       ;\
			MOVWF   R_CaliData2L    ; | [R_PubReg1:R_PubReg0]->R_CaliData2H:R_CaliData2L
			MOVFW   R_PubReg1       ; | 保存 80KG 标定数据
			MOVWF   R_CaliData2H    ;/
			CALL	S_ClrDisp
			MOVLW   08H
			MOVWF   R_DispBuff2     ;8->R_DispBuff2 ;显示“80.0KG”
            BSF     R_WorkStatus,2  ;1->R_WorkStatus.2
            GOTO    L_CaliProc_2
L_CaliProc_33:
			MOVFW   R_PubReg0       ;\
			MOVWF   R_CaliData3L    ; | [R_PubReg1:R_PubReg0]->R_CaliData3H:R_CaliData3L
			MOVFW   R_PubReg1       ; | 保存 120KG 标定数据
			MOVWF   R_CaliData3H    ;/
			CALL	S_ClrDisp
			MOVLW   02H
			MOVWF   R_DispBuff2     ;2->R_DispBuff2
			MOVLW   01H
			MOVWF   R_DispBuff3     ;1->R_DispBuff3 ;显示“120.0KG”
            BSF     R_WorkStatus,3  ;1->R_WorkStatus.3
            GOTO    L_CaliProc_2
;
L_CaliOver:						;标定完成处理
			CALL	S_ClrDisp		;清LCD显示缓冲区LCD1-LCD6
			MOVLW	D_CaliMark
			MOVWF	R_CaliFlag	;D_CaliMark->R_CaliFlag
			CALL	S_WrCaliData	;将[R_CaliChksumH:R_CaliPara]的8个16位数据写入到93LC46的00H-07H中
			MOVLW	20H
			MOVWF	R_PubCnt1		;20H->R_PubCnt1,定时2秒
			MOVLW	0C1H
			MOVWF	R_WorkStatus	;0C1H->R_WorkStatus,显示版本号2秒后再显示修改日期2秒后关机。
			MOVLW	15H				;"H"					;\
			MOVWF	R_DispBuff3		;15H("H")->R_DispBuff3	; |
			MOVLW	06H										; | 显示版本号
			MOVWF	R_DispBuff2		;06H("6")->R_DispBuff2	; | "H621 "
			MOVLW	02H										; |
			MOVWF	R_DispBuff1		;02H("2")->R_DispBuff1	; |
			MOVLW	01H										; |
			MOVWF	R_DispBuff0		;01H("0")->R_DispBuff0	;/
			MOVLW	08H	
			MOVWF	R_DispMode		;08H->R_DispMode,无小数点,16进制显示方式
			GOTO	S_Display		;去显示
L_CaliProcErr:      ;标定不成功,返回
L_CaliProcRet:
			RETURN
;
S_DispCaliCode:						;显示内码
L_DispCaliCode:						;显示内码
			BTFSS	R_PubFlag0,4
			GOTO	L_CaliProcRet	;[R_PubFlag0].4=0(未得到新的有效内码) 转,返回
			BCF		R_DispFlag,4	;0->R_DispFlag.4
			BTFSC	R_PubFlag0,5
			BSF		R_DispFlag,4	;[R_PubFlag0].5=1(称重数据稳定),1->R_DispFlag.4 显示锁符
;			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:							;显示日期
			CALL	S_ClrDisp		;清LCD显示缓冲区LCD1-LCD6
			MOVLW	D_MonthH		;修改日期的月十位
			MOVWF	R_DispBuff3		;->R_DispBuff3
			MOVLW	D_MonthL		;修改日期的月个位
			MOVWF	R_DispBuff2		;->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:							;关机处理
            BTFSS   R_WorkStatus,0
            GOTO    L_OFF_Start     ;[R_WorkStatus].0=0 转 关机开始
            BCF     R_WorkStatus,0  ;0->R_WorkStatus.0
			MOVLW	20H
			MOVWF	R_PubCnt1		;20H->R_PubCnt1,定时2秒
			MOVLW	0C0H
			MOVWF	R_WorkStatus	;0C0H->R_WorkStatus,显示修改日期2秒后关机。
            GOTO    L_DispDate      ;去显示修改日期
;
L_OFF_Start:
			CLRF	INTE			;关所有中断
			BCF     NETE,ENVS       ;0->NETE.ENVS 关VS输出
			BCF     PT2,2           ;0->PT2.2 关传感器电源
			CALL	S_ClrDisp		;清LCD显示缓冲区LCD1-LCD6
			BCF		LCDENR,LCDEN	;关LCD输出
L_OFF_Wait:
			MOVLW	00H
			MOVWF	PT2				;00H->PT2
			MOVLW	00H
			MOVWF	PT1				;00H->PT1
			NOP
			GOTO	L_OFF_Wait
			RETURN
;------------------------------------------------------------------------------
;子程序 S_CalcRelWeight ;计算[R_PubReg5:R_PubReg4]中的内码相对于标定零点的重量->R_PubReg3:R_PubReg2,[R_PubFlag1].3=1为负数
;Input:     R_PubReg5:R_PubReg4
;           R_CaliCode0H:R_CaliCode0L
;           R_CaliCode1H:R_CaliCode1L
;           R_CaliCode2H:R_CaliCode2L
;           R_CaliData1H:R_CaliData1L
;           R_CaliData2H:R_CaliData2L
;           R_CaliData3H:R_CaliData3L
;Output:    R_PubReg3:R_PubReg0
;Use RAM:   WORK,FSR0,IND0,R_Count,R_Temp
S_CalcRelWeight:
            MOVLW   R_CaliCode0L
            MOVWF   R_Temp      ;R_CaliCode0L(零点标定内码首地址)->R_Temp
            MOVLW   2
            MOVWF   R_Count     ;2->R_Count 循环计数用
            MOVLW   R_CaliCode1L
            MOVWF   FSR0        ;R_CaliCode1L(40KG标定内码首地址)->FSR0
L_CalcRelW_L1:
            MOVFW   R_PubReg4
            SUBWF   IND0,0
            INCF    FSR0,1      ;[FSR0]+1->FSR0
            MOVFW   R_PubReg5
            SUBWFC  IND0,0
            BTFSC   STATUS,C
            GOTO    L_CalcRelW_1  ;[R_PubReg5:R_PubReg4]≤当前标定内码,转
            MOVLW   2
            ADDWF   R_Temp,1    ;[R_Temp]+2->R_Temp
            INCF    FSR0,1      ;[FSR0]+1->FSR0
            DECFSZ  R_Count,1
            GOTO    L_CalcRelW_L1
L_CalcRelW_1:
            MOVFW   R_Temp
            MOVWF   FSR0
            MOVFW   IND0
            MOVWF   R_PubReg0
            INCF    FSR0,1      ;[FSR0]+1->FSR0
            MOVFW   IND0
            MOVWF   R_PubReg1
			CALL	S_CalcABS	;计算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]绝对值->R_PubReg5:R_PubReg4
            MOVLW   6
            ADDWF   R_Temp,0
            MOVWF   FSR0        ;[R_Temp]+6->FSR0
            MOVFW   IND0
            MOVWF   R_PubReg2   ;标定数据低字节->R_PubReg2
            INCF    FSR0,1      ;[FSR0]+1->FSR0
            MOVFW   IND0
            MOVWF   R_PubReg3   ;标定数据高字节->R_PubReg3
            CALL    S_Multi		;[R_PubReg3:R_PubReg2]×[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg0
            MOVLW   R_CaliCode0L
            SUBWF   R_Temp,1    ;[R_Temp]-R_CaliCode0L->R_Temp
            BTFSC   STATUS,Z
            GOTO    L_CalcRelW_Ret  ;[R_Temp]=0 转 返回
            RRF     R_Temp,0
            MOVWF   R_Count         ;[R_Temp]右移1位->R_Count
            BCF     R_Count,7       ;0->R_Count.7
L_CalcRelW_L2:
            MOVLW   90H         ;\
            ADDWF   R_PubReg2,1 ; | [R_PubReg3:R_PubReg2]+0190H->R_PubReg3:R_PubReg2
            MOVLW   01H         ; | 0190H=400d
            ADDWFC  R_PubReg3,1 ;/
            DECFSZ  R_Count,1
            GOTO    L_CalcRelW_L2
L_CalcRelW_Ret:
            RETURN
;------------------------------------------------------------------------------
;子程序S_CalcOffTime	;计算自动关机时间(单位:秒)->R_OffTimerH:R_OffTimerL
;Input:     R_WorkStatus
;Output:    R_OffTimerH:R_OffTimerL
;Use RAM:   WORK
S_CalcOffTime:
            CLRF    R_OffTimerH,7   ;0->R_OffTimerH
            MOVFW   R_WorkStatus
            ANDLW   70H
            BTFSC   STATUS,Z
            GOTO    L_CalcOffTime1  ;[R_WorkStatus].6:4=0(找零点期间) 转
            SUBLW   30H
            BTFSS   STATUS,Z
            GOTO    L_CalcOffTime2  ;[R_WorkStatus].6:4≠3(不在标定期间) 转
L_CalcOffTime1:
            BSF     R_OffTimerH,0   ;找零点和标定期间 1->R_OffTimerH.0
            GOTO    L_CalcOffTimeRet
L_CalcOffTime2:
            MOVLW   0AH          ;10秒
            MOVWF   R_OffTimerL
L_CalcOffTimeRet:
			RETURN
;------------------------------------------------------------------------------
;子程序S_DecOffTime ;自动关机时间(单位:秒)-1->R_OffTimerH:R_OffTimerL,若已减到0则准备关机
;Input:     R_OffTimerH:R_OffTimerL
;Output:    R_OffTimerH:R_OffTimerL
;           R_WorkStatus
;Use RAM:   WORK
S_DecOffTime:
            BTFSC   R_OffTimerH,7
            GOTO    L_DecOffTimeRet ;[R_OffTimerH].7=1(不自动关机) 转
            MOVFW   R_OffTimerH
            IORWF   R_OffTimerL,0
            BTFSC   STATUS,Z
            GOTO    L_DecOffTimeOver ;[R_OffTimerH:R_OffTimerL]=0 转,准备关机
            MOVLW   1               ;\
            SUBWF   R_OffTimerL,1   ; | [R_OffTimerH:R_OffTimerL]-1
            MOVLW   0               ; | ->R_OffTimerH:R_OffTimerL
            SUBWFC  R_OffTimerH,1   ;/
            GOTO    L_DecOffTimeRet
L_DecOffTimeOver:
            MOVLW   40H
            MOVWF   R_WorkStatus    ;40H->R_WorkStatus 准备关机
L_DecOffTimeRet:
			RETURN
;------------------------------------------------------------------------------
;子程序S_RR4Work		;[WORK]右移4位->WORK,0->WORK.7:4
S_RR4Work:	RRF		WORK,0
			RRF		WORK,0
			RRF		WORK,0
			RRF		WORK,0
			ANDLW	0FH
			RETURN
;------------------------------------------------------------------------------
;子程序S_ReadKey		;读按键,并作简单判断处理
;Output:	R_KeyStatus,R_KeyCode
;Call:		S_RdKeyCode
;Use RAM:	WORK,R_PubCnt2,R_PubCnt3
S_ReadKey:	MOVFW	PT2
			XORLW	03H
			ANDLW	03H
			MOVWF	R_PubCnt2		;PT.2:0取反->R_PubCnt2.2:0,R_PubCnt2:7:3=00000B
			BTFSS	STATUS,Z
			GOTO	L_ReadKey2		;[R_PubCnt2]≠0(有键按下) 转
			BCF		R_PubFlag1,0	;0->R_PubFlag1.0
			MOVFW	R_KeyStatus
			ANDLW	0F0H
			BTFSS	STATUS,Z
			GOTO	L_ReadKey1		;[R_KeyStatus].7:4≠0 转
			BSF		R_KeyCode,3		;1->R_KeyCode.3 (按键释放)
			BSF		R_KeyStatus,7	;1->R_KeyStatus.7
			BSF		R_KeyStatus,4	;1->R_KeyStatus.4
			GOTO	L_ReadKeyRet
L_ReadKey1:	
			MOVLW	1FH
			ANDWF	R_KeyStatus,1	;0->R_KeyStatus.7:5
			BSF		R_KeyStatus,4	;1->R_KeyStatus.4
			GOTO	L_ReadKeyRet
L_ReadKey2:
			MOVFW	R_KeyStatus
			ANDLW	0F0H
			XORLW	70H
			BTFSC	STATUS,Z
			GOTO	L_ReadKeyRet	;[R_KeyStatus].7:4=7 转
			DECF	R_PubCnt2,0
			CALL	S_RdKeyCode		;读键码
			MOVWF	R_PubCnt3		;键码->R_PubCnt3
			BTFSC	R_KeyStatus,4
			GOTO	L_ReadKey3		;[R_KeyStatus].4=1 转
			MOVFW	R_KeyStatus
			ANDLW	0FH
			XORWF	R_PubCnt2,0
			BTFSC	STATUS,Z
			GOTO	L_ReadKey4		;[R_PubCnt2]=[R_KeyStatus].3:0 (按键状态未变) 转
L_ReadKey3:
			MOVLW	0F0H
			ANDWF	R_KeyStatus,0
			IORWF	R_PubCnt2,0
			MOVWF	R_KeyStatus		;[R_PubCnt2]->[R_KeyStatus].3:0 保存按键状态
			MOVFW	R_PubCnt3
			MOVWF	R_KeyCode		;[R_PubCnt3]->R_KeyCode 保存键码
			MOVFW	R_KeyStatus
			ANDLW	0F0H
			XORLW	30H
			BTFSS	STATUS,Z
			BSF		R_KeyStatus,7	;[R_KeyStatus].7:4≠3,1->R_KeyStatus.7
			BCF		R_KeyStatus,4	;0->R_KeyStatus.4
			BCF		R_KeyStatus,6	;0->R_KeyStatus.6
			MOVLW	10H				;10H=2秒
			ADDWF	R_TimerCnt,0
			MOVWF	R_KeyTimer1		;[R_TimerCnt]+10H(2秒)->R_KeyTimer1
			MOVLW	28H				;28H=5秒
			ADDWF	R_TimerCnt,0
			MOVWF	R_KeyTimer2		;[R_TimerCnt]+28H(5秒)->R_KeyTimer2
			MOVLW	05H
			SUBWF	R_KeyCode,0
			BTFSS	STATUS,Z
			GOTO	L_ReadKey4		;[R_KeyCode]≠05H(不是"UNIT"键按下) 转
			MOVLW	50H				;50H=10秒,按住"UNIT"键进入快速标定的时间为10秒
			ADDWF	R_TimerCnt,0
			MOVWF	R_KeyTimer2		;[R_TimerCnt]+50H(10秒)->R_KeyTimer2
L_ReadKey4:
			MOVFW	R_TimerCnt
			SUBWF	R_KeyTimer1,0
			BTFSS	STATUS,Z
			GOTO	L_ReadKey5		;[R_KeyTimer1]≠[R_TimerCnt] 转

⌨️ 快捷键说明

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