9821h620.lst

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

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

⌨️ 快捷键说明

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