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

📄 main.c

📁 PHILIPS fmd1216高频头 C51 i2c通信程序
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#include <main.h>
#include <i2c.h>
#include <fmd1216.h>
unsigned char tv_radio = 0;
#include <lcd.h>
#define MAX_CH_NO   30     

unsigned char togglebit = 0;
unsigned char in_data = 0x26;
unsigned char auto_scan = 0;

unsigned char i;
unsigned char tune_coarse;
unsigned char tune_fine;
unsigned char total_ch_no=0;
unsigned char cur_ch_no = MAX_CH_NO;
unsigned char tv_format=0;

void store_ch_freq(void)
{
	if(total_ch_no >= MAX_CH_NO)
		return;
    lo_freq = (in_freq + ATV_IF)*16/100;
    pdivider_lo = lo_freq&0xff;
    pdivider_hi = ((lo_freq>>8)&0xff);
//    i2c_data = pdivider_lo;
	i2c_write(x2402dev,total_ch_no*2,pdivider_lo);
	delay30ms();
//	i2c_data = pdivider_hi;
	i2c_write(x2402dev,(total_ch_no*2)+1,pdivider_hi);
	total_ch_no++;
}

void restore_ch_freq(void)
{
     i2c_read(x2402dev,cur_ch_no*2);
     pdivider_lo = i2c_data;
     i2c_read(x2402dev,cur_ch_no*2+1);
     pdivider_hi = i2c_data;
	 tcom_data(0x0a);
	 tcom_data(0x0d);
	 dis_data(cur_ch_no);
	 tcom_data(0x20);
	 dis_data(pdivider_hi);//for trace 
	 tcom_data(0x20);
	 dis_data(pdivider_lo);//for trace
	 tcom_data(0x20);
     lo_freq = (unsigned long)(pdivider_hi<<8) + (unsigned long)pdivider_lo;
	 lo_freq = lo_freq*25l;
	 lo_freq = lo_freq/4l;	 
     in_freq = lo_freq - ATV_IF;
	 fine_value = 20;                        
     wr_fmd1216_rf();	
}


void skip_next_ch(void) //for chinese channel
{
       if( tune_coarse == 0)
			 in_freq = 5750;
       else if( tune_coarse == 1)
  		     in_freq = 6550;
       else if( tune_coarse == 2)
			 in_freq = 7700;
       else if( tune_coarse == 3)
			 in_freq = 8500;
  	   else if(tune_coarse > 3 && tune_coarse < 48)
	  	     in_freq = (unsigned long) (tune_coarse*800l) +8000l; // 11200-3200 = 8000
  	   else if(tune_coarse > 47 && tune_coarse < 61)
			 in_freq = (unsigned long) (tune_coarse*800l) + 7900l; // 46300-38400 = 7900
	   else if(tune_coarse > 60  && tune_coarse < 94)
			 in_freq = (unsigned long) (tune_coarse*800l) + 11900l; // 60675-48800 = 11900
       else
	   {
	         i2c_write(x2402dev,120,total_ch_no);
             delay30ms();
			 auto_scan = 0;
			 cur_ch_no = 0;
	         restore_ch_freq();
			 init_fmd1216();
		     dis_freq();
	   }
	   tune_coarse++;
	   tune_fine = 0;
}


/*
void skip_next_ch(void) //for taiwan and us channel
{
       if( tune_coarse == 0)
			 in_freq = 6100;
       else if( tune_coarse == 1)
  		     in_freq = 6700;
       else if( tune_coarse == 2)
			 in_freq = 7300;
       else if( tune_coarse == 3)
			 in_freq = 7700;
       else if( tune_coarse == 4)
			 in_freq = 8300;
       else if( tune_coarse == 5)
			 in_freq = 9100;
  	   else if(tune_coarse > 5 && tune_coarse < 124)
	  	     in_freq = (unsigned long) (tune_coarse*600l) + 6100l;//9700 - 3600 = 6100
       else
	   {
	         i2c_write(x2402dev,120,total_ch_no);
             delay30ms();
			 auto_scan = 0;
			 cur_ch_no = 0;
	         restore_ch_freq();
			 
			 init_fmd1216();
		     dis_freq();
	   }
	   tune_coarse++;
	   tune_fine = 0;

}
*/

