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

📄 tuner.h

📁 PHILIPS FQ1286高频头c51驱动程序
💻 H
字号:
//Use SANYO LC72130 PLL Frequency Synthesizer  

#define   IN1_CMD 0x28
#define   IN2_CMD 0x29
#define   READ_CMD 0x2a

#define   AMreq_DIVIDER    3   //9
#define   FMreq_DIVIDER    5
#define   AMreq_STEP       9
#define   FMreq_STEP       5

#define   FMIN           0x02  //;bit1,bit0
#define   AMINL          0x00
#define   AMINH          0x01
#define   COUNTER_START  0x04 // ;bit 2
#define   COUNTER_RESET  0x00
#define   CRYSTAL_72MHZ  0x08  //;BIT 3
#define   CRYSTAL_45MHZ  0x00
#define   Rfreq_100KHZ   0x00  //;bit7,bit6,bit5,bit4
#define   Rfreq_050KHZ   0x10
#define   Rfreq_025KHZ   0x20
#define   Rfreq_010KHZ   0x80
#define   Rfreq_009KHZ   0x90
#define   Rfreq_005KHZ   0xa0
#define   Rfreq_001KHZ   0xb0
#define   Rfreq_003KHZ   0xc0
#define   Rfreq_015KHZ   0xd0

#define   POWER_AM       0X00    //BIT 7
#define   POWER_FM       0X80    //BIT 7

#define   BO5_STEREO    0x00
#define   BO5_MONO      0x01

#define   DOC_MODE0     0x00      //bit3.bit2,bit1
#define   DOC_MODE1     0x02  //low when the unlock staten is detected
#define   DOC_MODE2     0x04 //end UC

#define   PHASE_ERR_WIDTH0      0x10  //bit 5,bit 4
#define   PHASE_ERR_WIDTH1      0x20
#define   PHASE_ERR_WIDTH2      0x30

#define   IF_COUNTER_PERIOD0    0x00  // 4MS //BIT 1,BIT 0
#define   IF_COUNTER_PERIOD1    0x01  //8MS
#define   IF_COUNTER_PERIOD2    0x02  //32MS
#define   IF_COUNTER_PERIOD3    0x03  //64MS
#define   INPUT_SENSITIVE_MODE  0x10  //BIT 4

#define   AMreq_MIN      531
#define   AMreq_MAX      1602
#define   FMreq_MIN      8750
#define   FMreq_MAX      10800

#define   FM_BAND        0   //0
#define   AM_BAND        1   //1

#define   CH_DOWN        0   //0
#define   CH_UP          1   //1

#define   AUTOSRCH_STEP1   0
#define   AUTOSRCH_STEP2   1
#define   AUTOSRCH_STEP3   2
#define   AUTOSRCH_STEP4   3
#define   DWORD   unsigned long


//unsigned char lc_cmd;
sbit RADIO_DOUT = P1^0;       
sbit RADIO_CLK  = P1^1; 
sbit RADIO_DIN  = P1^2;       
sbit RADIO_STB  = P1^3; 

unsigned char lc_dataout[3];
unsigned char In2_Cdata[3];// = {0,0,0};
unsigned int  In1_Pdata;
unsigned char In1_Cdata;

unsigned int  AMfreq = 0;
unsigned int  FMfreq = 9710;

unsigned char autosrch_step;
unsigned char wait_station_200ms = 0;
unsigned char radio_station_count =0;

unsigned long Ifcount;
bit amfm_flag,radio_station_changed,auto_srch_ok =1;
bit is_search_all_station=0,is_searching_all_station=0;
//bit radio_is_muted;
bit auto_manu;
bit dvd_radio;
bit srch_dir;
unsigned char station_num;

//extern unsigned int radio_stations[25];
void delay(int i)
{ 
  int j; 
  for(j=0;j<i;j++);
}

void send_byte_to_lc72130(char data1)
{
   char i;
   for( i=0; i<8; i++)
   {
    RADIO_CLK = 0;
    _nop_();
    RADIO_DIN = data1 & 0x01;
      _nop_();
    RADIO_CLK = 1;
    data1 >>= 1;
      _nop_();
   }
 
   RADIO_CLK = 0; //johnson

}

