📄 radio.c
字号:
iniband1(band);
if(reuse==reuse_seach)
in0.in0.frq=0x0a30; //从最低端开始搜索
ab=0;
remkey=0x00;
while((in0.in0.frq!=0x0230)&(in0.in0.frq!=0x0d98)) //设置搜台的范围(中波575KHZ-1605HZ)
{
e=(stepserch(dir,in0.in0.frq)&0x0000ffff);
display();
if((e<0x3880)&&(e>0x3800))//判断搜台是否准确的依据(在这里设置了一个范围来提高搜台数量减少漏台,但是实质范围过大将会搜到很多的假台)
{
b[0]=in0.in0.frq>>8;
b[1]=in0.in0.frq;
if(reuse==reuse_waite)
{
goto likai;
}
wrnbyt(0xa0,ab*2+120,2,b); //将搜到的电台存储起来
//rdnbyt(0xa0,ab*2,2,a);//此语句为校验写入的和读出的是否相同
ab=ab+1;
}
if(tund&&tuni)
key_long=1;
if(key_long)
if(!tund||!tuni)
{
key_long=0;
goto likai;
}
if(remkey==0xed)
{
remkey=0;
goto likai;
}
if(remkey==0xb5)
{
remkey=0x27;
mute_(off);
return;
}
}
save_eeprom();
}
else if(band==fm)
{
iniband();
iniband1(band);
ab=0;
remkey=0x00;
if(reuse==reuse_seach)
in0.in0.frq=0x35e0; //从最低端开始搜索
while((in0.in0.frq!=0x85e0)&(in0.in0.frq!=0x6290)) //设置搜台的范围(中波86.9mHZ-108mHZ)
{
e=(stepserch(dir,in0.in0.frq)&0x000fffff);
display();
if((e<0x539c0)&&(e>0x53880))//判断搜台是否准确的依据(在这里设置了一个范围来提高搜台数量减少漏台,但是实质范围过大将会搜到很多的假台)
{
b[0]=in0.in0.frq>>8;
b[1]=in0.in0.frq;
if(reuse==reuse_waite)
{
goto likai;
}
wrnbyt(0xa0,ab*2,2,b); //将搜到的电台存储起来
//rdnbyt(0xa0,ab*2,2,a);//此语句为校验写入的和读出的是否相同
ab=ab+1;
}
if(tuni&&tund)
key_long=1;
if(key_long)
if(!tuni||!tund)
{
key_long=0;
goto likai;
}
if(remkey==0xed||remkey==0x1d)
{
remkey=0;
goto likai;
}
if(remkey==0xb5)
{
remkey=0x27;
mute_(off);
return;
}
}
}
likai:
remkey=0x00;
tai=0x00;
mute_(off);
if (reuse==reuse_seach)
{
remkey=0xef;
b[0]=0xaa;
b[1]=0xaa;
if(band==fm)
wrnbyt(0xa0,ab*2,2,b);
else
wrnbyt(0xa0,ab*2+120,2,b);
ab=0;
}
}
void volcheack(void)
{
uchar a;
voli=1;
vold=1;
if(!funp)
{
while(!funp);
remkey=0xdf;
return;
} //功能按键检测
if(!dvd_tv)
{
while(!dvd_tv);
remkey=0xf4;
return;
} //功能按键检测
if((band!=dvd)&&(band!=tape)&&(band!=tv))
{
if(!next)
{
while(!next);
remkey=0xef;
return;
} //步进一个电台频率
if(!pre)
{
delaytime(10);
while(!pre);
remkey=0x85;
return;
} //步退一个电台频率
if(!memory_key)
{
delaytime(400);
while(!memory_key);
remkey=0x47;
return;
} //存储电台频率
if(!band_key)
{
delaytime(400);
while(!band_key);
remkey=0x78;
return;
} //波段转换函数
}
if(!power_key)
{
delaytime(400);
while(!power_key);
power_l=~power_l;
if(power_l)
remkey=0x99;
else
remkey=0x98;
return;
} //电源处理
if(!eq)
{
delaytime(400);
while(!eq);
remkey=0x97;
return;
} //波段转换函数
/* if(!mute_key)
{
delaytime(400);
while(!mute_key);
if(!mute_l)
{
mute_l=~mute_l;
mute_(on);
}
else
{
mute_l=~mute_l;
mute_(off);
remkey=0x00;
}
return;
}
*/
if(tuni&&tund)
key_sta=0;//按键释放检测
if(band!=dvd&&band!=tape)
{
if(!key_sta)
{
if(!tuni)//步进一个电台频率
{
delaytime(400);
key_sta=key();
if(key_sta)
remkey=0x34;//短按:步进一个电台频率
else
remkey=0x77;//常按:向前搜索一个电台并停止
}
if(!tund)//步退一个电台频率
{
delaytime(400);
key_sta=key();
if(key_sta)
remkey=0x33;//短按:步退一个电台频率
else
remkey=0x55;//常按:向后搜索一个电台并停止
}
}
}
if(voli&&vold)//音量编码器开始
{
for(a=0;a<3;a++)
{
if(!(voli&&vold))
{
start=0;
return;
}
}
start=1;
return;
}
if(start)
{
start=0;
delaytime(100);
if(voli==0)
{
remkey=0x65;
return;
}
delaytime(100);
if
(vold==0)
{
remkey=0x64;
return;
}
}//音量编码器结束
}
void sys_ini()
{
delaytime(50000);
inidelay(); //初始定时中断资源
rdnbyt(0xa0,add_band,1,&test_iic_rd);
band=test_iic_rd; //初始化波段为调频
inivfd(); //初始化VFD显示
vfd_clean(); //清屏
// fun_power=power_radio; //电源为收音
// fun_vfd=vfd_radio; //VFD控制给收音
// mute=off;
// mute_(off);
rdnbyt(0xa0,add_volume,1,&test_iic_rd);
volume=test_iic_rd;
rdnbyt(0xa0,add_tai,1,&test_iic_rd);
ab=test_iic_rd;
tai=test_iic_rd;
rdnbyt(0xa0,add_eq,1,&test_iic_rd);
eq=test_iic_rd;
// channel(radio_fun);
// band_change();
if(band==am||band==fm)
{
band=tape;
dvd_tv_ch() ;
}
else if(band==tape)
{
band=fm;
dvd_tv_ch() ;
}
else if(band==dvd)
{
band=tv;
band_change();
}
else if(band==tv)
{
band=dvd;
band_change();
}
volume--;
sub_vol(up);
wr_pt2313(0x80);
wr_pt2313(0xa0);
wr_pt2313(0xc0);
wr_pt2313(0xe0);
}
void pub() //异常处理:初始化最底频率
{
if(in0.in0.frq==0x0230)
in0.in0.frq=0x0a30;
if(in0.in0.frq==0x0398)
in0.in0.frq=0x0d98;
if(in0.in0.frq==0x85e0)
in0.in0.frq=0x45e0;
if(in0.in0.frq==0xe290)
in0.in0.frq=0x6290;
}
bit key() //开关机处理
{
uint b;
uchar a;
for(a=0;a<75;a++)
for(b=0;b<1000;b++)
{
if((tuni)&&(tund))
return(off);
}
return(on);
}
void mute_(bit fun)
{
if(fun==on) //静音处理
{
wr_pt2313(0xdf);
wr_pt2313(0xff);
}
else if(fun==off)
{
wr_pt2313(0x80);
wr_pt2313(0xa0);
wr_pt2313(0xc0);
wr_pt2313(0xe0);
wr_pt2313((0x3f&(63-volume)));
}
}
void radio_change() //调频调幅转换
{
if((band==am)||(band==fm))
{
if(band==fm)
band=am;
else if(band==am)
band=fm;
fun_power=power_radio;//电源为收音
fun_vfd=vfd_radio; //VFD控制给收音
channel(radio_fun);
vfd_clean(); //清屏
if(band==fm)
ab=ab_fm;
else
ab=ab_am;
iniband();
if(band==fm)
rdnbyt(0xa0,ab*2,2,a); //经过IIC总线调出硬件地址为0XA0,子地址为tai*2的24C02中的数据高第一字节放在A[0]中第二字节放在A[1]中
else
rdnbyt(0xa0,ab*2+120,2,a);
in0.in0.frq=a[0];
in0.in0.frq=(in0.in0.frq<<8)|(0x00ff&a[1]);//将调出的两个字节频率值付给in0.in0.frq
iniband1(band); //初始化具体波段的私有部分
e=stepserch(1,in0.in0.frq); //加载频率
display(); //更新显示
remkey=0x00;
remkey=0;
}
remkey=0;
}
void inieeprom() //初始化EPROM 因为不初试华,在第一次使用时候收音会错乱
{
test_iic_wr='z';
wrnbyt(0xa0,add_la_1,1,&test_iic_wr);
test_iic_wr='t';
wrnbyt(0xa0,add_la_2,1,&test_iic_wr);
test_iic_wr='y';
wrnbyt(0xa0,add_la_3,1,&test_iic_wr);
test_iic_wr=48;
wrnbyt(0xa0,add_volume,1,&test_iic_wr);
test_iic_wr=dvd;
wrnbyt(0xa0,add_band,1,&test_iic_wr);
test_iic_wr=1;
wrnbyt(0xa0,add_eq,1,&test_iic_wr);
test_iic_wr=1;
wrnbyt(0xa0,add_tai,1,&test_iic_wr);
in0.in0.frq=0x0a30;
b[0]=in0.in0.frq>>8;
b[1]=in0.in0.frq;
for(ab=0;ab<50;ab++)
wrnbyt(0xa0,ab*2+120,2,b); //把所有频率初始为最低,87。5MHZ
in0.in0.frq=0x35e0;
b[0]=in0.in0.frq>>8;
b[1]=in0.in0.frq;
for(ab=0;ab<50;ab++)
wrnbyt(0xa0,ab*2,2,b);
}
void save_eeprom() //保存现在的音量 音调 音色 台位 功能位 等数据
{
test_iic_wr=eq;
wrnbyt(0xa0,add_eq,1,&test_iic_wr);
test_iic_wr=volume;
wrnbyt(0xa0,add_volume,1,&test_iic_wr);
test_iic_wr=band;
wrnbyt(0xa0,add_band,1,&test_iic_wr);
test_iic_wr=ab;
wrnbyt(0xa0,add_tai,1,&test_iic_wr);
}
/*
注意:
(1)遥控发射芯片用TC9012/TC9243
经常用到的还有UPD6121和LC7461,它们的不同只处在于引导码的时间不同或者数据位的个数不同,接受原理基本一样。将本程序的相关位置修改就可以通用。
系统时钟22.1184MHZ,如果用其他的时钟请将delay.c文件中的定时器装载值修改一下
(2)
键盘检测在VFD程序中,16312可以驱动VFD,另外外部可接24个按键,并将按键值放到
其内部的存储中,使用时只须发命令读即可。
(3)
由于时间原因,只给出调幅波段的自动搜台功能,调频的自动搜台程序和调幅一样,自己写了。
(4)主要用在组合机和功放机上的收音头大部分以LC72171做锁象环,LA1823做高中频处理
和音频解调,但是有的数调收音头把锁象环和高频处理做在一起,典型的有TEA5757和TEA5756
TEA5757采用了一种所谓的自动调谐系统,在自动搜索时无须读中频,简化了程序。
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -