⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档.asm

📁 这是基于富晶单片机FS9821平台的有关电子秤的开发源程序。其中有AD判稳和温度自动补偿的子程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;Project:  FS9821小台秤 
;FileName: 9821H620.ASM 
;Ver:      H620 
;Body:	   Fortune FS9821 
;Author:   kangguang 
;Modify Date: 2004-11-18 
;============================================================================== 
include FS9821.inc		;FS9821特殊功能寄存器定义(00H-7FH) 
;------------------------------------------------------------------------------ 
;常数定义 
D_DayL		equ 8 
D_DayH		equ 1 
D_MonthL	equ 1 
D_MonthH	equ 1 
; 
D_TraceCnt  	equ 8           ;自动追踪判断参数 
; 
D_CaliMark1	equ	5AH 
D_CaliMark2	equ	0A5H 
D_OverCodeL	equ	24H			;超载内码0F424H=62500d 
D_OverCodeH	equ	0F4H 
; 
;LCD Character table (D7-D0=f、g、e、d、a、b、c、dp) 
;LCD Character table (2004-11-18改为 D7-D0=dp、c、b、a、d、e、g、f) 
Lcdch0      equ     01111101B	; 10111110B	;"0" 
Lcdch1      equ     01100000B	; 00000110B	;"1" 
Lcdch2      equ     00111110B	; 01111100B	;"2" 
Lcdch3      equ     01111010B	; 01011110B	;"3" 
Lcdch4      equ     01100011B	; 11000110B	;"4" 
Lcdch5      equ     01011011B	; 11011010B	;"5" 
Lcdch6      equ     01011111B	; 11111010B	;"6" 
Lcdch7      equ     01110001B	; 10001110B	;"7" 
Lcdch8      equ     01111111B	; 11111110B	;"8" 
Lcdch9      equ     01111011B	; 11011110B	;"9" 
LcdchA      equ     01110111B	; 11101110B	;"A" 
Lcdchb      equ     01001111B	; 11110010B	;"b" 
LcdchC      equ     00011101B	; 10111000B	;"C" 
Lcdchd      equ     01101110B	; 01110110B	;"d" 
LcdchE      equ     00011111B	; 11111000B	;"E" 
LcdchF      equ     00010111B	; 11101000B	;"F" 
LcdNull     equ     00000000B	; 00000000B	;" " 
LcdDash     equ     00000010B	; 01000000B	;"-" 
LcdchL      equ     00001101B	; 10110000B	;"L" 
Lcdcho      equ     01001110B	; 01110010B	;"o" 
Lcdchr      equ     00000110B	; 01100000B	;"r" 
LcdchH      equ     01100111B	; 11100110B	;"H" 
LcdchP      equ     00110111B	; 11101100B	;"P" 
Lcdequ      equ     00001010B	; 01010000B	;"=" 
		;I/O 
		EEPROM	equ		PT2 
		VCC	equ		6 
		CS	equ		5 
		CLK	equ		4 
		DI	equ		3 
		DO	equ		3 
