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

📄 fft.c.svn-base

📁 单片机驱动32X64点阵资料
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
  	for(s=0;s<8;s++)		   //发送16字节数据
	{
		temp=BUFF[s];
	   	temp=255-temp;
	   	temp1=BUFF1[s];
	   	temp1=255-temp1;	 
		SDA_R=SDA_G_TOP=1;
	    for(k=0;k<8;k++)
		{
			SHCP=0;
			SDA_G=(bit)(temp&0x01);//这里SERr定义成普通IO口就得了
		    temp=temp>>1;
			SDA_R_TOP=(bit)(temp1&0x01);
			temp1=temp1>>1;
	      	SHCP=1;
		}
	}
}


/**********************************************************/

void in_data(void)		                       //调整数据
{
 	char s;
	for(s=4;s>=0;s--)			                    //i为向后先择字节计数器,zimuoo为向后先字计数器
	{
	 	BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*linee];            //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
	 	BUFF[2*s]=hanzi[zimuo+32*s+2*linee];	        //把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中

	 	BUFF1[2*s+1]=hanzi1[zimuo+1+32*s+2*linee];            //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
	 	BUFF1[2*s]=hanzi1[zimuo+32*s+2*linee];	        //把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中
	}
}



void show_start()  //上电显示 点阵频谱 正在启动
{
	for(stop=0;stop<250;stop++)
	{	
	 	while(Move<16)				             //数据移位。
       	{
	     	for(Speed=0;Speed<20;Speed++)       //移动速度
	      	{	
		    	for(linee=0;linee<16;linee++)
			  	{
		         	in_data();				     //调整移动数据
	             	rxd_data();
                 	P0=sw[linee];       
		                      						 
					STCP=1;//锁存
					STCP=0;
			    	STCP=1;
			    	delay3ms();	 //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。				 
	          	}
		 	}
       		Move++;				                 //移动一步
   	  	}
	}
}


/*******************************************/
void Scan_Mode()   //扫描模式
{
	switch (Mode)
	{
		case 0x00:
			fractional_frequency=16; //16分频
			break;
		case 0x01:
			fractional_frequency=64;// 64分频
			break;
		case 0x02:
			fractional_frequency=64; //预留功能
			break;
		default:
			fractional_frequency=16;//否则为16分频
			break;
	}	
}


