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