;------------------------------------------------------------------------------ 
;通用RAM定义(80H-0FFH) 
R_STATUSbak		equ		80H 
R_WORKbak		equ		81H 
R_WorkStatus		equ		82H		;D7-D4相当于6613中的46H,D3-D0相当于47H 
R_Temp			equ		83H 
R_Count			equ		84H		;相当于6613中的6DH 
R_PubFlag0		equ		85H 
;			R_PubFlag0.0=1 1/16秒到 
;			R_PubFlag0.1=1 1/2秒到 
;			R_PubFlag0.2=0 1/8秒到 
;			R_PubFlag0.3=1	读到ADC内码 
;			R_PubFlag0.4=1	有效内码 
;			R_PubFlag0.5=1时称重数据稳定,锁定 
;			R_PubFlag0.6=1 零点(内码)稳定 
;			R_PubFlag0.7=1 已经找到稳定零点,零点内码未保存 
R_PubFlag1		equ		86H 
;			R_PubFlag1.0=1 表示"TARE"键按下5秒 
;			R_PubFlag1.1=1 表示当前环境温度<第一环境温度值 
;			R_PubFlag1.2=1 表示当前测得的额定重量值<最大分度数 
;			R_PubFlag1.3=1 减法结果为负数 
;			R_PubFlag1.4=1 超载 
;           		R_PubFlag1.5=1 自动追踪判断时内码差值为负数 
;          		 R_PubFlag1.6=1 显示稳定符号"STABLE" 
;			R_PubFlag1.7=1 Timer中断 
R_PubReg0		equ		87H		;相当于6613中的69H:68H 
R_PubReg1		equ		88H		;相当于6613中的6BH:6AH 
R_PubReg2		equ		89H		;相当于6613中的61H:60H 
R_PubReg3		equ		8AH		;相当于6613中的63H:62H 
R_PubReg4		equ		8BH		;相当于6613中的65H:64H 
R_PubReg5		equ		8CH		;相当于6613中的67H:66H 
R_PubCnt0		equ		8DH		;相当于6613中的6CH 
R_PubCnt1		equ		8EH		;相当于6613中的49H:48H 
R_PubCnt2		equ		8FH		;相当于6613中的5FH:5EH 
R_PubCnt3		equ		90H		;相当于6613中的6FH:6EH 
R_TimerCnt		equ		91H		;计时用(单位:1/8秒),相当于6613中的2BH:2AH 
R_KeyStatus		equ		92H		;按键状态,D0-D2分别对应"OFF"、"UNIT"、"TARE"键,=1时键按下 
;								;R_KeyStatus.4=1 表示按键状态已保存 
;								;R_KeyStatus.5=1 表示按键时间已到2秒 
;								;R_KeyStatus.6=1 表示按键时间已到5秒或20秒 
;								;R_KeyStatus.7==1	表示按键状态稳定 
R_KeyCode		equ		93H		;键码,D2:D0=100/101/110/111分别对应"OFF"/"UNIT"/"TARE"/多键 
;								;D3=1 按键释放,=0按键处于按下状态 
;								;D4=表示按键长时间按下或长时间按下过 
R_KeyTimer1		equ		94H		;按键计时,相当于6613中的41H 
R_KeyTimer2		equ		95H		;按键计时,相当于6613中的45H:44H 
R_AdcSumL		equ		96H		;ADC内码之和低字节(用于平均) 
R_AdcSumM		equ		97H		;ADC内码之和中间字节(用于平均) 
R_AdcSumH		equ		98H		;ADC内码之和高字节(用于平均) 
R_AdcDataCnt		equ		99H		;ADC输出数据计数(计到8次时平均) 
R_LastAverageL		equ		9AH		;最近X次的内码的平均值低字节,X=1-8,相当于6613中的0C1H:0C0H 
R_LastAverageH		equ		9BH		;最近X次的内码的平均值高字节,X=1-8,相当于6613中的0C3H:0C2H 
 
R_SteadyCnt		equ		9DH		;稳定次数,判断锁定用,相当于6613H618中的5DH 
R_DifferenceL		equ		9EH		;锁定判断的累计差值低字节,相当于6613H618中的0F1H:0F0H 
R_DifferenceH		equ		9FH		;锁定判断的累计差值高字节,相当于6613H618中的0F3H:0F2H 
R_ZeroCodeL		equ		0A0H	;零点内码低字节,相当于6613中的0CDH:0CCH 
R_ZeroCodeH		equ		0A1H	;零点内码高字节,相当于6613中的0CFH:0CEH 
R_UnitSelect		equ		0A2H	;计量单位选择:0=g,1=oz,2=kg,3=lb 
R_SteadyCodeL		equ		0A3H	;连续稳定的内码值低字节,相当于6613中的0C5H:0C4H 
R_SteadyCodeH		equ		0A4H	;连续稳定的内码值高字节,相当于6613中的0C7H:0C6H 
R_SteadyTimer		equ		0A5H	;称重稳定计时(单位:1/8秒),相当于6613H609中的71H 
R_OffTimerL     	equ     	0A6H    ;自动关机时间倒计时低字节(单位:秒) 
R_OffTimerH     	equ     	0A7H    ;自动关机时间倒计时高字节(单位:秒),D7=1不自动关机。 
R_TraceCnt      	equ     	0A8H    ;自动追重计数(内码稳定期间处理自动追重时的计数) 
R_BattLowCnt    	equ     	0A9H    ;电池低电压计数 
; 
R_DispMode		equ		0C9H	;显示模式:D1:D0=0-3位小数;D2=0/1不显示计量单位/显示计量单位; 
;						D3=0/1显示为10进制方式/显示为16进制数或提示信息 
R_DispBuff0		equ		0CAH	;对应LCD上5位7段码数据的最低位 
R_DispBuff1		equ		0CBH	;对应LCD上5位7段码数据的十位 
R_DispBuff2		equ		0CCH	;对应LCD上5位7段码数据的百位 
R_DispBuff3		equ		0CDH	;对应LCD上5位7段码数据的千位 
R_DispBuff4		equ		0CEH	;对应LCD上5位7段码数据的最高位 
R_DispFlag		equ		0CFH	;D7-D0分别对应LCD上的oz、g、lb、kg、ZERO、TARE、负号、电池符号 
; 
R_CaliMarkL		equ		0D0H	;称重标定分度数低字节,D7:D4=P0.1(百位),D3:D0=P0.0(十位),个位=0 
R_CaliMarkH		equ		0D1H	;称重标定分度数高字节,D7:D4=P0.3(万位),D3:D0=P0.2(千位) 
R_CaliP1L		equ		0D2H	;标定参数,D7:D4=P1.1,D3:D0=P1.0 
;						P1.0=计量单位标志,D0-D3分别对应kg、lb、g、oz,=1是打开单位,缺省值为"F" 
;						P1.1=主单位小数点位数,0-3,缺省为"0",D2=0有自动追重,D2=1无自动追重。 
R_CaliP1H		equ		0D3H	;标定参数,D7:D4=P1.3,D3:D0=P1.2 
;								P1.2=主单位分度值1(1)、2(2)、3(5),缺省值为"1" 
;								P1.3=主单位分数,0=1000,1=1200,2=1500,3=2000,4=2500,5=3000,6=4000, 
;						7=5000,8=6000,9=10000,缺省为"3" 
R_CaliP2L		equ		0D4H	;标定参数,D7:D4=P2.1,D3:D0=P2.0 
;						P2.0=称重锁定参数,0-7,缺省值为"2" 
;						=0-7分别对应锁定参数1/4d,1/2d,3/4d,1d,5/4d,3/2d,7/4d,2d 
;						P2.1=锁定时间,0=无锁定功能,5=锁定5秒,缺省值为"5" 
R_CaliP2H		equ		0D5H	;标定参数,D7:D4=P2.3,D3:D0=P2.2 
;						P2.2=自动关机时间,0=无自动关机,1-7对应30秒-210秒,8=10秒,9=300秒后自动关机 
;						缺省值为"2"(60秒自动关机) 
;						P2.3=称重速度参数:D1D0=00/01/02/03表示连续8/7/6/5个数据接近则锁定,缺省为"2" 
R_CaliTempe		equ		0D6H	;第一环境温度值(℃) 
R_TempeRepair		equ		0D7H	;温补值(-12.7d到+12.7d),=0时放弃温补,D7=1时为负数 
R_CaliParaFlag		equ		0D8H	;已标定参数标志,=5AH为有效 
R_CaliCodeFlag		equ		0D9H	;已标定内码标志,=0A5H为有效 
R_CaliCode0L		equ		0DAH	;零点的标定内码低字节 
R_CaliCode0H		equ		0DBH	;零点的标定内码高字节 
R_CaliDataL		equ		0DCH	;称重标定数据低字节 
R_CaliDataH		equ		0DDH	;称重标定数据高字节 
R_CaliChksumL		equ		0DEH	;标定数据校验和低字节 
R_CaliChksumH		equ		0DFH	;标定数据校验和高字节 
; 
R_DecimalDigits		equ		0E0H	;小数位数(由P1.1算出) 
R_ScaleMarkV		equ		0E1H	;分度值(由P1.2算出) 
R_LockCodeNum		equ		0E2H	;锁定所有的连续有效数据个数最大值,相当于6613H618中的0E9H 
R_OffsetCode		equ		0E3H	;锁定判断的内码值,相当于6613H618中的0F5H:0F4H 
R_10dCodeL		equ		0E4H	;10d内码的低字节,相当于6613H618中的0EDH:0ECH 
R_10dCodeH		equ		0E5H	;10d内码的高字节,相当于6613H618中的0EFH:0EEH 
R_MaxScaleMarkL		equ		0E6H	;最大分度数(+9)低字节 
R_MaxScaleMarkH		equ		0E7H	;最大分度数(+9)高字节 
R_TempCaliDataL		equ		0E8H	;暂存称重标定数据低字节 
R_TempCaliDataH		equ		0E9H	;暂存称重标定数据高字节 
R_UnitData0		equ		0EAH	;1d对应的不同计量单位的值(有效数字)低字节 
R_UnitData1		equ		0EBH	;1d对应的不同计量单位的值(有效数字)高字节 
R_UnitData2		equ		0ECH	;1d对应的不同计量单位的值(浮点数)的2的指数,≥80H为负数 
R_AdcDataL		equ		0EDH	;暂存ADC输出数据低字节 
R_AdcDataH		equ		0EEH	;暂存ADC输出数据高字节 
R_CodePointer		equ		0EFH	;内码存储指针 
R_CodeBuffer		equ		0F0H	;内码缓存0F0H-0FFH共8组16字节 
;============================================================================== 
;			Program start 
;============================================================================== 
			org	00H 
			GOTO	L_Start		;程序开始(RESET入口) 
			org	004H 
;			GOTO	L_IntProc	;中断服务程序 
L_IntProc: 
			MOVWF	R_WORKbak	;[WORK]->R_WORKbak 
			MOVFW	STATUS 
			MOVWF	R_STATUSbak	;[STATUS]->R_STATUSbak 
      			BTFSC   INTF,ADIF 
      			GOTO    L_AdcInt		;ADC中断,转 
      			BTFSS   INTF,TMIF 
      			GOTO	L_IntProcEnd	;不是Timer中断,转 
			BCF	INTF,TMIF		;清Timer中断标志 
      			BSF	R_PubFlag1,7	;1->R_PubFlag1.7 置Timer中断标志 
      			GOTO	L_IntProcEnd 
L_AdcInt: 
			BCF	INTF,ADIF		;清ADC中断标志 
			MOVFW	ADOL 
			MOVWF	R_AdcDataL		;[ADOL]->R_AdcDataL 
			MOVFW	ADOH 
			MOVWF	R_AdcDataH		;[ADOH]->R_AdcDataH 
			MOVLW	09H				;\ 
			ADDWF	R_AdcDataL,1	; | [R_AdcDataH:R_AdcDataL]+3D09H(15625) 
			MOVLW	3DH				; | ->R_AdcDataH:R_AdcDataL (转换为正数内码) 
			ADDWFC	R_AdcDataH,1	;/ 
			BSF	R_PubFlag0,3	;读到ADC内码 
L_IntProcEnd: 
			MOVFW	R_STATUSbak 
			MOVWF	STATUS		;[R_STATUSbak]->STATUS 
			MOVFW	R_WORKbak	;[R_WORKbak]->WORK 
			RETFIE 
;------------------------------------------------------------------------------ 
;程序开始 
L_Start: 
			CLRF	INTE			;关所有中断 
      			MOVLW   01000100B   	;CPU指令周期=MCK/2,OSC仅使用内部1MHz 
      			MOVWF   MCK 
			MOVLW	0C0H 
			MOVWF	AIENB1			;PT1.0-PT1.5 is Analog input channel(AIN0-AIN5) 
			MOVWF	PT1EN			;PT1.7-PT1.6 is output 
			MOVLW	40H 
			MOVWF	PT1				;0C0H->PT1 
			MOVLW	0 
			MOVWF	PT1PU			;0->PT1PU 
			MOVWF	PT2MR			;0->PT2MR 
			MOVWF	PT2OCB			;0->PT2OCB 
			MOVLW	11111000b 
			MOVWF	PT2EN			;PT2.7-PT2.3 is output,PT2.2-PT2.0 is input 
			MOVLW	00001111b 
			MOVWF	PT2PU			;PT2.3-PT2.0 with pull-up resistor 
			MOVWF	PT2				;07H->PT2 
L_InitClrRAM: 
			MOVLW	80H			;\ 
			MOVWF	FSR0			; \ 
L_InitClrR_Loop:					;  | RAM [0FFH:80H]清零 
			CLRF	IND0			;  | 
			INCFSZ	FSR0,1			; / 
			GOTO	L_InitClrR_Loop		;/ 
L_InitSFR: 
      			MOVLW   00011010B		;00011010B 
      			MOVWF   NETE    		;ENVS,LB输入选AIN4,ENLB 
      			MOVLW   01100011B   
      			MOVWF   NETF    		;ENBAND,ENVDDA,ENAGND,ENVB 
      			MOVLW   01000001b 
      			MOVWF   PCK				;ENPUMP=1,S_CH1CK[1:0]=00,S_BEEP=0,S_PCK=1 
			CALL	S_Delay 
; 
;      		MOVLW   11000100B 
;      		MOVWF   NETA   			;INL=TEMPL,FTIN=OP1O,FTB=FTIN,INH=FTB 
;      		MOVLW   00001110B 
;      		MOVWF   NETB    		;OP1N=OP1O,VRL=VR2P,VRH=VR1P 
;      		MOVLW   00001110B 
;      		MOVWF   NETD     		;OP1EN=1,OP1P=TEMPH 
; 
      			MOVLW   01000100B 
      			MOVWF   NETA   			;INL=AIN2,FTIN=OP1O,FTB=FTIN,INH=FTB 
      			MOVLW   00100100B 
      			MOVWF   NETB    		;OP1N=AIN5,VRL=AIN1,VRH=AIN0 
      			MOVLW   00001011B 
      			MOVWF   NETD     		;OP1EN=1,OP1P=AIN3 
