www.pudn.com > LineIN_Filter.rar > System.asm


.EXTERNAL	G_Flag_Status; 
 
.DEFINE		P_WatchDog_Clear	0x7012 
.DEFINE 	P_ADC_MUX_Ctrl 		0x702b 
.DEFINE 	P_ADC_MUX_Data		0x702c 
 
 
.define 	FOR_PLAY_xKHZ		(0xffff - 49152000/2/4000)	  
.define 	FOR_RECORD_8KHZ 	(0xffff - 49152000/2/8000) 
 
.PUBLIC		_System_Initial; 
.PUBLIC		_Fir; 
 
.INCLUDE	hardware.inc 
	 
.CODE 
_System_Initial:	.PROC 
 
	 	//系统时钟设定 
	 	r1 = 0x0098;    		 	 
	 	[P_SystemClock] = r1; 
	 	 
	 	//IO设定 
	 	//IOA0~IOA2为带下拉电阻输入,IOA6为悬浮输入 
	 	r1=0x0; 
	 	[P_IOA_Dir]=r1; 
	 	r1=0xfff0; 
	 	[P_IOA_Attrib]=r1; 
	 	[P_IOA_Data]=r1; 
 
		r1=0xffff; 
		[P_IOB_Dir] = r1; 
		[P_IOB_Attrib] = r1; 
		r1=0x3; 
	    [P_IOB_Data] = r1;   
	  
	    r1 = 0x00C3;				//采用24位地址 
	    [P_SIO_Ctrl] = r1; 
	 
		 
	 	//TimerA设定 
	 	r1 = 0x0030;    		 	//clckA选择Fosc/2;屏蔽ClockB 
	 	[P_TimerA_Ctrl] = r1; 
	 	r1 = FOR_RECORD_8KHZ;		 
	 	[P_TimerA_Data] = r1;   	//8kHz中断频率 
	 	 
	 	//DA设定 
		 r1 = 0;     
	 	[P_DAC_Ctrl] = r1;      	//直接将DAR锁存到DAC,通过读P_ADC触发ADC转换 
	 	 
	 	//AD设定 
	 	r1 = 0x1; 
	 	[P_ADC_Ctrl] = r1;        	//允许数模转换 
	 	r1 = 0x7; 
	 	[P_ADC_MUX_Ctrl] = r1;    	//选择Line_IN7(IOA6)输入 
	 	 
	 	//中断设置 
	 	r1 = 0x2000; 
	 	[P_INT_Ctrl] = r1;    		//允许timeA的FIQ中断 
	 	retf 
.ENDP 
 
 
//////////////////////////////////////////// 
_Fir:	.PROC 
	 	r1 = x0; 					//数据指针复位 
	 	r2 = h0; 					//系数指针复位	 
	 
		r3 = [P_ADC_MUX_Data];     	//取AD采样数据 
		[P_DAC1]=r3; 
		r3 = r3 & 0xffc0 
		r3 = r3 lsr 1; 
	 	[r1] = r3; 					//更新 
	 
	 	mr = [r1]*[r2],ss,16       	//FIR滤波运算 
		r4 += 0x7fff;				//电压偏移	 
		r1=r4; 
		retf 
.ENDP 
 
 
 
 
.DATA 
		h0:    .dw 48; 
		h1:    .dw -724; 
		h2:    .dw -119; 
		h3:    .dw -2779; 
		h4:    .dw -2841; 
		h5:    .dw -2080; 
		h6:    .dw -15369; 
		h7:    .dw 32768; 
		h8:    .dw 32768; 
		h9:    .dw -15369; 
		h10:   .dw -2080; 
		h11:   .dw -2841; 
		h12:   .dw -2779; 
		h13:   .dw -119; 
		h14:   .dw -724; 
		h15:   .dw 48; 
.ISRAM 
		x0:    .dw 1; 
		x1:    .dw 1; 
		x2:    .dw 1; 
		x3:    .dw 1; 
		x4:    .dw 1; 
		x5:    .dw 1; 
		x6:    .dw 1; 
		x7:    .dw 1; 
		x8:    .dw 1; 
		x9:    .dw 1; 
		x10:   .dw 1; 
		x11:   .dw 1; 
		x12:   .dw 1; 
		x13:   .dw 1; 
		x14:   .dw 1; 
		x15:   .dw 1; 
 
.PUBLIC _Timer_for_Record   
_Timer_for_Record: 
		int off;	 
		r1 = FOR_RECORD_8KHZ 		// 采样率为 8kHz 
		[P_TimerA_Data] = r1;		// 
		int irq; 
		retf; 
		 
.PUBLIC _Timer_for_Play   
_Timer_for_Play: 
		int off;	 
		r1 = FOR_PLAY_xKHZ; 	 
		[P_TimerA_Data] = r1;		// 
		int irq; 
		retf;