📄 9821h620.lst
字号:
0224 L_InitClrR_Loop: ; | RAM [0FFH:80H]清零
0225 002F 0200 CLRF IND0 ; |
0226 0030 0E02 INCFSZ FSR0,1 ; /
0227 0031 A02F GOTO L_InitClrR_Loop ;/
0228 L_InitSFR:
0229 0032 401A MOVLW 00011010B ;00011010B
0230 0033 221C MOVWF NETE ;ENVS,LB输入选AIN4,ENLB
0231 0034 4063 MOVLW 01100011B
0232 0035 221D MOVWF NETF ;ENBAND,ENVDDA,ENAGND,ENVB
0233 0036 4041 MOVLW 01000001b
0234 0037 2215 MOVWF PCK ;ENPUMP=1,S_CH1CK[1:0]=00,S_BEEP=0,S_PCK=1
0235 0038 8576 CALL S_Delay
0236 ;
0237 ; MOVLW 11000100B
0238 ; MOVWF NETA ;INL=TEMPL,FTIN=OP1O,FTB=FTIN,INH=FTB
0239 ; MOVLW 00001110B
0240 ; MOVWF NETB ;OP1N=OP1O,VRL=VR2P,VRH=VR1P
0241 ; MOVLW 00001110B
0242 ; MOVWF NETD ;OP1EN=1,OP1P=TEMPH
0243 ;
0244 0039 4044 MOVLW 01000100B
0245 003A 2218 MOVWF NETA ;INL=AIN2,FTIN=OP1O,FTB=FTIN,INH=FTB
0246 003B 4024 MOVLW 00100100B
0247 003C 2219 MOVWF NETB ;OP1N=AIN5,VRL=AIN1,VRH=AIN0
0248 003D 400B MOVLW 00001011B
0249 003E 221B MOVWF NETD ;OP1EN=1,OP1P=AIN3
0250 ;
0251 003F 4086 MOVLW 10000110B ;10000110B
0252 0040 221A MOVWF NETC ;SREFO=1,ADG=1,ADEN=1,AZ=0
0253 0041 400C MOVLW 00001100b ;00001111b ;ADM=110bADCF/8000
0254 0042 2213 MOVWF ADCON ;ADRST=1,ADM=100b=ADCF/2000
0255 ;
0256 0043 84A4 CALL S_ClrDisp ;清LCD显示缓冲区LCD1-LCD6
0257 0044 402F MOVLW 00101111b ;00100111b
0258 0045 2254 MOVWF LCDENR ;start LCD clock,1/2bias,1/4duty
0259 0046 408B MOVLW 10001011B
0260 0047 220F MOVWF TMCON ;1/16秒中断
0261 L_InitCaliData:
0262 0048 85DB CALL S_RdCaliData ;读93LC46中00H-0AH的标定数据送至RAM R_CaliMarkL-R_CaliChksumH
0263 0049 861E CALL S_CalcChksum ;计算标定数据之和->R_PubReg3:R_PubReg2
0264 004A 2089 MOVFW R_PubReg2
0265 004B 2C8A IORWF R_PubReg3,0
0266 004C F004 BTFSS STATUS,Z
0267 004D A066 GOTO L_InitCaliErr ;[R_PubReg3:R_PubReg2]≠0 (93LC46中00H-0AH的值错误) 转
0268 004E 405A MOVLW D_CaliMark1
0269 004F 18D8 SUBWF R_CaliParaFlag,0
0270 0050 F004 BTFSS STATUS,Z
0271 0051 A066 GOTO L_InitCaliErr ;[R_CaliParaFlag]≠D_CaliMark1 (未标定参数) 转
0272 0052 40A5 MOVLW D_CaliMark2
0273 0053 18D9 SUBWF R_CaliCodeFlag,0
0274 0054 F004 BTFSS STATUS,Z
0275 0055 A066 GOTO L_InitCaliErr ;[R_CaliCodeFlag]≠D_CaliMark2 (未标定内码) 转
0276 L_InitScaleMark:
0277 0056 20D3 MOVFW R_CaliP1H ;标定参数,D7:D4=P1.3,D3:D0=P1.2
0278 0057 833A CALL S_RR4Work ;[WORK]右移4位->WORK,0->WORK.7:4
0279 0058 8499 CALL S_RdScaleMark ;读分度数->WORK
0280 0059 2289 MOVWF R_PubReg2 ;[WORK]->R_PubReg2
0281 005A 028A CLRF R_PubReg3 ;0->R_PubReg3
0282 005B 4064 MOVLW 100
0283 005C 228B MOVWF R_PubReg4 ;100->R_PubReg4
0284 005D 028C CLRF R_PubReg5 ;0->R_PubReg5
0285 005E 8514 CALL S_Multi ;[R_PubReg3:R_PubReg2]×[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg0
0286 005F 4009 MOVLW 9
0287 0060 0487 ADDWF R_PubReg0,0
0288 0061 22E6 MOVWF R_MaxScaleMarkL ;计算出的最大分度数(+9)低字节->R_MaxScaleMarkL
0289 0062 4000 MOVLW 0
0290 0063 2488 ADDWFC R_PubReg1,0
0291 0064 22E7 MOVWF R_MaxScaleMarkH ;计算出的最大分度数(+9)高字节->R_MaxScaleMarkH
0292 0065 A076 GOTO L_InitOther
0293 L_InitCaliErr:
0294 0066 02D0 CLRF R_CaliMarkL ;\
0295 0067 4001 MOVLW 01H ; | 0100H->R_CaliMarkH:R_CaliMarkL
0296 0068 22D1 MOVWF R_CaliMarkH ;/
0297 0069 400F MOVLW 0FH
0298 006A 22D2 MOVWF R_CaliP1L ;0FH(缺省值)->R_CaliP1L
0299 006B 4031 MOVLW 31H
0300 006C 22D3 MOVWF R_CaliP1H ;31H(缺省值)->R_CaliP1H
0301 006D 4052 MOVLW 52H
0302 006E 22D4 MOVWF R_CaliP2L ;52H(缺省值)->R_CaliP2L
0303 006F 4022 MOVLW 22H
0304 0070 22D5 MOVWF R_CaliP2H ;22H(缺省值)->R_CaliP2H
0305 0071 40A0 MOVLW 0A0H
0306 0072 228E MOVWF R_PubCnt1 ;0A0H->R_PubCnt1,定时10秒
0307 ; MOVLW 30H
0308 ; MOVWF R_WorkStatus ;30H->R_WorkStatus,临时修改,用于显示内码
0309 0073 40C0 MOVLW 0C0H
0310 0074 2282 MOVWF R_WorkStatus ;0C0H->R_WorkStatus,10秒后关机。
0311 0075 84B3 CALL S_Disp9346 ;LCD显示" 9346"
0312 L_InitOther:
0313 0076 83CA CALL S_CalcUnitData ;计算1d对应的不同计量单位的值(浮点数),
0314 ; 结果->R_UnitData2(2的指数)、R_UnitData1:R_UnitData0(有效数字)
0315 0077 8451 CALL S_CalcLockCode ;计算锁定判断的内码值->R_OffsetCode
0316 ; CALL S_CalcDelay ;计算自动关机时间(单位:秒)->3DH:3CH
0317 0078 0206 CLRF INTF
0318 0079 4094 MOVLW 10010100B
0319 007A 2207 MOVWF INTE ;GIE=1,TMIE=1,ADIE=1
0320 L_InitEnd:
0321 ;
0322 L_MainLoop: ;主循环
0323 007B FE86 BTFSS R_PubFlag1,7
0324 007C A09B GOTO L_MainAdcProc ;[R_PubFlag1].7=0(未到1/16秒),转
0325 007D CE86 BCF R_PubFlag1,7 ;0->R_PubFlag1.7
0326 007E D085 BSF R_PubFlag0,0 ;1/16秒到
0327 007F 8340 CALL S_ReadKey ;读按键,并作简单判断处理
0328 0080 4004 MOVLW 04H
0329 0081 3285 XORWF R_PubFlag0,1 ;R_PubFlag0.2取反
0330 0082 E485 BTFSC R_PubFlag0,2
0331 0083 A09B GOTO L_MainAdcProc ;[R_PubFlag0.2]=1 (未到1/8秒) 转
0332 0084 0A91 INCF R_TimerCnt,1 ;[R_TimerCnt]+1->R_TimerCnt
0333 ;
0334 0085 C0CF BCF R_DispFlag,0 ;0->R_DispFlag.0(电池符号)
0335 0086 F01F BTFSS SVD,LBOUT
0336 0087 D0CF BSF R_DispFlag,0 ;LBOUT=0(电池低电压),1->R_DispFlag.0 显示电池符号
0337 ;
0338 0088 2082 MOVFW R_WorkStatus
0339 0089 68F0 ANDLW 0F0H
0340 008A 5810 SUBLW 10H
0341 008B F004 BTFSS STATUS,Z
0342 008C A092 GOTO L_Main_1 ;[R_WorkStatus].7:4≠1(不是称重状态) 转
0343 008D FA85 BTFSS R_PubFlag0,5
0344 008E 02A5 CLRF R_SteadyTimer ;[R_PubFlag0].5=0(称重不稳定),0->R_SteadyTimer
0345 008F 0AA5 INCF R_SteadyTimer,1 ;[R_SteadyTimer]+1->R_SteadyTimer
0346 0090 E004 BTFSC STATUS,Z
0347 0091 12A5 DECF R_SteadyTimer,1 ;[R_SteadyTimer]=0,[R_SteadyTimer]-1->R_SteadyTimer
0348 L_Main_1:
0349 0092 4003 MOVLW 03H
0350 0093 2891 ANDWF R_TimerCnt,0
0351 0094 F004 BTFSS STATUS,Z
0352 0095 A09B GOTO L_MainAdcProc ;[R_TimerCnt]&03H≠0(未到1/2秒) 转
0353 0096 D285 BSF R_PubFlag0,1 ;1->R_PubFlag0.1
0354 0097 4007 MOVLW 07H
0355 0098 2891 ANDWF R_TimerCnt,0
0356 0099 F004 BTFSS STATUS,Z
0357 009A A09B GOTO L_MainAdcProc ;[R_TimerCnt]&07H≠0(未到1秒) 转
0358 ; CALL S_DecOffTime ;自动关机时间(单位:秒)-1->3DH:3CH,若已减到0则4->46H,0->47H准备关机
0359 ;
0360 L_MainAdcProc:
0361 009B F685 BTFSS R_PubFlag0,3
0362 009C A131 GOTO L_Main_5 ;未读到ADC内码,转
0363 009D C685 BCF R_PubFlag0,3 ;0->R_PubFlag0.3
0364 009E 20ED MOVFW R_AdcDataL ;\
0365 009F 0696 ADDWF R_AdcSumL,1 ; \
0366 00A0 20EE MOVFW R_AdcDataH ; | [R_AdcSumH:R_AdcSumL]+[R_AdcDataH:R_AdcDataL]
0367 00A1 2697 ADDWFC R_AdcSumM,1 ; | ->R_AdcSumH:R_AdcSumL
0368 00A2 4000 MOVLW 0 ; /
0369 00A3 2698 ADDWFC R_AdcSumH,1 ;/
0370 00A4 0A99 INCF R_AdcDataCnt,1 ;[R_AdcDataCnt]+1->R_AdcDataCnt
0371 ;
0372 00A5 F699 BTFSS R_AdcDataCnt,3
0373 00A6 A131 GOTO L_Main_5 ;[R_AdcDataCnt]<8 转
0374 ;
0375 ; BTFSS R_AdcDataCnt,3
0376 ; GOTO L_Main_5 ;[R_AdcDataCnt]<8 转
0377 ;
0378 00A7 2096 MOVFW R_AdcSumL ;\
0379 00A8 2287 MOVWF R_PubReg0 ; \
0380 00A9 2097 MOVFW R_AdcSumM ; |
0381 00AA 2288 MOVWF R_PubReg1 ; | [R_AdcSumH:R_AdcSumL]->R_PubReg3:R_PubReg0
0382 00AB 2098 MOVFW R_AdcSumH ; |
0383 00AC 2289 MOVWF R_PubReg2 ; /
0384 00AD 028A CLRF R_PubReg3 ;/
0385 00AE 0296 CLRF R_AdcSumL ;0->R_AdcSumL
0386 00AF 0297 CLRF R_AdcSumM ;0->R_AdcSumM
0387 00B0 0298 CLRF R_AdcSumH ;0->R_AdcSumH
0388 00B1 0299 CLRF R_AdcDataCnt ;0->R_AdcDataCnt
0389 ;
0390 00B2 4004 MOVLW 4 ;\
0391 00B3 228B MOVWF R_PubReg4 ; | 4->R_PubReg5:R_PubReg4
0392 00B4 028C CLRF R_PubReg5 ;/
0393 ;
0394 ; MOVLW 8 ;\
0395 ; MOVWF R_PubReg4 ; | 08H->R_PubReg5:R_PubReg4
0396 ; CLRF R_PubReg5 ;/
0397 ;
0398 00B5 852C CALL S_DivisM ;[R_PubReg3:R_PubReg0]÷[R_PubReg5:R_PubReg4]->R_PubReg1:R_PubReg0
0399 00B6 D885 BSF R_PubFlag0,4 ;1->R_PubFlag0.4 (有效内码)
0400 00B7 0AEF INCF R_CodePointer,1 ;内码存储指针+1
0401 00B8 C4EF BCF R_CodePointer,2 ;0->R_CodePointer.2
0402 00B9 10EF DECF R_CodePointer,0 ;\
0403 00BA 6803 ANDLW 03H ; \
0404 00BB C204 BCF STATUS,C ; |
0405 00BC 3405 RLF WORK,0 ; |
0406 00BD 44F0 ADDLW R_CodeBuffer ; |
0407 00BE 2202 MOVWF FSR0 ; | 新的有效内码[R_PubReg1:R_PubReg0]
0408 00BF 2087 MOVFW R_PubReg0 ; | ->内码缓冲区保存
0409 00C0 2200 MOVWF IND0 ; |
0410 00C1 0A02 INCF FSR0,1 ; |
0411 00C2 2088 MOVFW R_PubReg1 ; /
0412 00C3 2200 MOVWF IND0 ;/
0413 ;
0414 00C4 209A MOVFW R_LastAverageL ;\
0415 00C5 228B MOVWF R_PubReg4 ; | [R_LastAverageH:R_LastAverageL]
0416 00C6 209B MOVFW R_LastAverageH ; | ->R_PubReg5:R_PubReg4
0417 00C7 228C MOVWF R_PubReg5 ;/
0418 00C8 83BB CALL S_CalcABS ;计算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]绝对值->R_PubReg5:R_PubReg4
0419 L_MainAdcP_1:
0420 00C9 20E4 MOVFW R_10dCodeL
0421 00CA 188B SUBWF R_PubReg4,0
0422 00CB 20E5 MOVFW R_10dCodeH
0423 00CC 388C SUBWFC R_PubReg5,0
0424 00CD E204 BTFSC STATUS,C
0425 00CE A106 GOTO L_MainAdcP_6 ;[R_PubReg5:R_PubReg4]≥[R_10dCodeH:R_10dCodeL] (数据不稳)转
0426 00CF 4004 MOVLW 4
0427 00D0 83A0 CALL S_ReadCode ;计算最近4次的内码的平均值->R_PubReg1:R_PubReg0
0428 00D1 209A MOVFW R_LastAverageL ;\
0429 00D2 1887 SUBWF R_PubReg0,0 ; \
0430 00D3 228B MOVWF R_PubReg4 ; | [R_PubReg1:R_PubReg0]-[R_LastAverageH:R_LastAverageL]
0431 00D4 209B MOVFW R_LastAverageH ; | ->R_PubReg5:R_PubReg4
0432 00D5 3888 SUBWFC R_PubReg1,0 ; /
0433 00D6 228C MOVWF R_PubReg5 ;/
0434 00D7 2087 MOVFW R_PubReg0 ;\
0435 00D8 229A MOVWF R_LastAverageL ; | [R_PubReg1:R_PubReg0]->R_LastAverageH:R_LastAverageL
0436 00D9 2088 MOVFW R_PubReg1 ; |
0437 00DA 229B MOVWF R_LastAverageH ;/
0438 00DB 208B MOVFW R_PubReg4 ;\
0439 00DC 069E ADDWF R_DifferenceL,1 ; | [R_DifferenceH:R_DifferenceL]+[R_PubReg5:R_PubReg4]
0440 00DD 208C MOVFW R_PubReg5 ; | ->R_DifferenceH:R_DifferenceL (累计差值)
0441 00DE 269F ADDWFC R_DifferenceH,1 ;/
0442 00DF 209E MOVFW R_DifferenceL ;\
0443 00E0 228B MOVWF R_PubReg4 ; | [R_DifferenceH:R_DifferenceL]
0444 00E1 209F MOVFW R_DifferenceH ; | ->R_PubReg5:R_PubReg4
0445 00E2 228C MOVWF R_PubReg5 ;/
0446 00E3 FE8C BTFSS R_PubReg5,7
0447 00E4 A0E6 GOTO L_MainAdcP_2 ;[R_PubReg5].7=0(正数) 转
0448 00E5 83C3 CALL S_CalcABS1 ;计算[R_PubReg5:R_PubReg4]的补码->R_PubReg5:R_PubReg4
0449 L_MainAdcP_2:
0450 00E6 4000 MOVLW 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -