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

📄 tuner.c

📁 我写的stv2248 芯片的驱动程序
💻 C
字号:
 //#include<reg52.h>
 #include<define.h>
 #include<IIC_C51.h>
 #include<OSD_5514.h>
 #include<tuner.h>
 #include<delay.h>
 #include<TV_ch_table.h>
#include<use_factory.h>
#include<audio.h>
// sbit Stable=P0^7;
//sbit ANT_X=P0^6;
// sbit SyncDetPort=P0^3;

// #define TunerAddr    0xc0
// #define TV_space    0x100
// #define cur_prog_addr 0x1fe
// #define MAX_prog_addr     0x1ff
// #define C_CTRL_BYTE 0xce
// #define PLL_lock    0x40
// #define Lock_wait_time 75  //定时器*75=150ms,锁相环最长锁定时间
// #define ADC_reg     0x07
// #define ADC_ok      0x03

// #define Max_CH  73  //数字置台最大的CH数



 //BYTE *TunerTBL_Ptr;
 BYTE	xdata	cur_prog;  //当前节目号,从1-99,对应EEPROM存贮地址0x101--0x163,存贮内容为CH号
 BYTE	xdata	Max_prog;
 BYTE	xdata	cur_ch;  //频率表频道号
 //BYTE PLL_wait;
 BYTE	xdata	scan_cnt;
 BYTE	xdata	CH_num_disp,ppp;
 bit  scaning=0;
 bit  fac_TV_Disp=1;

 extern bit TV_sync,Mute_flg;
 extern bit sync,ack;

 extern BYTE	xdata	remote_key;
 extern BYTE	xdata	button_key;

 bit     ScanSyncDet();

 void WritePLL(BYTE band, BYTE PLL_high, BYTE PLL_low, bit sw)
 {

		sw=1;
     //if (sw == 1)
      {  // Type-1
                 IIC_buf[0] = PLL_high;
                 IIC_buf[1] = PLL_low;
                 IIC_buf[2] = C_CTRL_BYTE;// #define     C_CTRL_BYTE     0x8E
                 IIC_buf[3] = band;
         }
         //else
         {       // Type-2
                 //IIC_buf[0] = C_CTRL_BYTE;
                 //IIC_buf[1] = band;
                 //IIC_buf[2] = PLL_high;
                 //IIC_buf[3] = PLL_low;
         }
         ppp=USendStr(TunerAddr,IIC_buf,4);
 }

 BYTE ReadTuner(void)
 {
   URcvStr(TunerAddr,IIC_buf,1);
   return(IIC_buf[0]);
 }

/* 
bit Tuner_check(void)
 {
   ReadTuner();
   return(~ack);
 }*/



 void Disp_TV_ch(void)
 {
   if(fac_TV_Disp) PrintDec(20,1,cur_ch);
   else PrintDec(20,1,cur_prog);
 }

void TV_osd(void)
{
   TV_init_osd();
   Disp_TV_ch();
   if(Mute_flg)	PrintString(5,9,"MUTE");
}

void TV_init_osd(void)
{
   BYTE code *tv_disp3[]={"NTSC  ","PAL B/G","PAL D/K","PAL I  ","SEC B/G","SEC D/K","SEC L  ","PAL B/G","NTSC  "};
   
   PrintString(1,1,"TV ");
   PrintString(17,1,"CH");
   PrintString(17,2,tv_disp3[fac_TV_Format]);
   //Disp_TV_ch();
   //if(Mute_flg)	PrintString(5,9,"MUTE");
}