; 
      			MOVLW	10000110B		;10000110B 
      			MOVWF	NETC			;SREFO=1,ADG=1,ADEN=1,AZ=0 
      			MOVLW   00001100b		;00001111b	;ADM=110bADCF/8000 
      			MOVWF   ADCON			;ADRST=1,ADM=100b=ADCF/2000 
; 
			CALL	S_ClrDisp	;清LCD显示缓冲区LCD1-LCD6 
      			MOVLW   00100111b		;00101111b 1/2bias,1/4duty 
      			MOVWF   LCDENR			;start LCD clock,1/3bias,1/4duty 
      			MOVLW   10001011B 
      			MOVWF   TMCON			;1/16秒中断 
L_InitCaliData: 
			CALL	S_RdCaliData	;读93LC46中00H-0AH的标定数据送至RAM R_CaliMarkL-R_CaliChksumH 
			CALL	S_CalcChksum	;计算标定数据之和->R_PubReg3:R_PubReg2 
			MOVFW	R_PubReg2 
			IORWF	R_PubReg3,0 
			BTFSS	STATUS,Z 
			GOTO	L_InitCaliErr	;[R_PubReg3:R_PubReg2]≠0 (93LC46中00H-0AH的值错误) 转 
			MOVLW	D_CaliMark1 
			SUBWF	R_CaliParaFlag,0 
			BTFSS	STATUS,Z 
			GOTO	L_InitCaliErr	;[R_CaliParaFlag]≠D_CaliMark1 (未标定参数) 转 
			MOVLW	D_CaliMark2 
			SUBWF	R_CaliCodeFlag,0 
			BTFSS	STATUS,Z 
			GOTO	L_InitCaliErr	;[R_CaliCodeFlag]≠D_CaliMark2 (未标定内码) 转 
L_InitScaleMark: 
			MOVFW	R_CaliP1H		;标定参数,D7:D4=P1.3,D3:D0=P1.2 
			CALL	S_RR4Work		;[WORK]右移4位->WORK,0->WORK.7:4 
			CALL	S_RdScaleMark 	;读分度数->WORK 
			MOVWF	R_PubReg2		;[WORK]->R_PubReg2 
			CLRF	R_PubReg3		;0->R_PubReg3 
			MOVLW	100 
			MOVWF	R_PubReg4		;100->R_PubReg4 
			CLRF	R_PubReg5		;0->R_PubReg5 
			CALL	S_Multi			;[R_PubReg3:R_PubReg2]×[R_PubReg5:R_PubReg4]->R_PubReg3:R_PubReg0 
			MOVLW	9 
			ADDWF	R_PubReg0,0 
			MOVWF	R_MaxScaleMarkL	;计算出的最大分度数(+9)低字节->R_MaxScaleMarkL 
			MOVLW	0 
			ADDWFC	R_PubReg1,0 
			MOVWF	R_MaxScaleMarkH	;计算出的最大分度数(+9)高字节->R_MaxScaleMarkH 
			GOTO	L_InitOther 
L_InitCaliErr: 
			CLRF	R_CaliMarkL		;\ 
			MOVLW	01H			; | 0100H->R_CaliMarkH:R_CaliMarkL 
			MOVWF	R_CaliMarkH		;/ 
			MOVLW	0FH 
			MOVWF	R_CaliP1L		;0FH(缺省值)->R_CaliP1L 
			MOVLW	31H 
			MOVWF	R_CaliP1H		;31H(缺省值)->R_CaliP1H 
			MOVLW	52H 
			MOVWF	R_CaliP2L		;52H(缺省值)->R_CaliP2L 
			MOVLW	22H 
			MOVWF	R_CaliP2H		;22H(缺省值)->R_CaliP2H 
			MOVLW	0A0H 
			MOVWF	R_PubCnt1		;0A0H->R_PubCnt1,定时10秒 
;			MOVLW	30H 
;			MOVWF	R_WorkStatus	;30H->R_WorkStatus,临时修改,用于显示内码 
			MOVLW	0C0H 
			MOVWF	R_WorkStatus	;0C0H->R_WorkStatus,10秒后关机。 
			CALL	S_Disp9346		;LCD显示" 9346" 

⌨️ 快捷键说明

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