void main()
{   
    
  main_init();
  init_lcd();
  i2c_init();
  ir_init();
  
  i2c_read(x2402dev,120);
  if(i2c_data > 50)
	  total_ch_no = 50;
  else
	  total_ch_no = i2c_data;

  tcom_data(0x6c); //l
  tcom_data(0x6f); //o
  tcom_data(0x63); //c
  tcom_data(0x6b); //k
  tcom_data(0x65); //e
  tcom_data(0x64); //d
  tcom_data(0x20);
  test_lcd();
  init_fmd1216();
  
  wr_fmd1216_rf();
  wr_fmd1216_if_i();
  
  dis_freq();

  while(1)
  { 
	
   if(tick_count >= 1)
	{
      if(auto_scan!=0)
	  { 
        rd_fmd1216_if();
        
		dis_data(i2c_data);
        tcom_data(0x20);
        
        if(in_freq >= 4925 && in_freq <= 86350)
		{
           if((i2c_data&0xd9)==0xc0)
		   {
			  store_ch_freq();
		      skip_next_ch();		   
		   }
           else if((i2c_data&0xf9)==0xd8) 
		   {
			  store_ch_freq();
		      skip_next_ch();		   
		   }
		   else
		   {
            if(tune_fine>=10)
			{
			   tune_fine = 0;  
		       skip_next_ch();		   
			}
			else
			{
		      in_freq = in_freq + 5;		   
		      tune_fine++;
			}
		   }

		   fine_value = 20;                        
           wr_fmd1216_rf();	
		   if((in_freq%25)==0)
		   {
		    init_fmd1216();
		    dis_freq();
		   }
		}
        else
		{
		   auto_scan = 0;
		}
	  }
     tick_count = 0;
	}


	if(RMDTSET)
    {
        RMDTSET=0;
            
        switch(RMDATA)
		{ 
		  case 0x05:    //set tv or radio mode
			             fine_value = 20;
						 if(tv_radio == TV_MODE)
						 {
							//in_freq = 9710; // 97.10MHZ
							digit5 = 0x30;
							digit4 = 0x30;
							digit3 = 0x39;
							digit2 = 0x37;
							digit1 = 0x31;
							digit0 = 0x30;
                            tv_radio = FM_MODE;
							cal_fm_freq();
						 }
						 else if (tv_radio == FM_MODE)
						 {
                            //in_freq = 53000; //530.00 MHZ
							digit5 = 0x30;
							digit4 = 0x35;
							digit3 = 0x33;
							digit2 = 0x30;
							digit1 = 0x30;
							digit0 = 0x30;
                            tv_radio = DVBT_MODE;
							cal_dvbt_freq();
						 }
						 else
						 {
                            //in_freq = 18425; // 184.25MHZ
							digit5 = 0x30;
							digit4 = 0x31;
							digit3 = 0x38;
							digit2 = 0x34;
							digit1 = 0x32;
							digit0 = 0x35;
                            tv_radio = TV_MODE;
							cal_in_freq();
							if(tv_format==0)
								wr_fmd1216_if_i();
							else
								wr_fmd1216_if_dk();
						 }
						 							 
						 dis_freq();
						 break;
		  case 0x14:    //play
						 fine_value = 20;
						 if(tv_radio==0)
                           cal_in_freq();
						 else
                           cal_fm_freq();
						 break;
          case 0x1a:    // next frequency  
			             if(tv_radio != 0)
							 break;
			             if(cur_ch_no >= (total_ch_no-1))
							cur_ch_no = 0;
						 else
							cur_ch_no++;
                         restore_ch_freq();
		                 init_fmd1216();
		                 dis_freq();
			             break;     
          case 0x0e:    // last frequency
			             if(tv_radio != 0)
							 break;
			             if(cur_ch_no==0)
						 {
							 if(total_ch_no > 0)
							   cur_ch_no = total_ch_no-1;							 
						 }
						 else
							cur_ch_no--;
                         restore_ch_freq();

		                 init_fmd1216();
		                 dis_freq();
			             break;     
          case 0x0a:    //	fine - 0.05MHz
			             if(tv_radio==0)
						 {
			              if(fine_value > 0)
						  {
						    fine_value = fine_value - 1;
						    wr_fmd1216_rf();
						    init_fmd1216();
						    dis_freq();
						  }
						 }
						 else
						 {
                            in_freq = in_freq - 5; ;
                            wr_fmd1216rf_150mhz();
							delay30ms();
							wr_fmd1216rf_fm();
		                    init_fmd1216();
							dis_freq();
						 }
			             break;     
          case 0x1e :    //fine tune +
                         if(tv_radio==0) // +0.05MHz
						 {
			               if(fine_value < 40) 
						   {
						    fine_value = fine_value + 1;
						    wr_fmd1216_rf();
						    init_fmd1216();
						    dis_freq();
						   }
						 }
						 else // + 0.05 MHz
						 {
                            in_freq = in_freq + 5;
                            wr_fmd1216rf_150mhz();
							delay30ms();
							wr_fmd1216rf_fm();
		                    init_fmd1216();
							dis_freq();

						 }
						 break;
		  case 0x50 :   //set frequency
			             digit_pos = 0;
						 init_fmd1216();
						 dis_freq();
			             move_cursor(digit_pos+6);
                         break;         
		  case 0x18 :   //move cursor left
			             move_cursor_left();
                         break;         
		  case 0x1c :   //move cursor right
			             move_cursor_right();
                         break;         
		  case 0x16 :   //num 0
			             set_digit_value(0x30);
                         move_cursor_right();
						break;         
		  case 0x09 :   //num 1
			             set_digit_value(0x31);
                         move_cursor_right();
						break;         
		  case 0x1d :   //num 2
			             set_digit_value(0x32);
                         move_cursor_right();
						break;         
		  case 0x1f :   //num 3
			             set_digit_value(0x33);
                         move_cursor_right();
						break;         
		  case 0x0d :   //num 4
			             set_digit_value(0x34);
                         move_cursor_right();
						break;         
		  case 0x19 :   //num 5
			             set_digit_value(0x35);
                         move_cursor_right();
						break;         
		  case 0x1b:   //num 6
			             set_digit_value(0x36);
                         move_cursor_right();
						break;         
		  case 0x11 :   //num 7
			             set_digit_value(0x37);
                         move_cursor_right();
						break;         
		  case 0x15 :   //num 8
			             set_digit_value(0x38);
                         move_cursor_right();
						break;         
		  case 0x17 :   //num 9
			             set_digit_value(0x39);
                         move_cursor_right();
						break;         
          case 0x01:    //
			            if(tv_radio!=0)
							break;
			            auto_scan = 1;
						fine_value = 20; 
						total_ch_no = 0;
						in_freq = 4950;
                        wr_fmd1216_rf();
						init_fmd1216();
						dis_freq();
						tune_coarse = 0;
						tune_fine = 0;
                        tick_count=0;
						break;
           case 0x54:    //	
						 fine_value = 20;
		                 if(tv_format==0)
						 {
						   wr_fmd1216_if_dk();
						   tv_format = 1;
						 }
						 else
						 {
						   wr_fmd1216_if_i();
						   tv_format = 0;
						 }
						break;

		  default   :   
			            if(RMDATA>128)
						{
							EA =1;
						    break;
						}
			            else			            
			               EA=1;
					    break;
		}    //switch
//   in_data = RMDATA;   
//   dis_data(in_data);
//	 tcom_data(0x20);
	}
 
  } //while 

} 

⌨️ 快捷键说明

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