void TV_Disp(void)
{
	CloseOSD();
	TV_osd();
}

 void CH_set(BYTE Prog,bit direct,bit display)
 {
    BYTE PLL_high,PLL_low;
    BYTE PLLband;
	BYTE *TunerTBL_Ptr;
  	if(IRcvStr(0xa2,Prog,IIC_buf,1))      cur_ch=IIC_buf[0];
  	else                                  cur_ch=2;
  	//if(cur_ch<Max_CH)
	{
		IIC_buf[0]=0;
   		switch(fac_TV_Format)
		{
       		case 0:
			TunerTBL_Ptr=&USA_table[0][0];
			//IIC_buf[1]=0x16;
			//IIC_buf[2]=0x30;
			//IIC_buf[3]=0x08;
			break;
		
       		case 1:
       		case 4:
       		case 6:
			TunerTBL_Ptr=&CCIR_table[0][0];
			IIC_buf[1]=0xd6;
			IIC_buf[2]=0x70;
			IIC_buf[3]=0x09;
			break;
		
       		case 2:
       		case 5:
			TunerTBL_Ptr=&PAL_DK_table[0][0];
			IIC_buf[1]=0xd6;
			IIC_buf[2]=0x70;
			IIC_buf[3]=0x0b;
			break;
			
			case 3:  //PAL I 只有ch21-ch69,即CCIR频道表的UHF段
			TunerTBL_Ptr=&CCIR_table[0][0];
			//cur_ch=20;
			IIC_buf[1]=0xd6;
			IIC_buf[2]=0x70;
			IIC_buf[3]=0x0a;
			break;
			
			case 7:
	     	TunerTBL_Ptr=&AUTSTRLIA_table[0][0];
			IIC_buf[1]=0xd6;
			IIC_buf[2]=0x70;
			IIC_buf[3]=0x09;
	     	break;
	     	
			
	     	
	     	
       		case 8:
	    	default:
			TunerTBL_Ptr=&USA2_table[0][0];
			IIC_buf[1]=0x16;
			IIC_buf[2]=0x30;
			IIC_buf[3]=0x08;
			break;
		}
		if(fac_TV_Format)
		USendStr(0x86,IIC_buf,4);
		DelayX2ms(50);
		
     	PLL_high=*(TunerTBL_Ptr+(cur_ch-1)*3);
  		TunerTBL_Ptr++;
  		PLL_low=*(TunerTBL_Ptr+(cur_ch-1)*3);
  		TunerTBL_Ptr++;
  		PLLband=*(TunerTBL_Ptr+(cur_ch-1)*3);
  		WritePLL(PLLband,PLL_high,PLL_low,direct);
   		CH_num_disp=cur_ch;
   		IIC_buf[0] = cur_ch;
   		IIC_buf[1]=Max_prog;
		IIC_buf[2]=cur_prog;
   		ISendStr(0xa0,0x03,IIC_buf,3);
   		DelayX2ms(50);
   		if(display) TV_Disp();
   	}
}

