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