?? 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 40FC MOVLW 11111100b
0232 002A 2225 MOVWF PT2EN ;PT2.7-PT2.2 is output,PT2.1-PT2.0 is input
0233 002B 400B MOVLW 00001011b
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 ; MOVLW 00011010B ;00011010B
0246 ; MOVWF NETE ;ENVS,LB輸入選AIN4,ENLB
0247 0034 400A MOVLW 00001010B ;00011010B
0248 0035 221C MOVWF NETE ;ENVS=0,LB輸入選AIN4,ENLB
0249 0036 4063 MOVLW 01100011B
0250 0037 221D MOVWF NETF ;ENBAND=1,ENVDDA=1,ENAGND=1,ENVB=1
0251 0038 4041 MOVLW 01000001b
0252 0039 2215 MOVWF PCK ;ENPUMP=1,S_CH1CK[1:0]=00,S_BEEP=0,S_PCK=1
0253 003A 854E CALL S_Delay
0254 ;
0255 ; MOVLW 11000100B
0256 ; MOVWF NETA ;INL=TEMPL,FTIN=OP1O,FTB=FTIN,INH=FTB
0257 ; MOVLW 00001110B
0258 ; MOVWF NETB ;OP1N=OP1O,VRL=VR2P,VRH=VR1P
0259 ; MOVLW 00001110B
0260 ; MOVWF NETD ;OP1EN=1,OP1P=TEMPH
0261 ;
0262 003B 4044 MOVLW 01000100B
0263 003C 2218 MOVWF NETA ;INL=AIN2,FTIN=OP1O,FTB=FTIN,INH=FTB
0264 003D 4024 MOVLW 00100100B
0265 003E 2219 MOVWF NETB ;OP1N=AIN5,VRL=AIN1,VRH=AIN0
0266 003F 400B MOVLW 00001011B
0267 0040 221B MOVWF NETD ;OP1EN=1,OP1P=AIN3
0268 ;
0269 0041 4086 MOVLW 10000110B ;10000110B
0270 0042 221A MOVWF NETC ;SREFO=1,ADG=1,ADEN=1,AZ=0
0271 0043 400C MOVLW 00001100b ;00001111b ;ADM=110bADCF/8000
0272 0044 2213 MOVWF ADCON ;ADRST=1,ADM=100b=ADCF/2000
0273 ;
0274 0045 8484 CALL S_ClrDisp ;清LCD顯示緩沖區LCD1-LCD6
0275 0046 4027 MOVLW 00100111b ;00101111b 1/2bias,1/4duty
0276 0047 2254 MOVWF LCDENR ;start LCD clock,1/3bias,1/4duty
0277 0048 408B MOVLW 10001011B
0278 0049 220F MOVWF TMCON ;1/16秒中斷
0279 ;
0280
0281 004A FE20 BTFSS PT1,7
0282 004B DA86 BSF R_PubFlag1,5 ;PT1.7=0(lb),1->R_PubFlag1.5
0283 ;
0284 004C 4008 MOVLW 08H
0285 004D 22CA MOVWF R_DispBuff0 ;8->R_DispBuff0
0286 004E 22CB MOVWF R_DispBuff1 ;8->R_DispBuff1
0287 004F 22CC MOVWF R_DispBuff2 ;8->R_DispBuff2
0288 0050 22CD MOVWF R_DispBuff3 ;8->R_DispBuff3
0289 0051 4004 MOVLW 04H
0290 0052 22C9 MOVWF R_DispMode ;04H->R_DispMode(顯示計量單位)
0291 0053 84A0 CALL S_Display ;顯示“8888”
0292 ;
0293 L_InitCaliData:
0294 0054 85B3 CALL S_RdCaliData ;讀93LC46中00H-07H的標定數據送至RAM R_CaliPara-R_CaliChksumH
0295 0055 85F6 CALL S_CalcChksum ;計算標定數據之和->R_PubReg3:R_PubReg2
0296 0056 2089 MOVFW R_PubReg2
0297 0057 2C8A IORWF R_PubReg3,0
0298 0058 F004 BTFSS STATUS,Z
0299 0059 A06D GOTO L_InitCaliErr ;[R_PubReg3:R_PubReg2]≠0 (93LC46中00H-07H的值錯誤) 轉
0300 005A 40A5 MOVLW D_CaliMark
0301 005B 18DD SUBWF R_CaliFlag,0
0302 005C F004 BTFSS STATUS,Z
0303 005D A06D GOTO L_InitCaliErr ;[R_CaliFlag]≠D_CaliMark (未標定內碼) 轉
0304 L_InitScaleMark:
0305 005E 4006 MOVLW D_P20 ;最大分度數參數:0-9
0306 005F 8479 CALL S_RdScaleMark ;讀分度數->WORK
0307 0060 2289 MOVWF R_PubReg2 ;[WORK]->R_PubReg2
0308 0061 028A CLRF R_PubReg3 ;0->R_PubReg3
0309 0062 4014 MOVLW 20
0310 0063 228B MOVWF R_PubReg4 ;100->R_PubReg4
0311 0064 028C CLRF R_PubReg5 ;0->R_PubReg5
0312 0065 84EC CALL S_Multi ;[R_PubReg3:R_PubReg2]×[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg0
0313 0066 4009 MOVLW 9
0314 0067 0487 ADDWF R_PubReg0,0
0315 0068 22E6 MOVWF R_MaxScaleMarkL ;計算出的最大分度數(+9)低字節->R_MaxScaleMarkL
0316 0069 4000 MOVLW 0
0317 006A 2488 ADDWFC R_PubReg1,0
0318 006B 22E7 MOVWF R_MaxScaleMarkH ;計算出的最大分度數(+9)高字節->R_MaxScaleMarkH
0319 006C A072 GOTO L_InitOther
0320 L_InitCaliErr:
0321 006D 40A0 MOVLW 0A0H
0322 006E 228E MOVWF R_PubCnt1 ;0A0H->R_PubCnt1,定時10秒
0323 ; MOVLW 30H
0324 ; MOVWF R_WorkStatus ;30H->R_WorkStatus,臨時修改,用于顯示內碼
0325 006F 40C0 MOVLW 0C0H
0326 0070 2282 MOVWF R_WorkStatus ;0C0H->R_WorkStatus,10秒后關機。
0327 0071 8493 CALL S_Disp9346 ;LCD顯示" 9346"
0328 L_InitOther:
0329 0072 8403 CALL S_CalcUnitData ;計算1d對應的KG/LB的值(浮點數),
0330 ; 結果->R_UnitData2(2的指數)、R_UnitData1:R_UnitData0(有效數字)
0331 0073 841F CALL S_CalcLockCode ;計算鎖定判斷的內碼值->R_OffsetCode
0332 0074 8358 CALL S_CalcOffTime ;計算自動關機時間(單位:秒)->R_OffTimerH:R_OffTimerL
0333 0075 0206 CLRF INTF
0334 0076 4094 MOVLW 10010100B
0335 0077 2207 MOVWF INTE ;GIE=1,TMIE=1,ADIE=1
0336 L_InitEnd:
0337 ;
0338 L_MainLoop: ;主循環
0339 0078 FE86 BTFSS R_PubFlag1,7
0340 0079 A096 GOTO L_MainAdcProc ;[R_PubFlag1].7=0(未到1/16秒),轉
0341 007A CE86 BCF R_PubFlag1,7 ;0->R_PubFlag1.7
0342 007B D085 BSF R_PubFlag0,0 ;1/16秒到
0343 007C 8379 CALL S_ReadKey ;讀按鍵,并作簡單判斷處理
0344 007D 4004 MOVLW 04H
0345 007E 3285 XORWF R_PubFlag0,1 ;R_PubFlag0.2取反
0346 007F E485 BTFSC R_PubFlag0,2
0347 0080 A096 GOTO L_MainAdcProc ;[R_PubFlag0.2]=1 (未到1/8秒) 轉
0348 0081 0A91 INCF R_TimerCnt,1 ;[R_TimerCnt]+1->R_TimerCnt
0349 ;
0350 0082 CECF BCF R_DispFlag,7 ;0->R_DispFlag.7(電池符號)
0351 0083 F01F BTFSS SVD,LBOUT
0352 0084 A088 GOTO L_Main_BattLow ;LBOUT=0(電池低電壓) 轉
0353 0085 CE40 BCF LCD1,7 ;電池電壓正常,0->LCD1.7 不顯示電池符號
0354 0086 02AA CLRF R_BattLowCnt ;電池電壓正常,0->R_BattLowCnt
0355 0087 A08C GOTO L_Main_1
0356 L_Main_BattLow:
0357 0088 DECF BSF R_DispFlag,7 ;LBOUT=0(電池低電壓),1->R_DispFlag.7 顯示電池符號
0358 0089 DE40 BSF LCD1,7 ;電池低電壓,1->LCD1.7 顯示電池符號
0359 008A 0AAA INCF R_BattLowCnt,1 ;電池電壓低,[R_BattLowCnt]+1->R_BattLowCnt
0360 008B CEAA BCF R_BattLowCnt,7 ;0->R_BattLowCnt.7
0361 ;
0362 L_Main_1:
0363 008C 4003 MOVLW 03H
0364 008D 2891 ANDWF R_TimerCnt,0
0365 008E F004 BTFSS STATUS,Z
0366 008F A096 GOTO L_MainAdcProc ;[R_TimerCnt]&03H≠0(未到1/2秒) 轉
0367 0090 D285 BSF R_PubFlag0,1 ;1->R_PubFlag0.1
0368 0091 4007 MOVLW 07H
0369 0092 2891 ANDWF R_TimerCnt,0
0370 0093 F004 BTFSS STATUS,Z
0371 0094 A096 GOTO L_MainAdcProc ;[R_TimerCnt]&07H≠0(未到1秒) 轉
0372 0095 8365 CALL S_DecOffTime ;自動關機時間(單位:秒)-1->R_OffTimerH:R_OffTimerL,若已減到0則準備關機
0373 ;
0374 L_MainAdcProc:
0375 0096 F685 BTFSS R_PubFlag0,3
0376 0097 A12E GOTO L_Main_5 ;未讀到ADC內碼,轉
0377 0098 C685 BCF R_PubFlag0,3 ;0->R_PubFlag0.3
0378 0099 20ED MOVFW R_AdcDataL ;\
0379 009A 0696 ADDWF R_AdcSumL,1 ; \
0380 009B 20EE MOVFW R_AdcDataH ; | [R_AdcSumH:R_AdcSumL]+[R_AdcDataH:R_AdcDataL]
0381 009C 2697 ADDWFC R_AdcSumM,1 ; | ->R_AdcSumH:R_AdcSumL
0382 009D 4000 MOVLW 0 ; /
0383 009E 2698 ADDWFC R_AdcSumH,1 ;/
0384 009F 0A99 INCF R_AdcDataCnt,1 ;[R_AdcDataCnt]+1->R_AdcDataCnt
0385 ;
0386 00A0 F699 BTFSS R_AdcDataCnt,3
0387 00A1 A12E GOTO L_Main_5 ;[R_AdcDataCnt]<8 轉
0388 ;
0389 00A2 2096 MOVFW R_AdcSumL ;\
0390 00A3 2287 MOVWF R_PubReg0 ; \
0391 00A4 2097 MOVFW R_AdcSumM ; |
0392 00A5 2288 MOVWF R_PubReg1 ; | [R_AdcSumH:R_AdcSumL]->R_PubReg3:R_PubReg0
0393 00A6 2098 MOVFW R_AdcSumH ; |
0394 00A7 2289 MOVWF R_PubReg2 ; /
0395 00A8 028A CLRF R_PubReg3 ;/
0396 00A9 0296 CLRF R_AdcSumL ;0->R_AdcSumL
0397 00AA 0297 CLRF R_AdcSumM ;0->R_AdcSumM
0398 00AB 0298 CLRF R_AdcSumH ;0->R_AdcSumH
0399 00AC 0299 CLRF R_AdcDataCnt ;0->R_AdcDataCnt
0400 ;
0401 00AD 4004 MOVLW 4 ;\
0402 00AE 228B MOVWF R_PubReg4 ; | 4->R_PubReg5:R_PubReg4
0403 00AF 028C CLRF R_PubReg5 ;/
0404 ;
0405 00B0 8504 CALL S_DivisM ;[R_PubReg3:R_PubReg0]÷[R_PubReg5:R_PubReg4]->R_PubReg1:R_PubReg0
0406 00B1 D885 BSF R_PubFlag0,4 ;1->R_PubFlag0.4 (有效內碼)
0407 00B2 0AEF INCF R_CodePointer,1 ;內碼存儲指針+1
0408 00B3 C6EF BCF R_CodePointer,3 ;0->R_CodePointer.3
0409 00B4 10EF DECF R_CodePointer,0 ;\
0410 00B5 6807 ANDLW 07H ; \
0411 00B6 C204 BCF STATUS,C ; |
0412 00B7 3405 RLF WORK,0 ; |
0413 00B8 44F0 ADDLW R_CodeBuffer ; |
0414 00B9 2202 MOVWF FSR0 ; | 新的有效內碼[R_PubReg1:R_PubReg0]
0415 00BA 2087 MOVFW R_PubReg0 ; | ->內碼緩沖區保存
0416 00BB 2200 MOVWF IND0 ; |
0417 00BC 0A02 INCF FSR0,1 ; |
0418 00BD 2088 MOVFW R_PubReg1 ; /
0419 00BE 2200 MOVWF IND0 ;/
0420 ;
0421 00BF 209A MOVFW R_LastAverageL ;\
0422 00C0 228B MOVWF R_PubReg4 ; | [R_LastAverageH:R_LastAverageL]
0423 00C1 209B MOVFW R_LastAverageH ; | ->R_PubReg5:R_PubReg4
0424 00C2 228C MOVWF R_PubReg5 ;/
0425 00C3 83F4 CALL S_CalcABS ;計算[R_PubReg5:R_PubReg4]-[R_PubReg1:R_PubReg0]絕對值->R_PubReg5:R_PubReg4
0426 L_MainAdcP_1:
0427 00C4 4014 MOVLW 20
0428 00C5 188B SUBWF R_PubReg4,0
0429 00C6 4000 MOVLW 0
0430 00C7 388C SUBWFC R_PubReg5,0
0431 ;
0432 ; MOVFW R_10dCodeL
0433 ; SUBWF R_PubReg4,0
0434 ; MOVFW R_10dCodeH
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -