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

📄 signal_show.c

📁 使用51系列单片机实现LCD的驱动显示
💻 C
📖 第 1 页 / 共 2 页
字号:
*名称:showchinese(uchar x,uchar y,int chin)
*描述:在x,y位置处,显示字符码为chin
*参数:坐标x,坐标y
*返回:
****************************************************************/
void showchinese(uchar x,uchar y,int chin)
{ 
	int temp1,temp2; 
	uchar hi,lo;
	uchar b,c=0,d;
	d=y;
	temp2=chin;
	outcode(0x4c);
	for(b=0;b<16;b++){
		temp1=0x5218+x/8+d*AP;//5218
		hi=temp1/256;
		lo=temp1%256;
		outcode(0x46);
		outdata(lo);
		outdata(hi);
		outcode(0x42);
		outdata(hzdot[temp2]);
		temp2++;
		outdata(hzdot[temp2]);
		temp2++;
		d=d+1;
	}
}/***************************************************************
*名称:showchin(void)
*描述:显示四个汉字,波,形,正,弦
*参数:
*返回:
****************************************************************/
void showchin(void)
{		
	showchinese(10,20,CB2A8);
	showchinese(27,20,CD0CE);
	showchinese(10,140,CC6B5);
	showchinese(27,140,CC6D7);
	showchinese(10,239,C0000);
}
/***************************************************************
*名称:initall(void)
*描述:初始化液晶屏
*参数:
*返回:
****************************************************************/
void initall(void)
{
	turnoff();
	init();
	initram();
	turnon();
	DrawFrame();
	DrawGrid();
	showchin();
	showchin() ;
}
void showflag(uchar x,uchar y,int chin)
{ 
	int temp1,temp2; 
	uchar hi,lo;
	uchar b,c=0,d;
	d=y;
	temp2=chin;
	outcode(0x4c);
	for(b=0;b<16;b++){
		temp1=0x01f9+x/8+d*AP;//5218
		hi=temp1/256;
		lo=temp1%256;
		outcode(0x46);
		outdata(lo);
		outdata(hi);
		outcode(0x42);
		outdata(hzdot[temp2]);
		temp2++;
		outdata(hzdot[temp2]);
		temp2++;
		d=d+1;
	}
}
/***************************************************************
*名称:Verline(uchar x ,uchar y)
*描述:在第一层画垂直线
*参数:线的起始坐标(x,y)
*返回:
****************************************************************/
void Verline(uchar x ,uchar y)
{
	uchar tempx , tempy ;
    uchar i;
    tempx = x ;
    tempy = 200 - y ;
	outcode(0x4f);
	for(i=tempy;i<0xc8;i++)WriteD(x,i);
}
/***************************************************************
*名称:pinpu(void)
*描述:在第一层画频谱
*参数:
*返回:
****************************************************************/
void pinpu(uchar x[],uchar N_temp,int N_start)
{
	uchar temp ,temp2,temp3;
	for(temp=0;temp<N_temp;temp++)
	{
		temp2 = temp*2+N_start ;
		temp3 = (x[temp]) ;//%200
		Verline(temp2,temp3);
	}
}
/***************************************************************
*名称:uchar adc0804(void)
*描述:AD0804采样一次
*参数:
*返回:采样值
****************************************************************/
uchar adc0804(void)
{
	uchar ad_data ;
	Adc_cs = 0 ;
	lcd_a0 = 1 ;
	lcd_wr = 0 ;
	lcd_wr = 1 ;
	while(Adc_busy) ;
	lcd_a0 = 0 ;
	ad_data = P0 ;
	lcd_a0 = 1 ;
	Adc_cs = 1 ;
	return ad_data ;
}
/***************************************************************
*名称:Adc_work(void)
*描述:AD0804采样
*参数:
*返回:采样值数组
****************************************************************/
void Adc_work(void)	
{
	unsigned int k=0 ,temp1,temp2 ,flag=0;
	Ram_cs = 0 ;
//	Ram_en = 0 ;

	while(!Adc_en) ;
	xr[0] = adc0804();
/*do
{
	for(k=0;k<10;k++)//
		{

			while(!Adc_en) ;
			xr[k] = adc0804();		
			while(!Adc_en) ;
		}
		temp1=xr[0];
		for(k=0;k<10;k++)
		{
			temp2=xr[k];
			if(temp2>temp1)temp1=temp2;	    

		}
	if((temp1-xr[0])<3) flag=0;
	else flag=1;
	

}while(!flag);	
*/
	for(k=0;k<Sam_N;k++)//
	{
		while(!Adc_en) ;
		xr[k] = adc0804() ;
		xr_show[k] = xr[k] ;
		while(!Adc_en) ;
	}

}
/**************************************************************
*名称:Fft(float xr[],float xi[])
*描述:FFT,N=128,M=7
*参数:采样的实序列和序数部分
*返回:
****************************************************************/
void Fft(void)//float xr1[],float xi1[]
{
	uchar L,B,J,P,k;
	float rPartKB,iPartKB;
 	ChangeOrder(xr,xi);

	for(L=1;L<=N;L++)
	{
 		B=1<<(L-1);
 		for(J=0;J<=B-1;J++)
 		{
 			P=J*(1<<(N-L));
 			for(k=J;k<=Sam_N-1;k+=1<<L)
  			{
  				rPartKB=xr[k+B]*rCf[P]-xi[k+B]*iCf[P];
  				iPartKB=xi[k+B]*rCf[P]+xr[k+B]*iCf[P];
  				xr[k+B]=xr[k]-rPartKB;
  				xi[k+B]=xi[k]-iPartKB;
  				xr[k]=xr[k]+rPartKB;
  				xi[k]=xi[k]+iPartKB;

  			}
 		}
	} 
}
/***************************************************************
*名称:ChangeOrder(float xr[],float xi[],int N)
*描述:ChangeOrder
*参数:
*返回:
****************************************************************/
void ChangeOrder(float xr[],float xi[])
{
 	uchar I,J,K;
 	float T;
 	double sum_xr = 0 ;
 	Ram_cs = 0 ;
 	J=Sam_N/2;//J=Sam_N/2;
 	for(I=1;I<=Sam_N-2;I++)//for(I=1;I<=Sam_N/2-2;I++)
 	{
  		if(I<J)
  		{
   			T=xr[I];xr[I]=xr[J];xr[J]=T;
   			T=xi[I];xi[I]=xi[J];xi[J]=T;
  		}
 		K=Sam_N/2;
 		while(J>=K)
 		{
  			J=J-K;
  			K=(int)(K/2+0.5);
 		}
 		J=J+K;
	}
	for(I=0;I<Sam_N;I++)
	{
		sum_xr = sum_xr + xr[I] ;
	}
	sum_xr = sum_xr/Sam_N ;
	for(I=0;I<Sam_N;I++)
	{
		xr[I]=xr[I]-sum_xr ;
	}
}
/***************************************************************
*名称:Fft_out (float xr[] , float xi[])
*描述:计算频谱分析结果
*参数:fft计算结果的实虚序列
*返回:
****************************************************************/
void Fft_out (void)
{
	uchar i ;
	for(i=0;i<Sam_N/2;i=i+1)
	{ 
		w[i]=sqrt(xr[i]*xr[i]+xi[i]*xi[i]);
	}
}
/***************************************************************
*名称:showsine (void)
*描述:显示采样的结果,采64个点但显示256点
*参数:xr_temp[]显示数组,N_temp数组元素个数,
	   start_add图形开始的x地址,last上次显示最后一个元素
*返回:
****************************************************************/
void showsine (uchar xr_temp[],uchar N_temp,uchar start_add,uchar last)
{
	uchar i ;
	WriteD(start_add,xr_temp[1]/2);
	vector(start_add-1,last/2,xr_temp[1]/2);
	for(i=2;i<N_temp;i++)
	{
		WriteD(i-1+start_add,xr_temp[i]/2);
		vector(i-2+start_add,xr_temp[i-1]/2,xr_temp[i]/2);
	}
}

void main()
{
	uchar flag=0,temp[32] ,temp_1,temp_2;
	uchar i,j ;

	Ram_cs = 1 ;//转向对液晶操作
	lcd_a0 = 0 ;
	lcd_wr = 1 ;
	initall() ;
	do{
	initram_1();

	Adc_work() ;
	
	for(i=0;i<32;i++)temp[i]=xr[i];
	temp_1=temp[31];
	
	WriteD(10,temp[0]/2);
	showsine(temp,32,11,temp[0]);
	
	lcd_a0 = 1 ;//转向对ram操作
	lcd_wr = 1 ;
	Ram_cs = 0 ;
	for(i=32;i<64;i++)
		temp[i-32]=xr[i];
	temp_2=temp[31];
	
	Ram_cs = 1 ;//转向对液晶操作
	lcd_a0 = 0 ;
	lcd_wr = 1 ;
	showsine(temp,32,42,temp_1);
	
	lcd_a0 = 1 ;//转向对ram操作
	lcd_wr = 1 ;
	Ram_cs = 0 ;
	for(i=64;i<96;i++)
		temp[i-64]=xr[i];
	temp_1=temp[31];
	
	Ram_cs = 1 ;//转向对液晶操作
	lcd_a0 = 0 ;
	lcd_wr = 1 ;
	showsine(temp,32,73,temp_2);
	
	lcd_a0 = 1 ;//转向对ram操作
	lcd_wr = 1 ;
	Ram_cs = 0 ;
	for(i=96;i<128;i++)
		temp[i-96]=xr[i];
	
	Ram_cs = 1 ;//转向对液晶操作
	lcd_a0 = 0 ;
	lcd_wr = 1 ;
	showsine(temp,32,104,temp_1);
	
	lcd_a0 = 1 ;//转向对ram操作
	lcd_wr = 1 ;
	Ram_cs = 0 ;
	Fft() ;
	Fft_out() ;
	for(i=0;i<32;i++)temp[i]=w[i]/160;
	Ram_cs = 1 ;
	lcd_a0 = 0 ;
	lcd_wr = 1 ;
	pinpu(temp,32,25) ;
	for(i=0;i<Sam_N;i++)
				xi[i] = 0 ;
	}while(1) ;
}

⌨️ 快捷键说明

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