9821h620.lst

来自「用台湾富晶单片机开发的电子称包括源码和编译器」· LST 代码 · 共 1,108 行 · 第 1/5 页

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

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?