void  send_cmd_to_lc72130(unsigned char cmd,unsigned char para1,unsigned char para2,unsigned char para3)
{
     RADIO_STB = 0;
     send_byte_to_lc72130(cmd);
     RADIO_STB = 1;
     send_byte_to_lc72130(para1);
     send_byte_to_lc72130(para2);
     send_byte_to_lc72130(para3);
     RADIO_STB = 0;
}


void mute_radio(unsigned char mute)
{
 if(mute)
 	{
 	In2_Cdata[0] &= 0xdf;
//    radio_is_muted = 1;
//    printf("Radio out is mute\n");
 	}
 else
	{
 	In2_Cdata[0] |= 0x20;
//    radio_is_muted = 0;
//    printf("Radio out is unmute\n");
 	}
 send_cmd_to_lc72130(IN2_CMD,In2_Cdata[0],In2_Cdata[1],In2_Cdata[2]);
}


void  read_data_from_lc72130()
{
   unsigned char i,j,value;

   RADIO_STB = 0;
   send_byte_to_lc72130(READ_CMD);
   RADIO_STB = 1;

   lc_dataout[0] = 0;
   lc_dataout[1] = 0;
   lc_dataout[2] = 0;

   for(j=0;j<3;j++)
    {
     value = 0;
     for(i=0;i<8;i++)
       {
          RADIO_CLK =0;
          _nop_();
          RADIO_CLK =1;
          _nop_();
          RADIO_DOUT =1;
          if(RADIO_DOUT)  value |= 0x01;
          if(i != 7) value <<= 1;
       }
     lc_dataout[j] = value;
    }
   RADIO_STB = 0;
}

void switch_audio_channel(unsigned char stereo_out)
{
   if(stereo_out)
   	{
   	  In2_Cdata[1] &= 0xfe;
   	}
   else
   	{
   	  In2_Cdata[1] |= BO5_MONO;
   	}
    send_cmd_to_lc72130(IN2_CMD,In2_Cdata[0],In2_Cdata[1],In2_Cdata[2]);
}

void switch_fmam(unsigned char am_flag)
{
//   unsigned char i;

//   radio_is_muted = 1;
if(!is_search_all_station)
   station_num = 0;
//    printf("Radio out is mute\n");
   if(am_flag)
   	{ 
//	  if((AMfreq < 531)||(AMfreq > 1602))

	   if((AMfreq < AMreq_MIN)||(AMfreq > AMreq_MAX))
			AMfreq = AMreq_MIN;//AMreq_MIN =531; AMreq_MAX =1602
//			AMfreq = 1287;//AMreq_MIN =531; AMreq_MAX =1602 //for test 1287

//      if(!is_search_all_station)
//      	{
//           for(i=0;i<25;i++)   //MAX_RADIO_STATION
//            {
//              if(AMfreq == radio_stations[i])
//                 station_num = i+1;
//            }
//      	}    
      In1_Cdata =Rfreq_003KHZ | AMINL | COUNTER_RESET | CRYSTAL_45MHZ;  // Rfreq_009KHZ
      In1_Pdata =((AMfreq+450)/AMreq_DIVIDER)<< 4;
   	  In2_Cdata[0] = 0x10;   //select AM and mute OUT
   	  In2_Cdata[1] = PHASE_ERR_WIDTH0 | DOC_MODE2 | BO5_MONO;   //end-UC
   	  In2_Cdata[2] = 0x11;   //8ms
   	}
   else
   	{
//	  if((FMfreq < 8750)||(FMfreq > 10800))
	  if((FMfreq < FMreq_MIN)||(FMfreq > FMreq_MAX))
		FMfreq = FMreq_MIN; //8750; //FMreq_MIN = 8750; FMreq_MAX = 10800;
//      if(!is_search_all_station)
//      	{
//           for(i=0;i<25;i++)
//            {
//              if(FMfreq == radio_stations[i])
//                 station_num = i+1;
//            }
//      	}
      In1_Cdata = Rfreq_025KHZ | FMIN | COUNTER_RESET | CRYSTAL_45MHZ;
      In1_Pdata = (FMfreq+1070)/FMreq_DIVIDER;
   	  In2_Cdata[0] = 0x80;   //select FM and mute OUT, BO4 -> POWER FM/AM
      In2_Cdata[1] = PHASE_ERR_WIDTH0 | DOC_MODE2 | BO5_MONO;    //end-UC
      In2_Cdata[2] = 0x12;    //32ms
   	}

    send_cmd_to_lc72130(IN1_CMD,(unsigned char) (In1_Pdata),(unsigned char)(In1_Pdata >> 8),In1_Cdata);
	send_cmd_to_lc72130(IN2_CMD,In2_Cdata[0],In2_Cdata[1],In2_Cdata[2]);
}

void  change_freq_value(unsigned char bband,unsigned char bsearchdir)
{
      if(bband == AM_BAND)
        {
           if(bsearchdir)
            {
            AMfreq +=AMreq_STEP ;
            if(is_search_all_station)
            	{
  	             if(AMfreq >=AMreq_MAX)
  	             	{
  	             	  is_search_all_station = 0;
  	             	  auto_srch_ok = 1;
//  	             	  radio_station_count = 0;
  	             	}
            	}
            if(AMfreq> AMreq_MAX)    AMfreq = AMreq_MIN;
            }
           else
            {
            AMfreq -=AMreq_STEP ;
            if(AMfreq<AMreq_MIN)     AMfreq = AMreq_MAX;
            }
           In1_Pdata =((AMfreq+450)/AMreq_DIVIDER)<< 4;
        }
         else
        {
           if(bsearchdir)   //++
            {
            FMfreq +=FMreq_STEP;
            if(is_search_all_station)
            	{
  	             if(FMfreq >=FMreq_MAX) 
  	             	{
  	             	  is_search_all_station = 0;
  	             	  auto_srch_ok = 1;
//  	             	  radio_station_count = 0;
  	             	}
            	}
            if(FMfreq>FMreq_MAX)         FMfreq = FMreq_MIN;
            }
           else
            {
            FMfreq -=FMreq_STEP;
            if(FMfreq<FMreq_MIN)        FMfreq = FMreq_MAX;
            }
           In1_Pdata = (FMfreq+1070)/FMreq_DIVIDER;
        }
}

void   tuner_handsearch(unsigned char bband ,unsigned char bsearchdir)
{

   change_freq_value(bband,bsearchdir);
   send_cmd_to_lc72130(IN1_CMD,(unsigned char) (In1_Pdata),(unsigned char)((In1_Pdata) >> 8),In1_Cdata);

   //   send_cmd_to_lc72130(IN2_CMD,In2_Cdata[0],In2_Cdata[1],In2_Cdata[2]);
   delay(300);
   mute_radio(0);
}


