📄 radio.c
字号:
#include "at8xc51snd1.h"
#include "system.h"
#include "radio.h"
#include "twi.h"
#include "lcd.h"
/////////////////////// 发送数据位到收音模块 /////////////////////////////
void out(uchar dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
delayus();
RADI0_CL=0; //清收音模块时钟口
if(dat & 0x01) //数据口
RADI0_DI=1;
else
RADI0_DI=0;
delayus();
RADI0_CL=1; //收音模块时钟口置高
dat=dat>>1;
}
}
//////////////////////////// 读中频 /////////////////////////////////////
ulong in_data(void)
{
uchar i=0;
ulong temp=0;
RADI0_DO=1;
RADI0_CE=0; //清选择口
out(FM_MOD3);
RADI0_CE=1; //置位选择口
delayms(5);
for(i=0;i<24;i++)
{
temp=temp<<1;
RADI0_CL=0;
delayus();
if(RADI0_DO)
temp++;
RADI0_CL=1; //时钟口置高
delayus();
}
RADI0_CE=0; //清选择口
return temp;
}
/////////////////////// 发送数据位到收音模块 /////////////////////////////
void out_data(uchar dat1,uchar dat2,uchar dat3,uchar dat4)
{
RADI0_CE=0; //清选择口
out(dat1); //模式选择-FM_MODE1;FM_MODE2;FM_MODE3;
RADI0_CE=1; //置位选择口
out(dat2);
out(dat3);
out(dat4);
RADI0_CE=0; //清选择口
}
void display_mute(uchar dat)
{
if(dat)
{
Sendlcd(1,12,0x2d); //M
Sendlcd(1,13,0x35); //U
Sendlcd(1,14,0x34); //T
Sendlcd(1,15,0x25); //E
}
else
{
Sendlcd(1,12,0x00);
Sendlcd(1,13,0x00);
Sendlcd(1,14,0x00);
Sendlcd(1,15,0x00);
}
}
void RADI0_DIsplay_VOLUME(uchar volume)
{
Sendlcd(1,0,0x36); //V
Sendlcd(1,1,0x2f); //O
Sendlcd(1,2,0x2c); //L
Sendlcd(1,3,0x00); //
Sendlcd(1,4,(30-volume)/10+0x10); //音量十位
Sendlcd(1,5,(30-volume)%10+0x10); //音量个位
Sendlcd(1,6,0x0f); // /
Sendlcd(1,7,0x13); //3
Sendlcd(1,8,0x10); //0
}
void RADI0_DIsplay(ulong dat)
{
Sendlcd(2,0,0x26); //F
Sendlcd(2,1,0x2d); //M
if(mode==fm1mode) Sendlcd(2,2,fm1mode+16); //1
else if(mode==fm2mode) Sendlcd(2,2,fm2mode+16);//2
else if(mode==fm3mode) Sendlcd(2,2,fm3mode+16);//3
Sendlcd(2,3,0x0d); //-
if(mode==fm1mode)
{
if(fm1_select>9)
{
Sendlcd(2,4,fm1_select/10+16);
Sendlcd(2,5,fm1_select%10+16);
}
else
{
Sendlcd(2,4,fm1_select%10+16);
Sendlcd(2,5,0);
}
}
else if(mode==fm2mode)
{
if(fm2_select>9)
{
Sendlcd(2,4,fm2_select/10+16);
Sendlcd(2,5,fm2_select%10+16);
}
else
{
Sendlcd(2,4,fm2_select%10+16);
Sendlcd(2,5,0);
}
}
else if(mode==fm3mode)
{
if(fm3_select>9)
{
Sendlcd(2,4,fm3_select/10+16);
Sendlcd(2,5,fm3_select%10+16);
}
else
{
Sendlcd(2,4,fm3_select%10+16);
Sendlcd(2,5,0);
}
}
if(dat>9999)
Sendlcd(2,7,dat/10000%10+16);
else
Sendlcd(2,7,0);
Sendlcd(2,8,dat/1000%10+16);
Sendlcd(2,9,dat/100%10+16);
Sendlcd(2,10,14);
Sendlcd(2,11,dat/10%10+16);
Sendlcd(2,12,dat%10+16);
Sendlcd(2,13,0x2d);
Sendlcd(2,14,0x28);
Sendlcd(2,15,0x5a);
}
void tunner_init(void)
{
out_data(FM_MOD1,188,8,0x2E);
delayms(100);
out_data(FM_MOD2,0X00,0x10,0x12);
delayms(100);
}
void auto_search(void)
{
uchar i=0;
uchar m,n;
out_data(FM_MOD2,0X00,0x10,0x12);
freq=freq_bot-1;
in_freq=0;
while(freq<freq_top)
{
while((in_freq<342400)|(in_freq>343000))
{
freq++;
if(freq>freq_top) break;
m=freq/256;
n=freq%256;
out_data(FM_MOD1,n,m,0x2a);
out_data(FM_MOD1,n,m,0x2e);
RADI0_DIsplay(freq*5-1070);
delayms(200);
in_freq=in_data();
}
in_freq=0;
if(freq<freq_top)
{
if(mode==fm1mode)
{
freq1[i]=freq;
fm1_tunners=i+1;
fm1_select=i+1;
}
else if(mode==fm2mode)
{
freq2[i]=freq;
fm2_tunners=i+1;
fm2_select=i+1;
}
else if(mode==fm3mode)
{
freq3[i]=freq;
fm3_tunners=i+1;
fm3_select=i+1;
}
}
Sendlcd(3,0,i/10+16);
Sendlcd(3,1,i%10+16);
i++;
if(i>20) break;
}
if(mode==fm1mode)
{
freq=freq1[0];
fm1_select=1;
}
else if(mode==fm2mode)
{
freq=freq2[0];
fm2_select=1;
}
else if(mode==fm3mode)
{
freq=freq3[0];
fm3_select=1;
}
m=freq/256;
n=freq%256;
RADI0_DIsplay(freq*5-1070);
out_data(FM_MOD1,n,m,0x2e);
out_data(FM_MOD2,0X40,0x10,0x12);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -