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