9821h620.asm
来自「用台湾富晶单片机开发的电子称包括源码和编译器」· 汇编 代码 · 共 1,677 行 · 第 1/5 页
ASM
1,677 行
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_DispFlag,3 ;0->R_DispFlag.3
BTFSC R_PubFlag0,5
BSF R_DispFlag,3 ;[R_PubFlag0].5=1(称重数据稳定),1->R_DispFlag.3 显示锁符
; 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
;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_CaliCodeProc ;[R_PubCnt1].7:4=0 处理重量标定数据
;Input: R_CaliMarkH:R_CaliMarkL
; R_CaliCode0H:R_CaliCode0L
; R_SteadyCodeH:R_SteadyCodeL
;Output: R_CaliDataH:R_CaliDataL
;Call: S_AddSub1,S_Mul2Sub1
; S_CalcABS
; S_Divis
;Use RAM: WORK,R_Count,R_PubCnt0
; R_PubReg1:R_PubReg0,R_PubReg3:R_PubReg2,R_PubReg5:R_PubReg4
S_CaliCodeProc:
MOVFW R_CaliMarkL ;\
MOVWF R_PubReg0 ; | [R_CaliMarkH:R_CaliMarkL]
MOVFW R_CaliMarkH ; | ->R_PubReg1:R_PubReg0
MOVWF R_PubReg1 ;/
S_CaliCodeComm: ;标定时计算每个内码相当于重量的分度数×65536->R_CaliDataH:R_CaliDataL
MOVFW R_PubReg1
ANDLW 0FFH
BTFSC STATUS,Z
GOTO L__CaliCodeP_Ret ;[R_PubReg1]=0(标定分度值<1000) 转,返回
;下面的程序将4位BCD码[R_PubReg1:R_PubReg0]转换为二进制数->R_PubReg3:R_PubReg2
CLRF R_PubReg2 ;0->R_PubReg2
CLRF R_PubReg3 ;0->R_PubReg3
MOVLW 4
MOVWF R_PubCnt0 ;4->R_PubCnt0
L_BCD2HexLoop:
CLRF R_PubReg4 ;0->R_PubReg4
CLRF R_PubReg5 ;0->R_PubReg5
MOVLW 4
MOVWF R_Count ;4->R_Count
L_BCD2HexL_1:
RLF R_PubReg0,1
RLF R_PubReg1,1
RLF R_PubReg4,1
DECFSZ R_Count,1
GOTO L_BCD2HexL_1
;
CALL S_AddSub1 ;[R_PubReg3:R_PubReg2]+[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg2
CALL S_Mul2Sub1 ;[R_PubReg3:R_PubReg2]×2->R_PubReg3:R_PubReg2
MOVFW R_PubReg2 ;\
MOVWF R_PubReg4 ; | [R_PubReg3:R_PubReg2]
MOVFW R_PubReg3 ; | ->R_PubReg5:R_PubReg4
MOVWF R_PubReg5 ;/
CALL S_Mul2Sub1 ;[R_PubReg3:R_PubReg2]×2->R_PubReg3:R_PubReg2
CALL S_Mul2Sub1 ;[R_PubReg3:R_PubReg2]×2->R_PubReg3:R_PubReg2
CALL S_AddSub1 ;[R_PubReg3:R_PubReg2]+[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg2
; 以上17行相当于[R_PubReg3:R_PubReg2]×10
L_BCD2Hex_Next:
DECFSZ R_PubCnt0,1
GOTO L_BCD2HexLoop
;上面的程序将4位BCD码[R_PubReg1:R_PubReg0]转换为二进制数->R_PubReg3:R_PubReg2
MOVFW R_CaliCode0L ;\
MOVWF R_PubReg0 ; | [R_CaliCode0H:R_CaliCode0L]
MOVFW R_CaliCode0H ; | ->R_PubReg1:R_PubReg0
MOVWF R_PubReg1 ;/
MOVFW R_SteadyCodeL ;\
MOVWF R_PubReg4 ; | [R_SteadyCodeH:R_SteadyCodeL]
MOVFW R_SteadyCodeH ; | ->R_PubReg5:R_PubReg4
MOVWF R_PubReg5 ;/
CALL S_CalcABS ;计算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]绝对值->R_PubReg5:R_PubReg4
MOVFW R_PubReg4
SUBWF R_PubReg2,0
MOVFW R_PubReg5
SUBWFC R_PubReg3,0
BTFSC STATUS,C
GOTO L__CaliCodeP_Ret ;[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__CaliCodeP_Ret ;[R_PubReg1]≥80H(每个内码对应的重量≥0.5d) 转,返回
MOVFW R_PubReg0 ;\
MOVWF R_CaliDataL ; | [R_PubReg1:R_PubReg0]
MOVFW R_PubReg1 ; | ->R_CaliDataH:R_CaliDataL
MOVWF R_CaliDataH ;/
MOVLW D_CaliMark2
MOVWF R_CaliCodeFlag ;D_CaliMark2->R_CaliCodeFlag 重量标定成功
L__CaliCodeP_Ret:
RETURN
;子程序S_AddSub1 ;[R_PubReg3:R_PubReg2]+[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg2
S_AddSub1:
MOVFW R_PubReg4 ;\
ADDWF R_PubReg2,1 ; | [R_PubReg3:R_PubReg2]+[R_PubReg5:R_PubReg4]
MOVFW R_PubReg5 ; | ->R_PubReg3:R_PubReg2
ADDWFC R_PubReg3,1 ;/
RETURN
;子程序S_Mul2Sub1 ;[R_PubReg3:R_PubReg2]×2->R_PubReg3:R_PubReg2
S_Mul2Sub1:
BCF STATUS,C ;\
RLF R_PubReg2,1 ; | [R_PubReg3:R_PubReg2]×2->R_PubReg3:R_PubReg2
RLF R_PubReg3,1 ;/
RETURN
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?