📄 9821h621.asm
字号:
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 + -