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