📄 radio.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 + -