⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bu2624.c

📁 sunplus spca514 cdmp3 源码
💻 C
字号:
//Use SANYO LC72130 PLL Frequency Synthesizer  //dzh 2001/03/23
#include "..\main.h"
#include "..\bu1923\bu1923.h"
#define BU2624
//#define TEST_IF
#ifdef BU2624
#include <iom163.h>
#include "bu2624.h"
#include "..\io.h"
#pragma data:eeprom
NV_SETTINGS gps;
#pragma data:data
unsigned char search_dir;
extern void MCU_mute(void);
#ifdef SGJM_RDS
extern unsigned char rds_status;
extern unsigned char rds_display_type;
extern unsigned char display_type;
extern unsigned char rds_step,pty_is_searching;
extern RDS_DATA_STRUCT rds_data;
extern unsigned char rds_dis_string[65];
#endif
unsigned char rdelay20ms;
extern unsigned char g_ui_tmp_msg_cnt;
#ifdef TTY
extern BOOL key_is_pressed;
#endif
#define AM_BAND      1
static unsigned int dataout0;
static unsigned char dataout1;
static unsigned int  In_Pdata;
static unsigned int In_Cdata;
unsigned int radio_count;
extern unsigned char muted;
unsigned char radio_is_muted;
//unsigned int   FMreq_DIVIDER;
#include <eeprom.h>
unsigned char autosrch_step;
unsigned char search_ok;
		/*0--search is not ok
		 1-- search a station
		 2-- full search end;
		*/
//unsigned char radio_delay200ms;
unsigned char is_autosearching;
unsigned char is_stereo;
unsigned char   station_no;
unsigned char amfm_flag;
//unsigned char ok_count;
//unsigned char unok_count;
//#define  FM_SHIFT    1
unsigned int freq;
//unsigned long Ifcount;//Ifcount1;
void mute_radio(void);
//extern unsigned char radio_station_changed;
//unsigned char station_num;
#define IF_FM 1070
#define IF_AM 450

#define IF_CENTER   160
#define IFM_MIN (IF_FM*160-480+IF_CENTER)
#define IFM_MAX (IF_FM*160+480+IF_CENTER)

#define IAM_MIN (IF_AM*16-64)
#define IAM_MAX (IF_AM*16+64)

//void ps_restore_amfm();
//void ps_restore_station();
//void use_addr_as_io(void);
void switch_fmam(void);
#ifdef TTY
extern void wait_key_pressed(void);
#endif
void soft_delay(void)
{
   register unsigned char i;
   for(i=0;i<30;i++)
   {
   }
}

void init_radio(void)    //default MONO out
{
   
  //register unsigned char addr; 
   //set_dout_in();
   //radio_stb_lo();
   //radio_clk_hi();
   //AMreq_STEP = radio_country[gps->ps_radio_standard].AM_step;  
   //FMreq_STEP = radio_country[gps->ps_radio_standard].FM_step;  
   //unsigned int *addr;
   radio_is_muted = 1;
   mute_radio();
   delay_ms(100);
   amfm_flag=EEPROMread((int)&(gps.ps_amfm_flag));
   if(amfm_flag)
   {
   		station_no = EEPROMread((int)&(gps.ps_am_no));
		if(station_no>=MAX_AM_STATION)
		{
		  station_no = 0;
		  EEPROMwrite((int)&(gps.ps_am_no),0);
		};
		EEPROM_READ((int)&gps.ps_amfre,freq);
   	//station_no = gps.ps_am_no;
   }
   else
   {
   		station_no = EEPROMread((int)&(gps.ps_fm_no));
		if(station_no>=MAX_FM_STATION)
		{
		  station_no = 0;
		  EEPROMwrite((int)&(gps.ps_fm_no),0);
		};
		//*addr = &gps.ps_fm_station[station_no];
		 EEPROM_READ((int)&gps.ps_fmfre,freq);
   }
  // AMreq_MIN = radio_country[gps->ps_radio_standard].AM_start;
  // AMreq_MAX = radio_country[gps->ps_radio_standard].AM_end;
  // FMreq_MIN = radio_country[gps->ps_radio_standard].FM_start;
  // FMreq_MAX = radio_country[gps->ps_radio_standard].FM_end;

	is_autosearching = 0;
	switch_fmam();
	delay_ms(100);
	radio_is_muted = 0;
	mute_radio();
	
	#ifdef SGJM_RDS
	rds_init();
	pty_is_searching = 0;
	#endif
	
}

void send_word_to_bu2624( unsigned int data1)
{
   char i;
   
   for( i=0; i<16; i++)
   {
    	radio_clk_lo();
       	if( data1 & 0x01)
    	{
     		radio_din_hi();
       	}
    	else
    	{
     		radio_din_lo();
       	}
    	soft_delay();
    	radio_clk_hi();
       	data1 >>= 1;
    	soft_delay();
   	}
}

void  send_cmd_to_bu2624(void)
{
   
   	 radio_clk_hi();
     radio_stb_hi();
   
     soft_delay();
     send_word_to_bu2624(In_Pdata);
     send_word_to_bu2624(In_Cdata);
     radio_stb_lo();
}

void mute_radio(void)
{
 if(radio_is_muted)
 {
 	Enable_IF_OUT();//In_Cdata = In_Cdata&(~P1_IF_NOOUT);
    muted = 1;
    MCU_mute();
 }
 else
 {
 	Disable_IF_OUT();//In_Cdata |= P1_IF_NOOUT;
 	Enable_SD_OUT();//In_Cdata &=(~(COUNTER_START|IF_COUNTER_16MS));
    muted = 0;  //
 	MCU_mute();
    
 }
 send_cmd_to_bu2624();
}

void  read_data_from_bu2624()
{
   	register unsigned int value;
	register unsigned char i,value1;
	//set_dout_in();
    radio_stb_lo();
    soft_delay();
    dataout0 = 0;
	dataout1 = 0;
   	
 
    value = 0;
    for(i=0;i<16;i++)
	{
		value >>=1;
		radio_clk_lo();
        soft_delay();
        if(radio_dout())  value |= 0x8000;

        radio_clk_hi();
        soft_delay();
    }
    dataout0 = value;
    
    value1 = 0;
    for(i=0;i<8;i++)
    {
    	value1 >>=1;
		radio_clk_lo();
        soft_delay();
        
        if(radio_dout())  value1 |= 0x80;

        radio_clk_hi();
        soft_delay();
    }
     
    dataout1 = value1;
}


void switch_audio_channel(void)
{
	if(is_stereo)
   	{
    	Set_Stereo();//In_Cdata &= (~P4_MONO);
   	}
    else
   	{
   		Set_Mono();//In_Cdata |= P4_MONO;
   	}
    send_cmd_to_bu2624();
}

void switch_fmam(void)
{
	//unsigned char i;
   	radio_is_muted = 1;
   	if(amfm_flag)
   	{
		if((freq < AMreq_MIN)||(freq > AMreq_MAX))
			freq = AMreq_MIN;
	      
	  /*  switch(AMreq_STEP)
		{
			case 9:
			    Rfreq = Rfreq_009KHZ;
			    break;
			case 10:
			     Rfreq = Rfreq_010KHZ;
			     break;    
		};*/
	    In_Cdata = P0_AM | P4_MONO | P3_MUTE | Rfreq_009KHZ| AMIN | IF2 | IF_COUNTER_8MS;
    	//AM:IF_OUT: MUTE ON : MONO:PLL OPERATION: RESET COUNT
    	//:PLL :AMIN : PS=1:IF2:8MS: TS
    	In_Pdata = ((freq+IF_AM)/AMreq_STEP)<<4;
		//is_stereo = 0;
	}
	else
	{
		if((freq < FMreq_MIN)||(freq > FMreq_MAX))
			freq = FMreq_MIN;
          	//In_Cdata = 0;
      	In_Cdata =(unsigned int) (P0_FM |P3_MUTE| Rfreq_025KHZ | FMIN | IF2 | IF_COUNTER_8MS);
      //FM:IF_OUT:PLL OPERATE:RESET COUNT:PLL: FMIN:PS=X: 16MS
      	In_Pdata = ((freq+IF_FM)/5);
   	  	
   	  	if(!is_stereo || is_autosearching) In_Cdata |= P4_MONO;
   	}
    send_cmd_to_bu2624();
	#ifdef SGJM_RDS
	rds_init();
	//rds_data.syc_flag = 0;
	//rds_status = 0;
	//rds_step = SEARCH_SYC_STEP;
	#endif
}

void  change_freq_value(void)
{
	if(amfm_flag)
    {
        if(search_dir)
        {
  	        if(freq < AMreq_MAX)
  	        	freq +=AMreq_STEP;
  	        else
  	        {	
  	            freq = AMreq_MIN;
  	        }
  	    }
        else
        {
            if(freq > AMreq_MIN)
            	freq -= AMreq_STEP;
            else
            	freq = AMreq_MAX;
        }
        In_Pdata = ((freq+IF_AM)/AMreq_STEP)<<4;
    }
    else
    {
		if(search_dir)   //++
        {
        	if(freq <FMreq_MAX)
        		freq += FMreq_STEP;
        	else 
  	            freq = FMreq_MIN;
		}
        else
        {
            if(freq > FMreq_MIN)
           		freq -= FMreq_STEP;
           	else 
   	           	freq = FMreq_MAX;
  	    }
        In_Pdata = (freq+IF_FM)/5;
	}
}

void   tuner_handsearch()
{
	radio_is_muted = 1;
	mute_radio();
	is_autosearching = 0;
	change_freq_value();
	send_cmd_to_bu2624();
	#ifdef SGJM_RDS
	rds_init();
	display_type = DIS_FREQUENCY;
	g_ui_tmp_msg_cnt = 10;
	#endif
	
	delay_ms(100);
	radio_is_muted =0;
   	mute_radio();
}

void tuner_autosearch(void)
{
	//char i;
    unsigned long Ifcount;
    if(search_ok )
	{
		if(is_autosearching)
		{
			is_autosearching = 0;
		  	save_fre();
			/*if(amfm_flag)
		  	{
		      	In_Pdata =((freq+IF_AM)/AMreq_STEP)<<4;
		  	}
	  	  	else
	  	  	{
  	  	  	  	In_Pdata = (freq+IF_FM)/5;
  	  	  	}*/
          	Enable_SD_OUT();//	In_Cdata &= (~(COUNTER_START | IF_COUNTER_16MS));   //set cte = 0
          	Disable_IF_OUT();//In_Cdata |= P1_IF_NOOUT;
          	send_cmd_to_bu2624();
          	radio_is_muted = 0;
           
          	if(!amfm_flag)
          		switch_audio_channel();
            delay_ms(100);
			mute_radio();
          //station_num = 1;
  	  		#ifdef SGJM_RDS
  	  		rds_init();
			//rds_status  = 0;
  	  		//rds_data.syc_flag = 0;
  	  		//rds_step = SEARCH_SYC_STEP;
  	  		g_ui_tmp_msg_cnt = 10;
		//	if(pty_is_searching==2)
  	  	//		pty_search_delay = 67;
  	  		#endif
  	  	}
  	  	return;
  	}
  	rdelay20ms--;
   	switch(autosrch_step)
    {
      	case AUTOSRCH_STEP1:
			//printf("step 1\n");
            switch_fmam(); 
            autosrch_step ++;
			rdelay20ms = 2;
            //if(!ok_count) radio_delay200ms =2;
            break;
            
    	case AUTOSRCH_STEP2:
    	        //step interval 20ms
    	    if(rdelay20ms) break;
            In_Cdata |= (COUNTER_START|IF_COUNTER_16MS) ;                        //set cte = 1
            send_cmd_to_bu2624();
            autosrch_step = AUTOSRCH_STEP3;
            rdelay20ms = 10;
        
            break;
            
      case AUTOSRCH_STEP3:
            if (radio_dout()&& rdelay20ms) 
            {
             	break;
            }
            else
            {
            	autosrch_step = AUTOSRCH_STEP4;
            }
            break;
                
      case AUTOSRCH_STEP4:
          	read_data_from_bu2624();
	       	Ifcount = ((((unsigned long)dataout1) <<16) | (unsigned long)dataout0) & 0x0fffff;
	    	if((dataout1 & 0xc0)) //&& !wait_station_200ms)
	 		{
	       		autosrch_step = AUTOSRCH_STEP5;
	       		//break;
	       	}
			else
	       	{
           	
              	if(amfm_flag)
               	{	
                   	if((Ifcount >= IAM_MIN) && (Ifcount <=IAM_MAX)) 	
                   	{
                          search_ok = 1;
                          #ifdef SGJM_RDS
                        	rds_status = 0;
                        	pty_search_delay = 67;
                         #endif
                     }
                	else
                	{
                		#ifdef TEST_IF
	       					is_autosearching = 0;
	       				#else
                			autosrch_step = AUTOSRCH_STEP5;                          
				       	#endif	
				       		//break;
                	  }
                }
                else
                {
                 	
                   	if((Ifcount >= IFM_MIN)&&(Ifcount  <= IFM_MAX))//) && (170700--171700)) 	
                   	{
                        
                         search_ok = 1;
                          #ifdef SGJM_RDS
                        	rds_status = 0;
                        	pty_search_delay = 67;
                         #endif
                      }
                      else
                      {
                        #ifdef TEST_IF
	       					is_autosearching = 0;
	       				#else
						 	autosrch_step=AUTOSRCH_STEP5;
                        #endif
                        };
                    }
              }
              break;
    	case AUTOSRCH_STEP5:
 			radio_is_muted = 1;
			mute_radio();
    		change_freq_value();
     		autosrch_step = AUTOSRCH_STEP1;
    		break;
    }  //switch
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -