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