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