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

📄 radio.c

📁 多功能MP3代码
💻 C
字号:
#include "COMM.h"
//收音机控制部分代码,实际操作TEA5767不在该文件下 					    
//正点原子@SCUT
//V1.0

u8 RADIO_STATUS=0X02; //收音机状态	bit0,开机/关机;bit1,后台播放使能?
u8 Search_Mode=0;  //搜索模式 0,调频模式;1,调台模式;2,全自动搜台
	 
#define JPS 0X32   //日本模式
#define USA 0X12   //美国模式

const u8 *Rmenu_F1[4]={"搜索模式","搜索级别","频段选择","后台播放"};  //第1级父目录目录
const u8 *Rmenu_S1[3]={"调频模式","调台模式","全自动搜台"};//第1级子目录
const u8 *Rmenu_S2[6]={"级别1","级别2","级别3","级别4","级别5","级别6"};//第2级子目录
const u8 *Rmenu_S3[2]={"普通频段","日本频段"};//第3级子目录
const u8 *Rmenu_S4[2]={"开启","关闭"};//第4级子目录

//保存数据  
//CHECK OK 09/05/25
//数据段:60~180 用来存储电台数据 60个电台 日本,欧洲各30个
void Save_RData(void)
{		    	   
	u8 i;	
	FM24C16_WriteOneByte(54,Search_Mode);//保存搜索模式
	FM24C16_WriteOneByte(55,JPUS);//保存频段
	FM24C16_WriteOneByte(56,RSIGNAL_STATUS);//保存立体声与否标志
	FM24C16_WriteOneByte(57,sCh_Cho);//保存当前选择的电台 	  
	if(JPUS==USA)//保存欧美频段数据
	{
		FM24C16_WriteOneByte(58,sCh_Num);//保存USA频段最大电台数 Ch_Num
		for(i=0;i<sCh_Num;i++)
		{						    
			FM24C16_WriteLenByte(60+i*2,Ch_Value[i]/10,2);			     	   
		}
	}else
	{
		FM24C16_WriteOneByte(59,sCh_Num);//保存JPS频段最大电台数  sCh_Num
		for(i=0;i<sCh_Num;i++)
		{						  
			FM24C16_WriteLenByte(120+i*2,Ch_Value[i]/10,2);		    	   
		}
	}
}
//读取数据  
//CHECK OK 09/05/25
void Read_RData(void)
{		        
	u8 i;						 
	if(JPUS==USA)//读取欧美频段数据
	{
		sCh_Num=FM24C16_ReadOneByte(58);//保存USA频段最大电台数 sCh_Num
		for(i=0;i<sCh_Num;i++)				
		{				 
			Ch_Value[i]=FM24C16_ReadLenByte(60+i*2,2);
			Ch_Value[i]*=10;//扩大十倍   	    	   
		}
	}else//读取日本频段数据
	{
		sCh_Num=FM24C16_ReadOneByte(59);//保存USA频段最大电台数 sCh_Num 	 
		for(i=0;i<sCh_Num;i++)
		{									  				    
			Ch_Value[i]=FM24C16_ReadLenByte(120+i*2,2);;
			Ch_Value[i]*=10;//扩大十倍 	   
		}
	}
}
//收音机功能设置函数
//CHECK OK 09/05/25
void Radio_Set(void)
{
	u8 selx;
	u8 temp=0;	 
	while(1)
	{
		selx=Load_Fun_Sel(Rmenu_F1,"功能选择","选择",4,temp);
		temp=selx;
		if(selx==8)return;//返回
		else
		{
			switch(selx)
			{
				case 0://模式设置
					selx=Load_Fun_Sel(Rmenu_S1,Rmenu_F1[0],"确定",3,Search_Mode);
					if(selx<3)
					{
						Search_Mode=selx;
						FM24C16_WriteOneByte(54,Search_Mode);//保存搜索模式
						return;
					}		   
					break;
				case 1://搜索级别设置
					selx=(RSIGNAL_STATUS>>4)&0x07;
					if(selx>5)selx=0;//初始位置确定		   									 
					selx=Load_Fun_Sel(Rmenu_S2,Rmenu_F1[1],"确定",6,selx);
					if(selx<6)
					{
						RSIGNAL_STATUS&=0x8F;//清空上次数值
						RSIGNAL_STATUS|=selx<<4;//0~5,搜索级别
						return;
					}		   
					break;
				case 2://搜索频段设置
					if(JPUS==JPS)selx=1;//初始位置确定
					else selx=0;
					selx=Load_Fun_Sel(Rmenu_S3,Rmenu_F1[2],"确定",2,selx);
					if(selx==1)JPUS=JPS;    //日本频段 
					else if(selx==0)JPUS=USA;//欧美频段 
					if(selx<2)
					{
						FM24C16_WriteOneByte(55,JPUS);//保存频段
						Read_RData();//读取数据
						if(sCh_Num>0)//搜索到了电台    
						{
							sCh_Cho=0;//调节到0频段
							set_freq=Ch_Value[sCh_Cho];//调节到频道0
						}
						return;
					}		  
					break;
				case 3://后台播放与否
					if(RADIO_STATUS&0x02)selx=0;//初始位置确定
					else selx=1;
					selx=Load_Fun_Sel(Rmenu_S4,Rmenu_F1[3],"确定",2,selx);
					if(selx==0)RADIO_STATUS|=0x02;//开启后台播放
					else if(selx==1)RADIO_STATUS&=~0x02;//关闭后台播放
					if(selx<2)return;	 
					break;
			} 
		}
	}	   
}
//显示信号强度和频道值
//CHECK OK 09/05/25
void Signal_CH_Show(void)
{
	BACK_COLOR=MP3COLOR3;
	POINT_COLOR=GRED;  
	TFT_ShowNum(221,31,RSIGNAL_STATUS&0x0F,2,16,0);//显示信号强度
	BACK_COLOR=MP3COLOR4;
	POINT_COLOR=GRED;
	TFT_ShowNum(124,58,sCh_Cho,2,16,0);//显示频道
}
//显示当前频率
//CHECK OK 09/05/25
void Radio_Freq_Show(u32 freq)
{
	BACK_COLOR=BLACK;
	POINT_COLOR=GBLUE;
	freq/=100;//缩小100倍 760~1080的范围    
	if(freq>999)TFT_ShowBigChar(33,121,freq/1000);//百位数
	else TFT_Fill(33,121,63,181,BLACK);//清空显示
	TFT_ShowBigChar(63,121,(freq/100)%10);//十位数
	TFT_ShowBigChar(93,121,(freq/10)%10); //个位数
	TFT_ShowBigChar(123,121,'.'); //"."
	TFT_ShowBigChar(153,121,freq%10);     //显示小数	
	if(JPUS==USA)Pro_Bar(875,1080,freq);//显示进度条
	else Pro_Bar(760,910,freq);//显示进度条
	Signal_CH_Show();//显示信号强度,频道值
}

//显示收音机主界面的基本信息
//CHECK OK 09/05/25
void Radio_Msg(void)
{
	BACK_COLOR=MP3COLOR3;
	POINT_COLOR=GREEN;
	if(RSIGNAL_STATUS&0X80)TFT_ShowButton(108,27,20);//加载立体声
	else TFT_ShowButton(108,27,19);//加载 单声道
	POINT_COLOR=GRED;
	TFT_ShowNum(27,31,voltemp[0],2,16,0); //显示音量				   
	
	BACK_COLOR=MP3COLOR4;						  
	POINT_COLOR=GREEN;
	if(JPUS==USA)
	{
		Show_Str(1,75,"87.5",0);
		Show_Str(207,75,"108",0);
	}else
	{
		Show_Str(17,75,"76",0);
		Show_Str(207,75,"91",0);
	}  
	BACK_COLOR=MP3COLOR6;
	POINT_COLOR=GRED;
	TFT_ShowNum(69,219,voltemp[0],2,16,0); //显示音量
	if(RSIGNAL_STATUS&0X80)Show_Str(154,219,"立体声",0);
	else Show_Str(154,219,"单声道",0);
}
//收音机播放
//CHECK OK 09/05/25
void Radio_Play(void)
{
	u8 key;u8 MUTE=1;
	u8 temp;   
	if(RADIO_STATUS&0x01)//已经开启了
	{
	}else 
	{							   
		RADIO_STATUS|=0x01;//标记开启
		Search_Mode=FM24C16_ReadOneByte(54);   //读取搜索模式
		if(Search_Mode>2)//未初始化
		{						   
			Search_Mode=0;
			for(temp=54;temp<160;temp++)FM24C16_WriteOneByte(temp,0);//写入数据,清空
			JPUS=USA;
			set_freq=87500;
		}else //已经初始化了的
		{								  									    
			JPUS=FM24C16_ReadOneByte(55);          //读取频段
			RSIGNAL_STATUS=FM24C16_ReadOneByte(56);//读取立体声与否标志
			sCh_Cho=FM24C16_ReadOneByte(57);       //读取当前选择的电台   
			Read_RData();//读取频率值
			set_freq=Ch_Value[sCh_Cho];//得到频率值
		}    	
		TEA5767_INTI();   
    	read5767(); 
		set_frequency(set_freq);//初始化频率	    
	}		
	init_pt2314(FM_Audio);//开启声音	    	  				 
	Load_Gui_Radio(); //加载收音机界面
	Pro_Bar_Init(35,78,170);
	Radio_Msg();  
radiorst:	
	Radio_Freq_Show(set_freq); 	 	key=0;
	while(1)
	{
		if((Pen_Point.Key_Sta==Key_Down||NPEN)&&Pen_Point.Key_LSta)
		{
			Pen_Point.Key_LSta=Key_Up;
			key=Touch_To_Num(5);//得到按键值 	
		}
		if(PEN)//按键松开了,状态改变(状态机)
		{
			Pen_Point.Key_LSta=Key_Down;	  
			Pen_Point.Key_Sta=Key_Up;
		}
		if(key)//有按键按下
		{								 	 
			switch(key)
			{
				case 1://音量减
					Pen_Point.Key_LSta=Key_Down;//使能下次进入
					if(voltemp[0]>1)voltemp[0]--;
					init_pt2314(FM_Audio);//设置生效
					break;
				case 2://音量加
					Pen_Point.Key_LSta=Key_Down;//使能下次进入
					if(voltemp[0]<64)voltemp[0]++;
					init_pt2314(FM_Audio);//设置生效
					break;
				case 3://立体声选择
					temp=RSIGNAL_STATUS>>7;
					temp=!temp;	
					RSIGNAL_STATUS&=0x7F;
					RSIGNAL_STATUS|=temp<<7;
					TEA5767_INTI();//设置生效
					set_frequency(set_freq);  
					FM24C16_WriteOneByte(56,RSIGNAL_STATUS);//保存立体声与否标志 
					break;
				case 4:
					if(Search_Mode==0)
					{
						frequency_UP_DOWN(0);//下调			    
					}else if(Search_Mode==1)
					{
						if(!sCh_Num)break;//没有任何电台
						if(sCh_Cho)sCh_Cho--;
						else sCh_Cho=sCh_Num-1;
						set_freq=Ch_Value[sCh_Cho];
						set_frequency(set_freq);  
    					read5767();//更新
					}
					Radio_Freq_Show(set_freq);//显示频率值	    
					break;
				case 6:
					if(Search_Mode==0)
					{
						frequency_UP_DOWN(1);//上调			    
					}else if(Search_Mode==1)
					{
						if(!sCh_Num)break;//没有任何电台
						if(sCh_Cho<(sCh_Num-1))sCh_Cho++;
						else sCh_Cho=0;
						set_freq=Ch_Value[sCh_Cho];
						set_frequency(set_freq);  
    					read5767();//更新
					}
					Radio_Freq_Show(set_freq);//显示频率值	    
					break;
				case 5://静音 
					MUTE=!MUTE;
					BACK_COLOR=MP3COLOR7;
					POINT_COLOR=WHITE; 
					if(MUTE)
					{
						TFT_ShowButton(108,261,15);
						init_pt2314(NONE_Audio);
					}else
					{
						TFT_ShowButton(108,261,13);
						init_pt2314(FM_Audio);
					}
					break;					  
				case 7://选项
					Radio_Set();
					Load_Gui_Radio();//加载收音机界面
					Pro_Bar_Init(35,78,170);
					Radio_Msg(); 
					TEA5767_INTI();//设置生效
					set_frequency(set_freq);//初始化到进入时的频率
					if(Search_Mode==2)//自动搜台完毕,自动进入调台模式
					{
						auto_search();//自动搜索电台
						if(sCh_Num==0)Search_Mode=0;//未搜索到任何电台,设置到调频模式
				   		else
						{
							Search_Mode=1;//调台模式
							Save_RData(); //保存数据
						}
					}
					goto radiorst;	 
				case 8://退出									 
					FM24C16_WriteOneByte(57,sCh_Cho);//保存当前选择的电台 
					if(RADIO_STATUS&0x02)return;//使能背景播放	   
					else//背景播放被禁止了
					{							  
						init_pt2314(NONE_Audio);//关掉音源
						return;
					}  
			}					 
			if(key!=4&&key!=6)Radio_Msg();  
			key=0;
		}	  		   	  
	}
}















⌨️ 快捷键说明

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