#include "STC15F2K60S2.h"
#define read_add 0x23 //5820读地址
#define write_add 0x22 //5820写地址
//定义管脚名称//
sbit en=P2^2;
sbit rw=P2^3;
sbit rs=P2^4;
sbit d0=P3^2;
sbit d1=P3^3;
sbit d2=P3^4;
sbit d3=P3^5;
sbit d4=P3^6;
sbit d5=P3^7;
sbit d6=P2^0;
sbit d7=P2^1;
sbit scl=P1^3;
sbit sda=P1^2;
sbit led=P2^5;
sbit s1=P2^6;
sbit s2=P2^7;
sbit s3=P1^0;
sbit s4=P1^1;
sbit s5=P1^4;
sbit shdn=P1^5;
/定义显示数组///
unsigned char code dis_table_num[]="0123456789";
unsigned char code dis_table_rx[]="Receiver";
unsigned char code dis_table_tx[]="Transmitter";
unsigned char code dis_table_start[]=" Welcome ";
unsigned char code dis_table_wait[]=" .............. ";
unsigned char code dis_table_sens[]="Seek Threshold";
unsigned char code dis_table_banda[]="Set Band";
unsigned char code dis_table_bandb[]=" 87-108 MHz ";
unsigned char code dis_table_bandc[]=" 76-91 MHz ";
unsigned char code dis_table_bandd[]=" 76-108 MHz ";
/delay//
void delay_ms(unsigned int num) //延时1ms
{
unsigned int i,c;
for(i=num;i>0;i--)
for(c=70;c>0;c--);
}
void delay_nop()
{;;;;}
//
/*************************1602 Start***********************/
void write_com_1602(unsigned char com) //写入命令 1602
{
unsigned char temp;
temp=com;
rs=0;
temp=temp<<1;
d7=CY;
temp=temp<<1;
d6=CY;
temp=temp<<1;
d5=CY;
temp=temp<<1;
d4=CY;
temp=temp<<1;
d3=CY;
temp=temp<<1;
d2=CY;
temp=temp<<1;
d1=CY;
temp=temp<<1;
d0=CY;
delay_ms(5);
en=1;
delay_ms(5);
en=0;
}
void write_data_1602(unsigned char dt) //写入数据 1602
{
unsigned char temp;
temp=dt;
rs=1;
temp=temp<<1;
d7=CY;
temp=temp<<1;
d6=CY;
temp=temp<<1;
d5=CY;
temp=temp<<1;
d4=CY;
temp=temp<<1;
d3=CY;
temp=temp<<1;
d2=CY;
temp=temp<<1;
d1=CY;
temp=temp<<1;
d0=CY;
delay_ms(5);
en=1;
delay_ms(5);
en=0;
}
void init_1602(void) //初始化1602
{
en=0;
rw=0;
rs=0;
write_com_1602(0x38);
write_com_1602(0x0c);
write_com_1602(0x06);
write_com_1602(0x01);
}
/************************1602 Stop********************************/
/***************************IIC Start***************************/
void iic_init(void) //iic初始化
{
sda=1;
delay_nop();
scl=1;
delay_nop();
}
void iic_strat(void) //iic开始
{
scl=1;
delay_nop();
sda=1;
delay_nop();
sda=0;
delay_nop();
}
void iic_stop(void) //iic停止
{
sda=0;
delay_nop();
scl=1;
delay_nop();
sda=1;
delay_nop();
}
void iic_ack(void) //应答
{
scl=0;
delay_nop();
sda=0;
delay_nop();
delay_nop();
scl=1;
delay_nop();
scl=0;
}
void iic_noack(void) //无应答
{
scl=0;
delay_nop();
sda=1;
delay_nop();
delay_nop();
scl=1;
delay_nop();
scl=0;
}
void iic_respons(void) //等待iic响应
{
unsigned char i;
sda=1;
delay_nop();
scl=1;
delay_nop();
while((sda==1)&&(i<250))
{i++;}
scl=0;
delay_nop();
}
void iic_respons_int(void) //等待iic响应,中断专用
{
unsigned char i;
sda=1;
delay_nop();
scl=1;
delay_nop();
while((sda==1)&&(i<250))
{i++;}
scl=0;
delay_nop();
}
void write_byte_iic(unsigned char dt) //写一个字节iic数据
{
unsigned char temp,i;
temp=dt;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay_nop();
sda=CY;
delay_nop();
scl=1;
delay_nop();
}
scl=0;
delay_nop();
sda=1;
delay_nop();
}
unsigned char read_byte_iic(void) //读一个字节iic数据
{
unsigned int i,dt;
scl=0;
delay_nop();
sda=1;
delay_nop();
for(i=0;i<8;i++)
{
scl=1;
delay_nop();
dt=(dt<<1)|sda;
scl=0;
delay_nop();
}
delay_nop();
delay_nop();
return dt;
}
unsigned char read_byte_iic_int(void) //读一个字节iic数据,中断专用
{
unsigned int i,dt;
scl=0;
delay_nop();
sda=1;
delay_nop();
for(i=0;i<8;i++)
{
scl=1;
delay_nop();
dt=(dt<<1)|sda;
scl=0;
delay_nop();
}
delay_nop();
delay_nop();
return dt;
}
/***************************IIC Stop**********************/
/**********************RDA5820 Start**********************/
void write5820(unsigned char addr,unsigned int dt) //写如rda5820数据
{
iic_strat();
write_byte_iic(write_add);
iic_respons();
write_byte_iic(addr);
iic_respons();
write_byte_iic(dt>>8);
iic_respons();
write_byte_iic(dt&0xff);
iic_respons();
iic_stop();
}
unsigned int read5820(unsigned char addr) //读取rda5820数据
{
unsigned int res;
iic_strat();
write_byte_iic(write_add);
iic_respons();
write_byte_iic(addr);
iic_respons();
delay_ms(5);
iic_strat();
write_byte_iic(read_add);
iic_respons();
res=read_byte_iic();
iic_ack();
res<<=8;
res|=read_byte_iic();
iic_noack();
iic_stop();
return res;
}
unsigned int read5820_int(unsigned char addr) //读取rda5820数据,中断专用
{
unsigned int res;
iic_strat();
write_byte_iic(write_add);
iic_respons_int();
write_byte_iic(addr);
iic_respons_int();
delay_ms(5);
iic_strat();
write_byte_iic(read_add);
iic_respons_int();
res=read_byte_iic_int();
iic_ack();
res<<=8;
res|=read_byte_iic_int();
iic_noack();
iic_stop();
return res;
}
void rda5820mode_rx() //接收模式
{
unsigned int temp;
temp=read5820(0x40);
temp&=0xfff0;
write5820(0x40,temp);
}
void rda5820mode_tx() //发射模式
{
unsigned int temp;
temp=read5820(0x40);
temp&=0xfff0;
temp|=0x0001;
write5820(0x40,temp);
}
void rda5820_set_vol(unsigned char vol) //设置音量
{
unsigned int temp;
temp=read5820(0x05);
temp&=0xfff0;
temp|=vol&0x0f;
write5820(0x05,temp);
}
void rda5820_set_rssi(unsigned char rssi) //设置灵敏度 0~127
{
unsigned int temp;
temp=read5820(0x05);
temp&=0X80FF;
temp|=(unsigned int)rssi<<8;
write5820(0x05,temp);
}
unsigned char rda5820_get_sens(void) //读取灵敏度 0~127
{
unsigned int temp;
temp=read5820(0x05);
temp=temp>>8;
temp=temp&0x007f;
return (unsigned char)temp;
}
void rda5820_set_tx_power(unsigned char gain) //设置发射功率 0~63
{
unsigned int temp;
temp=read5820(0x42);
temp&=0xffc0;
temp|=gain;
write5820(0x42,temp);
}
void rda5820_set_tx_input_gain(unsigned char gain) //设置发射时输入信号增益 0~7
{
unsigned int temp;
temp=read5820(0x42);
temp&=0xf8ff;
temp|=gain<<8;
write5820(0x42,temp);
}
void rda5820_set_band(unsigned char band) //设置工作频段 band:0,87~108Mhz;1,76~91Mhz;2,76~108Mhz;3,用户自定义(53H~54H)
{
unsigned int temp;
temp=read5820(0x03);
temp&=0xfff3;
temp|=band<<2;
write5820(0x03,temp);
}
unsigned char rda5820_get_band(void) //读取工作频段
{
unsigned char band;
unsigned int temp;
temp=read5820(0X03);
temp&=0x000c;
band=(temp>>2)&0x03;
//if(band==0)fbtm=870;
//else if(band==1||band==2)fbtm=760;
return band;
}
/**************未使用*保留***************
void rda5820_set_space(unsigned char spc) //设置自动搜索步进频率 band:0,100Khz;1,200Khz;3,50Khz;3,保留
{
unsigned int temp;
temp=read5820(0x03);
temp&=0xfffc;
temp|=spc;
write5820(0x03,temp);
}
*********************************/
void rda5820_set_freq(unsigned int freq) //设置RDA5820的频率 (单位为100Khz),比如1080,表示108.0Mhz
{
unsigned int temp;
unsigned char spc=0,band=0;
unsigned int fbtm,chan;
temp=read5820(0X03);
temp&=0x000F;
band=(temp>>2)&0x03;
spc=temp&0x03;
if(spc==0)spc=100;
else if(spc==1)spc=200;
else spc=50;
if(band==0)fbtm=870;
else if(band==1||band==2)fbtm=760;
else
{
fbtm=read5820(0X53);
fbtm*=10;
}
if(freq<fbtm)return;
chan=((freq-fbtm)*100)/spc;
chan&=0X03FF;
temp|=chan<<6;
temp|=1<<4; //开启调谐
write5820(0X03,temp) ; //设置频率
delay_ms(20); //等待20ms
//while((read5820(0X0B)&(1<<7))==0);//等待FM_READY
}
unsigned int rda5820_get_freq(void) //得到当前频率(单位100Khz)
{
unsigned int temp;
unsigned char spc=0,band=0;
unsigned int fbtm,chan;
temp=read5820(0X03);
chan=temp>>6;
band=(temp>>2)&0x03;
spc=temp&0x03;
if(spc==0)spc=100;
else if(spc==1)spc=200;
else spc=50;
if(band==0)fbtm=870;
else if(band==1||band==2)fbtm=760;
else
{
fbtm=read5820(0X53);
fbtm*=10;
}
temp=(chan*spc)/100+fbtm;
return temp;//返回频率值
}
bit rda5820_init(void) //初始化5820
{
unsigned int id;
iic_init(); //初始化IIC口
id=read5820(0x00); //读取ID =0X5805
if(id==0x5805) //读取ID正确
{
write5820(0x02,0x0002); //芯片软复位
delay_ms(400);//等待复位结束
write5820(0x02,0x0001);//芯片上电
delay_ms(600);
write5820(0x02,0xD201); //芯片上电,不复位 正常天线 32.768时钟 循环搜索 不开始搜索 向上搜索 低音增强 立体声 非静音 非高阻抗
write5820(0x03,0x0000);//100k apace 87-108baud 不开启调谐
write5820(0x04,0x0800);//关闭中断 50us去加重 不使能iis io口全部浮空
write5820(0x05,0x88a0);//搜索阙值8,LNAN,1.8mA,VOL最大 无输入低噪声
// write5820(0x0a,0X7800);//0A不用设置
// write5820(0x0b,0X7800);//0b不用设置
write5820(0x40,0x0000);//半自动搜台 RX工作模式
//write5820(0x41,0x0000);//RDS应答为0 不复位fifo fifo深度为0
// write5820(0x42,0X0000);//42不用设置
write5820(0x4a,0x0010);//fifo满中断
rda5820_set_freq(870);//设置初始化频率87.00M
}
else return 1;//初始化失败
return 0;
}
void rda_seek(bit num) //自动搜台,有点小问题,向上和向下傻傻分不清楚,暂未找到原因
{
unsigned int temp;
unsigned int count=0;
temp=read5820(0x02); //读取0X02的内容
if(num==1) //向上搜索
{
temp|=0x0381;
write5820(0x02,temp) ; //开始搜台
do
{
delay_ms(20);
temp=read5820(0x02);//读取搜台结果
temp&=0x0381;
count++;
if(count>5000)return;
}
while(temp==0x0381);
}
else //向下搜索
{
temp|=0x0181;
write5820(0x02,temp) ; //开始搜台
do
{
delay_ms(20);
temp=read5820(0x02);//读取搜台结果
temp&=0x0181;
count++;
if(count>5000)return;
}
while(temp==0x0181);
}
}
/*****************************5820 end******************************/
/******************************display*******************************/
void dis_clear(bit num) //空格清屏
{
unsigned char i;
if(num==1)
{
write_com_1602(0x80);
for(i=0;i<16;i++)
{
write_data_1602(' ');
}
write_com_1602(0xc0);
for(i=0;i<16;i++)
{
write_data_1602(' ');
}
}
else
{
write_com_1602(0x81);
for(i=0;i<4;i++)
{
write_data_1602(' ');
}
}
}
void start()//显示开机字母
{
unsigned char i;
write_com_1602(0x80);
for(i=0;i<16;i++)
{
write_data_1602(dis_table_start[i]);
delay_ms(1000);
}
write_com_1602(0xc0);
for(i=0;i<16;i++)
{
write_data_1602(dis_table_wait[i]);
delay_ms(800);
}
}
void dis_wait() //显示‘......’
{
unsigned char i;
dis_clear(1);
write_com_1602(0xc0);
for(i=0;i<16;i++)
{
write_data_1602(dis_table_wait[i]);
delay_ms(300);
}
}
void dis_menu(bit num)//显示主菜单
{
unsigned char i;
dis_clear(1);
write_com_1602(0x84);
for(i=0;i<8;i++)
{
write_data_1602(dis_table_rx[i]);
}
write_com_1602(0xc3);
for(i=0;i<11;i++)
{
write_data_1602(dis_table_tx[i]);
}
if(num==0)
{
write_com_1602(0x83);
write_data_1602('>');
write_com_1602(0xc2);
write_data_1602(' ');
}
else
{
write_com_1602(0x83);
write_data_1602(' ');
write_com_1602(0xc2);
write_data_1602('>');
}
}
void dis_volume() //显示音量
{
unsigned char volume;
volume=read5820(0x05);
volume=(volume&0x000f);
write_com_1602(0x8c);
write_data_1602('V');
write_data_1602(':');
write_data_1602(dis_table_num[(volume/10)]);
write_data_1602(dis_table_num[(volume%10)]);
}
void dis_mode(bit num) //显示工作模式,参数为1时发射,为0时接收
{
if(num==0)
{
write_com_1602(0x88);
write_data_1602('R');
write_data_1602('x');
}
else
{
write_com_1602(0x81);
write_data_1602('T');
write_data_1602('x');
}
}
void dis_fm_fre(bit flag) //显示频率 1为发射,0为接收
{
unsigned int fm_fre=0;
fm_fre=rda5820_get_freq();
if(flag==0)
{
write_com_1602(0xc3);
write_data_1602('F');
write_data_1602('M');
write_data_1602(':');
if((fm_fre/1000)>0) write_data_1602(dis_table_num[fm_fre/1000]);
else write_data_1602(' ');
write_data_1602(dis_table_num[(fm_fre%1000)/100]);
write_data_1602(dis_table_num[((fm_fre%100)/10)]);
write_data_1602('.');
write_data_1602(dis_table_num[fm_fre%10]);
write_com_1602(0xcd);
write_data_1602('M');
write_data_1602('H');
write_data_1602('z');
}
else
{
write_com_1602(0xc1);
write_data_1602('F');
write_data_1602('R');
write_data_1602('E');
write_data_1602('Q');
write_data_1602(':');
if((fm_fre/1000)>0) write_data_1602(dis_table_num[fm_fre/1000]);
else write_data_1602(' ');
write_data_1602(dis_table_num[(fm_fre%1000)/100]);
write_data_1602(dis_table_num[((fm_fre%100)/10)]);
write_data_1602('.');
write_data_1602(dis_table_num[fm_fre%10]);
write_data_1602(' ');
write_data_1602('M');
write_data_1602('H');
write_data_1602('z');
}
}
void dis_rssi() //显示信号强度
{
unsigned int rssi,temp;
temp=read5820_int(0x0b);
rssi=temp>>9;
write_com_1602(0x82);
delay_ms(5);
if((rssi/100)>0) write_data_1602(dis_table_num[rssi/100]);
if(((rssi%100)/10)>0) write_data_1602(dis_table_num[(rssi%100)/10]);
write_data_1602(dis_table_num[rssi%10]);
if((temp>>8)&0x0001==1) led=1; //fm tune,有效站台标志
else led=0;
}
void dis_clear_vfre(bit cle) //设置频率、音量切换,清屏
{
unsigned char i;
if(cle)
{
write_com_1602(0xc6);
for(i=0;i<5;i++)
{
write_data_1602(' ');
}
}
else
{
write_com_1602(0x8e);
for(i=0;i<2;i++)
{
write_data_1602(' ');
}
}
}
void dis_sens(unsigned char num) //显示自动搜索阙值 0~127
{
unsigned char i;
//dis_clear(1);
write_com_1602(0x81);
for(i=0;i<14;i++)
{
write_data_1602(dis_table_sens[i]);
}
write_com_1602(0xc6);
if(num/100>0) write_data_1602(dis_table_num[num/100]);
else write_data_1602(' ');
if((num%100)/10>0) write_data_1602(dis_table_num[(num%100)/10]);
else write_data_1602(' ');
write_data_1602(dis_table_num[num%10]);
}
void dis_band(unsigned char num) //显示工作频段
{
unsigned char i;
write_com_1602(0x84);
for(i=0;i<8;i++)
{
write_data_1602(dis_table_banda[i]);
}
if(num==0)
{
write_com_1602(0xc0);
for(i=0;i<16;i++)
{
write_data_1602(dis_table_bandb[i]);
}
}
else if(num==1)
{
write_com_1602(0xc0);
for(i=0;i<16;i++)
{
write_data_1602(dis_table_bandc[i]);
}
}
else if(num==2)
{
write_com_1602(0xc0);
for(i=0;i<16;i++)
{
write_data_1602(dis_table_bandd[i]);
}
}
else;
}
/************第一版程序设计,过于复杂,保留*********************
void dis_tx_input_gain(unsigned char num) //显示发射模式输入信号增益
{
unsigned char i;
write_com_1602(0x82);
for(i=0;i<13;i++)
{
write_data_1602(dis_table_input_gain[i]);
}
write_com_1602(0xc7);
write_data_1602(dis_table_num[num]);
}
void dis_tx_power(unsigned char num) //显示发射模式功率设置
{
unsigned char i;
write_com_1602(0x82);
for(i=0;i<12;i++)
{
write_data_1602(dis_table_power[i]);
}
write_com_1602(0xc7);
if((num/10)>0) write_data_1602(dis_table_num[num/10]);
else write_data_1602(' ');
write_data_1602(dis_table_num[num%10]);
}
****************************************************************/
/***********************display end******************************/
//
unsigned char scan_key() //扫描按键 4键足够
{
unsigned char key_num=0;
/*if(s1==0) //未使用
{
delay_ms(10);
if(s1==0)
{
while(!s1);
key_num=1;
}
}*/
if(s2==0)
{
delay_ms(10);
if(s2==0)
{
while(!s2);
key_num=2;
}
}
else if(s3==0)
{
delay_ms(10);
if(s3==0)
{
while(!s3);
key_num=3;
}
}
else if(s4==0)
{
delay_ms(10);
if(s4==0)
{
while(!s4);
key_num=4;
}
}
else if(s5==0)
{
delay_ms(10);
if(s5==0)
{
while(!s5);
key_num=5;
}
}
else key_num=0;
return key_num;
}
void function() interrupt 1 //中断显示信号强度
{
TH0 = (65536 - 20000) / 256;
TL0 = (65536 - 20000) % 256;
dis_rssi();
}
void main(void)
{
unsigned int fm_fre=0,fre_h,fre_l;
unsigned char vol=1,key_num,vfm,sens,band,input_gain=1,tx_power=1;
bit seek_mode=0,select=0,tf,tf_a,tf_s,tf_bd,rda_init;
TMOD = 0x01;//设置定时器0 工作方式0
TH0 = (65536 - 20000) / 256;//载入高8位初值
TL0 = (65536 - 20000) % 256;//载入低8位初值
ET0 =1;//开定时器中断。为0则表示关闭!
TR0 =1; //启动定时器
EA =0;//关总中断
led=0;
shdn=0;
init_1602();
start();
iic_init();
rda_init=rda5820_init();
while(rda_init);
dis_clear(1);
dis_menu(0);
key_num=0;
while(1)
{
key_num=scan_key();
if(key_num==2)
{
tf=1;
if(select==0) //接收模式
{
EA=0;
rda5820mode_rx(); //设置rda5820为接受
dis_wait();
tf_bd=1;
dis_clear(1);
band=rda5820_get_band();
while(tf_bd) //选择工作频段
{
key_num=scan_key();
band+=1; //unsigned char 无符号无小于0的情况,所以作加1运算
if(key_num==2)
{
tf_bd=0;
key_num=0;
}
if(key_num==4)
{
band+=1;
if(band>3) band=3;
key_num=0;
}
if(key_num==5)
{
band-=1;
if(band<1) band=1;
key_num=0;
}
band-=1; //处理完后作减1运算
dis_band(band);
}
rda5820_set_band(band); //设置工作频段
if(band==0) fm_fre=870;
else if(band==1||band==2) fm_fre=760;
else;
rda5820_set_freq(fm_fre); //初始频率
tf_s=1;
dis_clear(1);
sens=rda5820_get_sens(); //读取rda5820自动搜索阙值
while(tf_s) //调整自动搜索阙值rssi
{
key_num=scan_key();
if(key_num==2)
{
tf_s=0;
key_num=0;
}
if(key_num==4)
{
sens++;
if(sens>127) sens=1;
key_num=0;
}
if(key_num==5)
{
sens--;
if(sens<1) sens=127;
key_num=0;
}
dis_sens(sens);
}
rda5820_set_rssi(sens); //设置搜索阙值
dis_clear(1);
write_com_1602(0x80);
write_data_1602('L');
write_data_1602(':');
dis_mode(select);
rda5820_set_vol(vol);
dis_volume();
dis_fm_fre(0);
delay_ms(20);
shdn=1; //开启pam8403
EA=1; //开启中断
while(tf) //rx工作模式
{
key_num=scan_key();
if(key_num==2) //手动调频与音量调整
{
tf_a=1;
EA=0;
vfm=0;
write_com_1602(0xc8);
write_com_1602(0x0f); //开启光标,光标闪烁
fm_fre=rda5820_get_freq();
while(tf_a) //手动调频
{
key_num=scan_key();
if(key_num==2) //调频与音量切换
{
vfm++;
if(vfm>2) vfm=0;
key_num=0;
}
if(vfm==0) //调频 步进1M khz
{
if(band==0) //根据工作频段设置频率上下限
{
fre_h=1080;
fre_l=870;
}
else if(band==1)
{
fre_h=910;
fre_l=760;
}
else
{
fre_h=1080;
fre_l=760;
}
write_com_1602(0xc8);
if(key_num==4)
{
fm_fre+=10;
if(fm_fre>fre_h) fm_fre=fre_l;
rda5820_set_freq(fm_fre);
dis_clear_vfre(1);
dis_fm_fre(0);
key_num=0;
}
if(key_num==5)
{
fm_fre-=10;
if(fm_fre<fre_l) fm_fre=fre_h;
rda5820_set_freq(fm_fre);
dis_clear_vfre(1);
dis_fm_fre(0);
key_num=0;
}
}
if(vfm==1) //调频 步进0.1M khz
{
write_com_1602(0xca);
if(key_num==4)
{
fm_fre+=1;
if(fm_fre>fre_h) fm_fre=fre_l;
rda5820_set_freq(fm_fre);
dis_clear_vfre(1);
dis_fm_fre(0);
key_num=0;
}
if(key_num==5)
{
fm_fre-=1;
if(fm_fre<fre_l) fm_fre=fre_h;
rda5820_set_freq(fm_fre);
dis_clear_vfre(1);
dis_fm_fre(0);
key_num=0;
}
}
if(vfm==2) //调整音量
{
write_com_1602(0x8f);
if(key_num==4)
{
vol+=1;
if(vol>15) vol=15;
rda5820_set_vol(vol);
dis_clear_vfre(0);
dis_volume();
key_num=0;
}
if(key_num==5)
{
vol-=1;
if(vol<1) vol=1;
rda5820_set_vol(vol);
dis_clear_vfre(0);
dis_volume();
key_num=0;
}
}
if(key_num==3) //返回
{
tf_a=0;
write_com_1602(0x0c); //关闭光标
key_num=0;
EA=1;
}
}
}
if(key_num==3) //返回主菜单,其实这里应该设置rda静音并掉电,本人懒,不写了
{
EA=0;
tf=0;
shdn=0; //关闭pam8403
dis_menu(select);
key_num=0;
}
if(key_num==4) //自动向上搜索
{
EA=0;
shdn=0;
led=0;
dis_clear(1);
dis_wait();
rda_seek(1);
dis_clear(1);
write_com_1602(0x80);
write_data_1602('L');
write_data_1602(':');
dis_mode(select);
dis_volume();
dis_fm_fre(0);
shdn=1;
EA=1;
key_num=0;
}
if(key_num==5) //自动向下搜索
{
EA=0;
shdn=0;
led=0;
dis_clear(1);
dis_wait();
rda_seek(0);
dis_clear(1);
write_com_1602(0x80);
write_data_1602('L');
write_data_1602(':');
dis_mode(select);
dis_volume();
dis_fm_fre(0);
shdn=1;
EA=1;
key_num=0;
}
}
}
if(select==1) //发射模式
{
EA=0;
tf_bd=1;
shdn=0;
led=0;
rda5820mode_tx(); //设置rda5820为发射模式
dis_clear(1);
dis_wait();
dis_clear(1);
band=rda5820_get_band();
while(tf_bd) //设置工作频段
{
key_num=scan_key();
band+=1; //unsigned char 无符号,所以作加1运算
if(key_num==2)
{
tf_bd=0;
key_num=0;
}
if(key_num==4)
{
band+=1;
if(band>3) band=3;
key_num=0;
}
if(key_num==5)
{
band-=1;
if(band<1) band=1;
key_num=0;
}
band-=1; //处理完后作减1运算
dis_band(band);
}
rda5820_set_band(band);
if(band==0) fm_fre=870;
else if(band==1||band==2) fm_fre=760; //根据频段设置初始频率
else;
rda5820_set_freq(fm_fre);
dis_clear(1);
dis_mode(select);
write_com_1602(0x86);
write_data_1602('G');
write_data_1602(':');
write_data_1602(dis_table_num[input_gain%10]);
write_data_1602(' ');
write_data_1602(' ');
write_data_1602(' ');
write_data_1602('P');
write_data_1602(':');
if((tx_power/10)>0) write_data_1602(dis_table_num[tx_power/10]);
write_data_1602(dis_table_num[tx_power%10]);
dis_fm_fre(1);
delay_ms(20);
while(tf)
{
key_num=scan_key();
if(key_num==2) //调整发射频率
{
tf_a=1;
EA=0;
vfm=0;
write_com_1602(0xc8);
write_com_1602(0x0f);
fm_fre=rda5820_get_freq();
while(tf_a)
{
key_num=scan_key();
if(key_num==2)
{
vfm++;
if(vfm>3) vfm=0;
key_num=0;
}
if(vfm==0) //调整频率
{
if(band==0)
{
fre_h=1080;
fre_l=870;
}
else if(band==1)
{
fre_h=910;
fre_l=760;
}
else;
write_com_1602(0xc8);
if(key_num==4)
{
fm_fre+=10;
if(fm_fre>fre_h) fm_fre=fre_l;
rda5820_set_freq(fm_fre);
dis_clear_vfre(1);
dis_fm_fre(1);
key_num=0;
}
if(key_num==5)
{
fm_fre-=10;
if(fm_fre<fre_l) fm_fre=fre_h;
rda5820_set_freq(fm_fre);
dis_clear_vfre(1);
dis_fm_fre(1);
key_num=0;
}
}
if(vfm==1) //调整频率
{
write_com_1602(0xca);
if(key_num==4)
{
fm_fre+=1;
if(fm_fre>fre_h) fm_fre=fre_l;
rda5820_set_freq(fm_fre);
dis_clear_vfre(1);
dis_fm_fre(1);
key_num=0;
}
if(key_num==5)
{
fm_fre-=1;
if(fm_fre<fre_l) fm_fre=fre_h;
rda5820_set_freq(fm_fre);
dis_clear_vfre(1);
dis_fm_fre(1);
key_num=0;
}
}
if(vfm==2) //调整输入信号增益 0-7
{
write_com_1602(0x88);
if(key_num==4)
{
input_gain+=1;
if(input_gain>7) input_gain=7;
rda5820_set_tx_input_gain(input_gain);
write_data_1602(dis_table_num[input_gain%10]);
key_num=0;
}
if(key_num==5)
{
input_gain-=1;
if(input_gain<1) input_gain=1;
rda5820_set_tx_input_gain(input_gain);
write_data_1602(dis_table_num[input_gain%10]);
key_num=0;
}
}
if(vfm==3) //调整发射功率 0-63 -30dBm~3dBm
{
if((tx_power/10)>0) write_com_1602(0x8f);
else write_com_1602(0x8e);
if(key_num==4)
{
tx_power+=1;
if(tx_power>63) tx_power=1;
rda5820_set_tx_power(tx_power);
if((tx_power/10)>0) //光标移动
{
write_com_1602(0x0c);
write_com_1602(0x8e);
write_data_1602(dis_table_num[tx_power/10]);
write_data_1602(dis_table_num[tx_power%10]);
write_com_1602(0x0f);
}
else
{
write_com_1602(0x8e);
write_data_1602(dis_table_num[tx_power%10]);
write_data_1602(' ');
}
key_num=0;
}
if(key_num==5)
{
tx_power-=1;
if(tx_power<1) tx_power=63;
rda5820_set_tx_power(tx_power);
if((tx_power/10)>0)
{
write_com_1602(0x0c);
write_com_1602(0x8e);
write_data_1602(dis_table_num[tx_power/10]);
write_data_1602(dis_table_num[tx_power%10]);
write_com_1602(0x0f);
}
else
{
write_com_1602(0x8e);
write_data_1602(dis_table_num[tx_power%10]);
write_data_1602(' ');
}
key_num=0;
}
}
if(key_num==3) //推出设定,关闭光标
{
tf_a=0;
write_com_1602(0x0c);
key_num=0;
}
}
}
if(key_num==3) //返回主菜单
{
tf=0;
rda5820mode_rx(); //将rda5820置为接收模式
dis_menu(select);
key_num=0;
}
}
}
}
if(key_num==4) //选择功能
{
select=0;
dis_menu(0);
key_num=0;
}
if(key_num==5)
{
select=1;
dis_menu(1);
key_num=0;
}
}
}
51单片机收音机代码
于 2024-05-26 22:12:24 首次发布