void TV_Scan(void)
{
	BYTE PLL_high,PLL_low;
	BYTE PLLband;
	BYTE *TunerTBL_Ptr;
	BYTE ANT_count;
	bit ANT_locked;
	bit ForceStop;
	bit scan_tag;
	
	ForceStop=scan_tag=0;
	scaning=1;
	cur_ch=2;
	cur_prog=1;
	Max_prog=1;
	ANT_locked=0;
	fac_TV_Disp=1;
	ANT_X=0;
	Stable=0;
	OSD_format(NTSC);
	BlueScreen(1);
	
	
	IIC_buf[0]=0;
   		switch(fac_TV_Format)
		{
       		case 0:
			TunerTBL_Ptr=&USA_table[1][0];
			//IIC_buf[1]=0x16;
			//IIC_buf[2]=0x30;
			//IIC_buf[3]=0x08;
			break;
		
       		case 1:
       		case 4:
       		case 6:
			TunerTBL_Ptr=&CCIR_table[1][0];
			IIC_buf[1]=0xd6;
			IIC_buf[2]=0x70;
			IIC_buf[3]=0x09;
			break;
		
       		case 2:
       		case 5:
			TunerTBL_Ptr=&PAL_DK_table[0][0];
			cur_ch=1;
			IIC_buf[1]=0xd6;
			IIC_buf[2]=0x70;
			IIC_buf[3]=0x0b;
			break;
			
			case 3:  //PAL I 只有ch21-ch69,即CCIR频道表的UHF段
			TunerTBL_Ptr=&CCIR_table[1][0];
			IIC_buf[1]=0xd6;
			IIC_buf[2]=0x70;
			IIC_buf[3]=0x0a;
			break;
			
			case 7:
	     	TunerTBL_Ptr=&AUTSTRLIA_table[0][0];
	     	cur_ch=1;
			IIC_buf[1]=0xd6;
			IIC_buf[2]=0x70;
			IIC_buf[3]=0x09;
	     	break;
	     	
			case 8:
	    	default:
			TunerTBL_Ptr=&USA2_table[1][0];
			IIC_buf[1]=0x16;
			IIC_buf[2]=0x30;
			IIC_buf[3]=0x08;
			break;
		}
		if(fac_TV_Format)
		USendStr(0x86,IIC_buf,4);
		DelayX2ms(50);
	TV_Disp();
	while(*TunerTBL_Ptr!=0)
	{
		if(fac_TV_Disp) Disp_TV_ch();
		PLL_high= *TunerTBL_Ptr;
       	TunerTBL_Ptr++;
       	PLL_low= *TunerTBL_Ptr;
       	TunerTBL_Ptr++;
       	PLLband=*TunerTBL_Ptr;
       	TunerTBL_Ptr++;
       	if(PLLband==flg_VHFL)           PrintString(3,10,"VHF LOW... ");
		else if(PLLband==flg_VHFH)      PrintString(3,10,"VHF HIGH...");
		else                            PrintString(3,10,"UHF...     ");
		PLL_low-=2;  //按经验值,下降两步为最佳位置
		WritePLL(PLLband,PLL_high,PLL_low,1);  //写分频数据
		DelayX2ms(15);
		if(ANT_locked) ANT_count=1;  //如果天线已锁定,则只做一次当前天线的搜索
		else ANT_count=4;            //天线未锁定,则做4次
		scan_cnt=0;
		scaning=1;
		while(ANT_count)
		{
			if(!ANT_locked) ANT_X=1;
			DelayX2ms(100);
			if(scan_cnt>9)
			{
				//PrintHex(5,1,scan_cnt);
				scan_cnt=0;
				ANT_locked=1;
				ANT_X=0;
				IIC_buf[0]=cur_ch;
				ISendStr(0xa2,cur_prog,IIC_buf,1);
				cur_prog++;
				CloseOSD();
				DelayX2ms(50);
				BlueScreen(0);
				DelayX2ms(100);
				TV_osd();
				DelayX2ms(120);
				//CloseOSD();
				//TV_Disp();
				//OSD_format(NTSC);
				
				scan_tag=1;
				break;
			}
			ANT_X=0;
			ANT_count--;
			if((remote_key==3)||(button_key==3))      {ForceStop=1;break;}
		}
		scaning=0;
		//OSD_format(NTSC);
		BlueScreen(1); ////
		if(ForceStop) break;
		cur_ch++;
		
	}
	Stable=1;
	remote_key=0;//0xff;
	button_key=0;
	if(!scan_tag)
	{
		Max_prog=1;
		IIC_buf[0]=2;
		ISendStr(0xa2,1,IIC_buf,1);
	}
	else if(cur_prog==1)
	Max_prog=cur_prog;
	else {cur_prog-=1;Max_prog=cur_prog;}
	cur_prog=1;
	IIC_buf[0]=Max_prog;
	IIC_buf[1]=cur_prog;
	ISendStr(0xa0,0x04,IIC_buf,2);
	DelayX2ms(5);
	CH_set(cur_prog,0,1);
	scaning=0;
	ANT_X=1;  //天线脉冲输出脚的复位放在后面的位置,使四路天线CPU有足够时间退出中断
}

 void CH_inc(void)
 {
         if(cur_prog<Max_prog) {cur_prog++;CH_set(cur_prog,1,1);}
         else {cur_prog=1;CH_set(cur_prog,0,1);}
 }

 void CH_dec(void)
 {
         if(cur_prog>1) {cur_prog--;CH_set(cur_prog,0,1);}
         else {cur_prog=Max_prog;CH_set(cur_prog,1,1);}
 }

void CH_setr(BYTE digital)
{
	BYTE PLL_high,PLL_low;
	BYTE PLLband;
	BYTE Max_CH;
	BYTE *TunerTBL_Ptr;
	if((digital==0)||((digital==1)&&((fac_TV_Format!=2)&&(fac_TV_Format!=5)&&(fac_TV_Format!=7))))
	{
		Disp_TV_ch();
		//return;
	}
	//else if(cur_ch==digital)
	//TV_osd();
	else if(!fac_TV_Disp)   //节目号显示模式
	{
		if(digital<=Max_prog)  //数字键置台必须小于最大台数,否则不予置台
		{
			if(digital<cur_prog) CH_set(digital,0,1);
			else CH_set(digital,1,1);
			cur_prog=digital;
		}
		else TV_Disp();
	}
	else  // CH号显示模式
	{
		
		IIC_buf[0]=0;
   		switch(fac_TV_Format)
		{
       		case 0:
			TunerTBL_Ptr=&USA_table[0][0];
			Max_CH=72;
			//IIC_buf[1]=0x16;
			//IIC_buf[2]=0x30;
			//IIC_buf[3]=0x08;
			break;
		
       		case 1:
       		case 4:
       		case 6:
			TunerTBL_Ptr=&CCIR_table[0][0];
			Max_CH=69;
			IIC_buf[1]=0xd6;
			IIC_buf[2]=0x70;
			IIC_buf[3]=0x09;
			break;
		
       		case 2:
       		case 5:
			TunerTBL_Ptr=&PAL_DK_table[0][0];
			Max_CH=95;
			IIC_buf[1]=0xd6;
			IIC_buf[2]=0x70;
			IIC_buf[3]=0x0b;
			break;
			
			case 3:  //PAL I 只有ch21-ch69,即CCIR频道表的UHF段
			TunerTBL_Ptr=&CCIR_table[0][0];
			Max_CH=69;
			IIC_buf[1]=0xd6;
			IIC_buf[2]=0x70;
			IIC_buf[3]=0x0a;
			break;
			
			case 7:
	     	TunerTBL_Ptr=&AUTSTRLIA_table[0][0];
	     	Max_CH=69;
			IIC_buf[1]=0xd6;
			IIC_buf[2]=0x70;
			IIC_buf[3]=0x09;
	     	break;
	     	
			case 8:
	    	default:
			TunerTBL_Ptr=&USA2_table[0][0];
			Max_CH=72;
			IIC_buf[1]=0x16;
			IIC_buf[2]=0x30;
			IIC_buf[3]=0x08;
			break;
		}
		if(fac_TV_Format)
		USendStr(0x86,IIC_buf,4);
		DelayX2ms(50);
		if(digital<=Max_CH)
		{
			set_mute(0);
			PLL_high=*(TunerTBL_Ptr+(digital-1)*3);
          	TunerTBL_Ptr++;
          	PLL_low=*(TunerTBL_Ptr+(digital-1)*3);
          	TunerTBL_Ptr++;
          	PLLband=*(TunerTBL_Ptr+(digital-1)*3);
          	
          	
          	if(digital<cur_ch)      WritePLL(PLLband,PLL_high,PLL_low,0);
          	else                    WritePLL(PLLband,PLL_high,PLL_low,1);
          	for(cur_ch=1;cur_ch<Max_prog;cur_ch++)
        	{
        		IRcvStr(0xa2,cur_ch,IIC_buf,1);
        		if(IIC_buf[0]==digital)   //在表内
				{
					cur_prog=cur_ch;
					cur_ch=Max_prog;
				}
			}
          	cur_ch=digital;
          	CH_num_disp=cur_ch;
          	DelayX2ms(50);
          	TV_Disp();
          	
          	//cur_ch=i;
          	//PrintHex(5,1,PLL_high);
        	//PrintHex(8,1,PLL_low);
		}
		else {Disp_TV_ch();return;}//{CH_set(cur_prog,1,1);return;}
		IIC_buf[0]=cur_ch;
		ISendStr(0xa0,0x03,IIC_buf,1);
	}
}

void    Disp_ch_setr_1st(BYTE   num)
{
   TV_Disp();
   PrintHex(20,1,num*10);
   PrintChar(21,1,'-');
}

 void    Disp_search(void)
 {
         CloseOSD();
         PrintString(5,10,"SEARCH...");
 }

 //void Tuner_Data_init(void)
 //{
    //IRcvStr(0xa0,0x03,IIC_buf,3);
    //cur_ch=IIC_buf[0];
    //Max_prog=IIC_buf[1];
    //cur_prog=IIC_buf[2];
    //fac_TV_Format=0;
    //CH_setr(cur_ch);
 //}

 bit     ScanSyncDet()
 {
         //BYTE i;
         //BYTE    scan_tmp[5];
         bit     scan_tmp_flg;

 /*      ET2=0;
         for(i=0;i<5;i++)
         {
                 TR2=0;
                 TL2=0;
                 TH2=0;
                 TF2=0;
                 EXF2=0;
                 TR2=1;
                 while((TF2==0)&&(EXF2==0));
                 TR2=0;
                 if(TF2) scan_tmp[i]=0xff;
                 if(EXF2)        scan_tmp[i]=RCAP2H;
         }
         for(i=0;i<5;i++)
         {
                 if((scan_tmp[i]<3)&&(scan_tmp[i]!=0))   {scan_tmp_flg=1;break;}
                 else                    scan_tmp_flg=0;
         }
         TL2=0;
         TH2=0;
         TF2=0;
         EXF2=0;
         TR2=1;
         ET2=1;*/
         return(scan_tmp_flg);
 }


 //--------------------------------------------------------------------------


⌨️ 快捷键说明

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