51单片机收音机代码

#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;
		}
	}
}




	
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蜗笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值