void tuner_autosearch(unsigned char searchdir)
{

  if(is_searching_all_station==0)
	  return;
  
//  if(is_search_all_station==0)
//	  return;

/*
  if(auto_srch_ok && !is_search_all_station)
  	{
  	  if(is_searching_all_station)
  	  	{
  	  	  is_searching_all_station = 0;
  	  	  if(amfm_flag)
  	  	  	{
//  	  	  	  AMfreq = radio_stations[0];
  	  	  	  AMfreq = AMreq_MIN;
              In1_Pdata =((AMfreq+450)/AMreq_DIVIDER)<< 4;
  	  	  	}
  	  	  else
  	  	  	{
//  	  	  	  FMfreq = radio_stations[0];
  	  	  	  FMfreq = FMreq_MIN;
              In1_Pdata = (FMfreq+1070)/FMreq_DIVIDER;
  	  	  	}
          In1_Cdata &= 0xfb ;   //set cte = 0
          send_cmd_to_lc72130(IN1_CMD,(unsigned char) (In1_Pdata),(unsigned char)((In1_Pdata) >> 8),In1_Cdata);
          mute_radio(0);
          station_num = 1;
  	  	}
  	  return;
  	}
*/
   switch(autosrch_step)
    {
      case AUTOSRCH_STEP1:
              switch_fmam(amfm_flag); 
//              station_num = 0;
              autosrch_step ++;
              break;
      case AUTOSRCH_STEP2:        //step interval 20ms
              change_freq_value(amfm_flag,searchdir);   //1 -> UP search,0 ->DOWN search
              In1_Cdata |= 0x04 ;                        //set cte = 1
              send_cmd_to_lc72130(IN1_CMD,(unsigned char) (In1_Pdata),(unsigned char)((In1_Pdata) >> 8),In1_Cdata);
//              delay(300);//johnson
			  autosrch_step = AUTOSRCH_STEP3;
//              wait_station_200ms = 0;
              wait_station_200ms = 5;
              break;
      case AUTOSRCH_STEP3:
//              if (RADIO_DOUT && !wait_station_200ms) 
              if (RADIO_DOUT && wait_station_200ms) 
               {
//                autosrch_step = AUTOSRCH_STEP2;
                 break;
               }
              else
               {
                autosrch_step = AUTOSRCH_STEP4;
//                wait_station_200ms = 0;
                wait_station_200ms = 5;
//                In2_Cdata[2] &=0xf7;     // set DO pin output mode
//                In2_Cdata[2] |=0x08;     // set DO pin output mode
//                send_cmd_to_lc72130(IN2_CMD,In2_Cdata[0],In2_Cdata[1],In2_Cdata[2]);
               }
                break;
      case AUTOSRCH_STEP4:
               read_data_from_lc72130();
               read_data_from_lc72130();
               Ifcount = ((((DWORD)lc_dataout[0]) <<16) | (((DWORD)lc_dataout[1]) <<8) | (DWORD)lc_dataout[2]) & 0x0fffff;
//	           if(((lc_dataout[0] & 0x10) != 0x10) && !wait_station_200ms)
	           if(((lc_dataout[0] & 0x10) != 0x10) && wait_station_200ms)
			   {
                   delay(50);
				   break;
			   }
	           else
               {
                if(amfm_flag)
                	{
                       if((Ifcount >3590) && (Ifcount < 3610)) 	
                       	{
                          auto_srch_ok = 1;
                          In1_Cdata &= 0xfb ;   //set cte = 0
                          send_cmd_to_lc72130(IN1_CMD,(unsigned char) (In1_Pdata),(unsigned char)((In1_Pdata) >> 8),In1_Cdata);
                          delay(300); //Johnson
                          mute_radio(0);
                          //if(radio_station_count < 25 ) //Johnson
						  //{
                          // radio_stations[radio_station_count] = AMfreq;
                          // radio_station_count++;
                          // station_num = radio_station_count;
						  //}johnson
                       	}
                	}
                else
                	{
                       if((Ifcount >342300) && (Ifcount < 342500)) 	
                       	{
                          auto_srch_ok = 1;
                          In1_Cdata &= 0xfb ;   //set cte = 0
                          send_cmd_to_lc72130(IN1_CMD,(unsigned char) (In1_Pdata),(unsigned char)((In1_Pdata) >> 8),In1_Cdata);
                          delay(300); //Johnson
                          mute_radio(0);
                          //if(radio_station_count < 25 ) //johnson
						  //{
                          //  radio_stations[radio_station_count] = FMfreq;
                          //  radio_station_count++;
                          //  station_num = radio_station_count;
						  //}//johnson
                       	}
                	}

                if(auto_srch_ok) 
                	{
        	         radio_station_changed = 1;
                     if(is_search_all_station)
                     	{
//                          delay_us(3000000);      //dzh add for test
                     	  auto_srch_ok = 0;
                     	}
                	}
                autosrch_step = AUTOSRCH_STEP1;
			   }
               break;
    }  //switch
}


void init_lc72130(void)
{

//   switch_audio_channel(0);    //default MONO out
//   switch_audio_channel(1);      //default Stero out

////   ps_restore_amfm();
////   ps_restore_station();

	switch_fmam(amfm_flag);
    switch_audio_channel(0);    //default MONO out
//   In1_Cdata = Rfreq_025KHZ | FMIN | COUNTER_RESET | CRYSTAL_45MHZ;   //default FM Band
    delay(300); //Johnson
    mute_radio(0);
	auto_manu = 0;
//   dvd_radio = 1;
}

⌨️ 快捷键说明

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