/*****************************************/
void ADC_Finish() interrupt 5
{	   
 	ADC_CONTR &= !ADC_FLAG; 
    Fft_Real[LIST_TAB[ADC_Count]]=(int)((ADC_RES*2)<<2)+(ADC_RESL)*6;//-512;

	// Fft_Real[LIST_TAB[ADC_Count]]=(int)((ADC_RES)<<1)+(ADC_RESL>>1)*2;//-512; //按LIST_TAB表里的顺序,进行存储 采样值,,
	//  ADC_CONTR = ADC_POWER | ADC_SPEEDHH| ADC_START | channel;	// 为了采集负电压,采用 偏置采集。电压提高到1/2 vcc,,所以要减去256
	if(ADC_Count<=127) //采集128个AD值 没有滤波
		ADC_Count++;
	else 
	{
		EADC=0;
		TR0=0;
	}	  													 
}

 void LED_Display() interrupt 3					 //中断一次 显示一行。。。
 {	 	 

	uchar j;
	TH1=0xf2;												 
	TL1=0XAa;
    LED_TAB[0]=LED_TAB1[0]=LED_TAB[1]; //让第一列和地二列显示效果一样				
	for	(G=0;G<fractional_frequency;G++)						  //往点阵屏填充 一行的 数据  
	{				
		if(color==0)  //如果是 柱状红色
		{
			if(LED_TAB[G]<=LINE+16)
				SDA_R_TOP=1;
			else 
				SDA_R_TOP=0;
			if(LED_TAB[G]<=LINE)
				SDA_R=1;
			else 
				SDA_R=0;
			if(LED_TAB1[G]==LINE)
			{
				SDA_G_TOP=1;
				SDA_G=0;
			}
			else if(LED_TAB1[G]==(LINE+16))
			{
				SDA_G_TOP=0;
				SDA_G=1;
			}
			else 
				SDA_G=SDA_G_TOP=1; 
			SHCP=1;
			SHCP=0;
		}
		else if(color==1)  //如果是柱状 绿色
		{	
			if(LED_TAB[G]<=LINE+16)
				SDA_G_TOP=1;
			else 
				SDA_G_TOP=0;
			if(LED_TAB[G]<=LINE)
				SDA_G=1;
			else 
				SDA_G=0;
	
			if(LED_TAB1[G]==LINE)
			{
				SDA_R_TOP=1;
				SDA_R=0;
			}
			else if(LED_TAB1[G]==(LINE+16))
			{
				SDA_R_TOP=0;
				SDA_R=1;
			}
			else 
				SDA_R=SDA_R_TOP=1; 
			SHCP=1;
			SHCP=0;
		
		}
   		if(fractional_frequency==16) //如果是16分频 送三次一样的数据 中间送个空格
		{
			SHCP=1;
			SHCP=0;
			SHCP=1;
			SHCP=0;
			SDA_G_TOP=1;
			SDA_G=1;
			SDA_R_TOP=1;
			SDA_R=1;
			SHCP=1;
			SHCP=0;
		}
	}
	STCP=1;
	STCP=0;
	P0=sw[15-LINE];
	if(LINE>0)
		LINE--;
	else 
		LINE=15;
	for(j=0;j<fractional_frequency/16;j++) //根据是16分频 与64分频 来判断柱状递减的速度
	{
   		if(LED_TAB[COUNT]>0)
			LED_TAB[COUNT]--;		   //柱状递减,
 		if(COUNT>0)
			COUNT--;	
		else 
			COUNT=fractional_frequency-1;
	}	
	/*if(LED_TAB[COUNT]>0)
		LED_TAB[COUNT]--;		   //柱状递减,
	if(COUNT>0)
		COUNT--;
	else 
		COUNT=15;
	if(LED_TAB[COUNT]>0)
		LED_TAB[COUNT]--;
	if(COUNT>0)
		COUNT--;
	else 
		COUNT=15;
   												   //漂浮物递减
	if(LED_TAB2[COUNT1]==0)					//判断是否需要停顿	   
	{
		if(LED_TAB1[COUNT1]>LED_TAB[COUNT1])LED_TAB1[COUNT1]--;//大于柱状则递减(保持漂浮物在柱状之上) 
	}
	else 
		LED_TAB2[COUNT1]--;
	COUNT1++;
	if(COUNT1>=16)COUNT1=0;*/
	if(fractional_frequency==16)   //判断是否是16分频
	{
		Stop_time=1;
	}
	else  //如果是64分频
	{
		Stop_time=3; 	
	}
	for(j=0;j<Stop_time;j++)	//16  Stop_time 变量漂浮点递减速度控制
	{
	   	if(LED_TAB2[COUNT1]==0)
	   	{
	   		if(LED_TAB1[COUNT1]>LED_TAB[COUNT1])
				LED_TAB1[COUNT1]--; 
	   	}
	   	else 
			LED_TAB2[COUNT1]--;
	   	COUNT1++;
	}
	if(COUNT1>=fractional_frequency)
		COUNT1=0;
/*******************************************************************/
 }


void Ad_Control() interrupt 1					 //控制采样率
{
 	ADC_CONTR = ADC_POWER | ADC_SPEEDHH| ADC_START | channel;	 //开始AD采集
} 
  //==============================================================================================================
 //	*******************		   					main()							*********************************										  
 //===============================================================================================================
/**************************延时***********************/
//
void DelayMs(void)
{
  	uchar TempCyc;
  	for(TempCyc=100;TempCyc>1;TempCyc--)
    {;}
}
 /*****************************************************/
 void main()
 {
    uchar i;
 	Init();
	while(1)
	{		
		ADC_Count=0;
		TR0=1;
		EADC=1;	//开启定时器中断0,,开启ADC 
		while(ADC_Count<128);  //取128个点
		/*********************************/
		if(key_moda==0) //按键S2 模式改变  16与64分频
		{
			DelayMs();
			if(key_moda==0)
			{
			     Mode++;
				 if(Mode>2)
				 {
				      Mode=0;	
				 }
				 Scan_Mode();
				 sector_erase(0); //擦擦第1个扇区  512字节一个扇区
				 byte_program(0,Mode);//  存放在EEP第一扇区	 		
			}
			while(key_moda==0);
		}
/******************************************/
		if(key_color==0) //柱条颜色改变
		{
			DelayMs();
			if(key_color==0)
			{
			     color++;
				 if(color>1)
				 {
				      color=0;	
				 }
				 sector_erase(0x200); //擦擦第2个扇区  512字节一个扇区
				 byte_program(0x200,color);//  存放在EEP第二扇区
				 		
			}
			while(key_color==0);
		}
	   /**************************************/
        for(i=0;i<128;i++)
        {
         Fft_Image[i]=0; //虚部清0
        }
		FFT();
	 	//FFT运算。并转换为 功率值。。。						   
		//TR1=1;		 
	}
 }
 const uchar code hanzi[]={/*移动显示汉字字模,*/
0x00,0x00,0xFE,0x7F,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x08,0x01,0x08,0x3F,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0xFF,0x7F,0x00,0x00,0x00,0x00,/*"正",0*/

0x40,0x00,0x40,0x00,0xFE,0x7F,0x20,0x00,0x20,0x00,0x10,0x02,0x18,0x02,0xE8,0x3F,0x0C,0x02,0x0A,0x02,0x09,0x02,0x08,0x02,0x08,0x02,0xE8,0x7F,0x08,0x00,0x00,0x00,/*"在",1*/

0x80,0x00,0x00,0x03,0x00,0x01,0xF8,0x3F,0x08,0x20,0x08,0x20,0xF8,0x3F,0x08,0x00,0x08,0x00,0xE8,0x3F,0x28,0x20,0x24,0x20,0x24,0x20,0xE2,0x3F,0x21,0x20,0x00,0x00,/*"启",2*/

0x00,0x04,0x00,0x04,0x7E,0x04,0x00,0x04,0x00,0x3F,0xFF,0x24,0x08,0x24,0x08,0x24,0x24,0x24,0x44,0x24,0xF2,0x22,0x5F,0x22,0x02,0x21,0x80,0x28,0x40,0x10,0x00,0x00,/*"动",3*/


};
const uchar code hanzi1[]={/*移动显示汉字字模,*/
0x80,0x00,0x80,0x00,0x80,0x1F,0x80,0x00,0x80,0x08,0xF8,0x1F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,0x80,0x08,0x14,0x11,0x24,0x22,0x22,0x22,0x00,0x00,/*"点",0*/

0x00,0x01,0x1F,0x01,0x11,0x01,0xE9,0x3F,0x85,0x00,0x89,0x02,0x51,0x02,0xF1,0x3F,0x11,0x02,0x15,0x02,0xE9,0x7F,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,/*"阵",1*/

0x10,0x00,0x10,0x7F,0x72,0x04,0x12,0x02,0x12,0x3F,0x7F,0x21,0x00,0x25,0x10,0x25,0x52,0x25,0x52,0x25,0x21,0x25,0x10,0x0A,0x08,0x12,0x04,0x61,0xC3,0x40,0x00,0x00,/*"频",2*/

0x40,0x10,0x82,0x08,0xF4,0x7F,0x8C,0x08,0xA4,0x28,0xC0,0x18,0xF7,0x7F,0x04,0x00,0xC4,0x1F,0x44,0x10,0x44,0x10,0xC4,0x1F,0x54,0x10,0x4C,0x10,0xC4,0x1F,0x40,0x10,/*"谱",3*/
};

⌨️ 快捷键说明

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