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

📄 tvmodule.c

📁 飞利浦10碟VCD控制程序
💻 C
字号:
#include <REG52.H>
#include <Function.H>
#include <constant.h>
#include <Extern.h>
#include <Tvmodule.h>

//TV高频头的中频部分设置(制式设置)
//MidFreqIC_Addr: 中频IC的IIC Slave地址,如TDA9885T的是0xC0或0xC2
//wdata:写入中频的数据,其中wdata[0]是Slave后的第一个字节
//if success return 0,else return 1;
bit SetTV_Module(unsigned char MidFreqIC_Addr,unsigned char *wdata,unsigned char num)
{
	unsigned char i;
	bit errorflag=0;
	i=ERRORCOUNT;

	while(--i)
	{
		IICStart();
		IICSendByte(MidFreqIC_Addr);
		if(IICRecAck())
			continue;
		while(num--)
		{
			IICSendByte(*wdata++);
			if(!IICRecAck())
				continue;
			errorflag=1;
			break;
		}
		if(!errorflag)
			break;
	}
	IICStop();
	Delay(255);
	Delay(255);
	Delay(255);
	Delay(255);
	if(i==0)
		errorflag=1;
	return(errorflag);
}


//raddr: TALN-M200T read first address
//rdata: data buffer
//num:   valid data num
bit ReadTV_Status(unsigned char TV_ICSlave,unsigned char *rdata)
{
	unsigned char i;
	bit errorflag=1;
	i=ERRORCOUNT;
	while(i--)
	{
		IICStart();
		IICSendByte(TV_ICSlave);
		if(IICRecAck())
			continue;
		*rdata=IICReceiveByte();        //read last byte data
		IICNoAck();
		IICStop();
		errorflag=0;
		break;
	}
	return(errorflag);
}



bit TVInit(void)
{
	switch(TV_type)
	{
		case TV_TSM2311Q:
			return(InitTSM2311Q());
			break;
		case TV_TSM2312S:
			break;
		default:
			break;
	}
}

//---------------------盛意电子TSM2311-Q------------------------------

//功能:设置TV制式
//参数:cTVMode={TV_PAL_DK,TV_PAL_I,TV_PAL_BG,TV_SECAM_L,TV_SECAM_L1}
//返回:设置成功返回0,否则返回1
bit SetModeTSM2311Q(unsigned char cTVMode)
{
	bit btmp;
	switch(cTVMode)
	{
		case TV_PAL_DK:
			btmp=SetTV_Module(TVMIDFREQ_WRITE,TSM2311Q_PALDK,4);
			if(!btmp)
			{
				Freq_VLMin=0x068E;	//Fp=45MHz,Fss=50K,Fip=38.9MHz
				Freq_VLMax=0x0FDF;	//Fp=164.25Mhz,Fss=50K,Fip=38.9MHz
				Freq_VHMax=0x2795;	//Fp=467.75Mhz,Fss=50K,Fip=38.9MHz
				Freq_UHFMax=0x4892;	//Fp=890MHz,Fss=50K,Fip=38.9MHz
			}
			break;
		case TV_PAL_I:
			return(SetTV_Module(TVMIDFREQ_WRITE,TSM2311Q_PALI,4));
			break;
		case TV_PAL_BG:
			return(SetTV_Module(TVMIDFREQ_WRITE,TSM2311Q_PALBG,4));
			break;
		case TV_SECAM_L:
			return(SetTV_Module(TVMIDFREQ_WRITE,TSM2311Q_SECAML,4));
			break;
		case TV_SECAM_L1:
			return(SetTV_Module(TVMIDFREQ_WRITE,TSM2311Q_SECAML1,4));
			break;
		default:
			return(OP_FAILURE);
			break;
	}
	return(btmp);
}


bit SetControlTSM2311Q(void)
{
    buf_eeprom[0]=0x06;
    buf_eeprom[1]=0xED;	//Fp=49.75
    buf_eeprom[2]=0xC8;	//Step Size 50KHz
    buf_eeprom[3]=0x01;	//VL
    buf_eeprom[4]=0xD8;
    buf_eeprom[5]=0x60;

	return(SetTV_Module(TVHIGHFREQ_WRITE,buf_eeprom,6));
}



bit InitTSM2311Q(void)
{
	bit rettmp;
	rettmp=SetModeTSM2311Q(TV_mode);
	if(rettmp)return(rettmp);
	rettmp=SetControlTSM2311Q();
	if(rettmp)return(rettmp);
	if(CurrentTVChannel<MAXCHANNELNUM)
		ModulateChannelTSM2311Q(CurrentTVChannel);
	rettmp=OP_SUCCESS;
	return(rettmp);
}

bit ModulateFreqTSM2311Q(unsigned int iFreq)
{
	buf_eeprom[0]=(unsigned char)(iFreq>>8);
	buf_eeprom[1]=(unsigned char)(iFreq&0x00FF);
    buf_eeprom[2]=0xC8;	//Step Size 50KHz

	if(iFreq<Freq_VLMax)buf_eeprom[3]=0x01;			//VL
	else if(iFreq<Freq_VHMax)buf_eeprom[3]=0x02;	//VH
	else buf_eeprom[3]=0x04;						//UHF

	buf_eeprom[4]=0xD8;

	switch(TV_mode)
	{
		case TV_PAL_DK:
			return(SetTV_Module(TVHIGHFREQ_WRITE,buf_eeprom,5));
			break;
		case TV_PAL_I:
			return(SetTV_Module(TVHIGHFREQ_WRITE,buf_eeprom,5));
			break;
		case TV_PAL_BG:
			return(SetTV_Module(TVHIGHFREQ_WRITE,buf_eeprom,5));
			break;
		case TV_SECAM_L:
			return(SetTV_Module(TVHIGHFREQ_WRITE,buf_eeprom,5));
			break;
		case TV_SECAM_L1:
			return(SetTV_Module(TVHIGHFREQ_WRITE,buf_eeprom,5));
			break;
		default:
			return(OP_FAILURE);
			break;
	}
}


void ModulateChannelTSM2311Q(unsigned char channel)
{

	ReadEEPROM((channel<<1)+TVCHANNEL0_ADDR,buf_eeprom,2);
	CurrentTVFreq=buf_eeprom[0];
	CurrentTVFreq<<=8;
	CurrentTVFreq+=buf_eeprom[1];
	ModulateFreqTSM2311Q(CurrentTVFreq);
}


//中间如何停?加ReadKEY
void SearchChannelTSM2311Q(void)
{
	unsigned int ifreq,detafreq,TmpFreq;
	unsigned char AFC_value,chlnum,TmpAFC,zerocnt;
	bit FL,bCheckFirst;
	ifreq=Freq_VLMin;
	FL=0;
	chlnum=0;
	bCheckFirst=1;
        zerocnt=0;
	for(ifreq=Freq_VLMin;ifreq<Freq_UHFMax;ifreq++)
	{
		ModulateFreqTSM2311Q(ifreq);
		ReadTV_Status(TVMIDFREQ_READ,buf_eeprom);
                if(FL)
                {
                   buf_eeprom[1]=buf_eeprom[0];
                   Delay(200);
                   ReadTV_Status(TVMIDFREQ_READ,buf_eeprom);
                   buf_eeprom[2]=buf_eeprom[0];
                   Delay(200);
		   		   ReadTV_Status(TVMIDFREQ_READ,buf_eeprom);
                   if(buf_eeprom[0]!=buf_eeprom[1] && buf_eeprom[1]==buf_eeprom[2])buf_eeprom[0]=buf_eeprom[1];
                }
                
		AFC_value=buf_eeprom[0]>>1;
		AFC_value &= 0x0F;
		if(AFC_value>7)AFC_value=15-AFC_value;
		FL=(bit)(buf_eeprom[0]&0x40);
		if(FL)
		{
//			if(bCheckFirst && AFC_value<5)
			if(bCheckFirst && AFC_value==0)
			{
				TmpFreq=ifreq;
				TmpAFC=AFC_value;
				bCheckFirst=0;
                zerocnt++;
			}
//			else if((!bCheckFirst) && AFC_value<TmpAFC)
			else if(!bCheckFirst && AFC_value==0)
			{
				TmpFreq=ifreq;
				TmpAFC=AFC_value;
                zerocnt++;
			}
		}
		else if(!bCheckFirst)
		{
			detafreq=ifreq-TmpFreq;
			if(detafreq<80 && AFC_value==7 && zerocnt==1)
			{
				if(chlnum>0)
				{
					ReadEEPROM(((chlnum-1)<<1)+TVCHANNEL0_ADDR,buf_eeprom,2);
					detafreq=buf_eeprom[0];
					detafreq<<=8;
					detafreq+=buf_eeprom[1];
					if(ifreq<detafreq+20)chlnum--;
				}
				buf_eeprom[0]=(unsigned char)(TmpFreq>>8);
				buf_eeprom[1]=(unsigned char)(TmpFreq&0x00FF);
				WriteEEPROM((chlnum<<1)+TVCHANNEL0_ADDR,buf_eeprom,2);
				chlnum++;

//				buf_eeprom[2]=0xFF;
//				SendBuffer(buf_eeprom,3);
			}
			bCheckFirst=1;
                        zerocnt=0;
		}

	}
	if(chlnum)
	{
		buf_eeprom[0]=chlnum;		//保存频道数目
        MaxChannelNum=chlnum;
		WriteEEPROM(TVCHANNELNUM_ADDR,buf_eeprom,1);

		CurrentTVChannel=0;			//调到第一个频道
		ModulateChannelTSM2311Q(CurrentTVChannel);
	}
}

//---------------------盛意电子TSM2311-Q END------------------------------

//modeflag= {TV_PAL_DK ,TV_PAL_I,TV_PAL_BG,TV_SECAM_L,TV_SECAM_L1)
//
//
/*
bit SetMode_JS6B2121(unsigned char modeflag)
{
   switch(modeflag)
   {
      case TV_PAL_DK :
           buf_eeprom[0]=JS121_PAL_DK[0];
           buf_eeprom[1]=JS121_PAL_DK[1];
           buf_eeprom[2]=JS121_PAL_DK[2];
           buf_eeprom[3]=JS121_PAL_DK[3];
           if(!SetTV_Module(TVMIDFREQ_WRITE,buf_eeprom,4))
           {
               TV_mode=modeflag;
               return(0);
           }
           break;
      case TV_PAL_I :
           buf_eeprom[0]=JS121_PAL_I[0];
           buf_eeprom[1]=JS121_PAL_I[1];
           buf_eeprom[2]=JS121_PAL_I[2];
           buf_eeprom[3]=JS121_PAL_I[3];
           if(!SetTV_Module(TVMIDFREQ_WRITE,buf_eeprom,4))
           {
               TV_mode=modeflag;
               return(0);
           }
           break;
      case TV_PAL_BG :
           buf_eeprom[0]=JS121_PAL_BG[0];
           buf_eeprom[1]=JS121_PAL_BG[1];
           buf_eeprom[2]=JS121_PAL_BG[2];
           buf_eeprom[3]=JS121_PAL_BG[3];
           if(!SetTV_Module(TVMIDFREQ_WRITE,buf_eeprom,4))
           {
               TV_mode=modeflag;
               return(0);
           }
           break;
      case TV_SECAM_L :
           buf_eeprom[0]=JS121_SECAM_L[0];
           buf_eeprom[1]=JS121_SECAM_L[1];
           buf_eeprom[2]=JS121_SECAM_L[2];
           buf_eeprom[3]=JS121_SECAM_L[3];
           if(!SetTV_Module(TVMIDFREQ_WRITE,buf_eeprom,4))
           {
               TV_mode=modeflag;
               return(0);
           }
           break;
      case TV_SECAM_L1 :
           buf_eeprom[0]=JS121_SECAM_L1[0];
           buf_eeprom[1]=JS121_SECAM_L1[1];
           buf_eeprom[2]=JS121_SECAM_L1[2];
           buf_eeprom[3]=JS121_SECAM_L1[3];
           if(!SetTV_Module(TVMIDFREQ_WRITE,buf_eeprom,4))
           {
               TV_mode=modeflag;
               return(0);
           }
           break;
      default:break;
   }
   return(1);
}

*/

//要求一表示TV制式的全局变量:TV_mode
/*bit AdjustTV_JS6B2121(unsigned int nVal)
{

 switch(TV_mode)
 {
  case TV_PAL_DK:
       if(nVal<0x1004)
            buf_eeprom[3]=0x01;        //VL
       else if(nVal<0x27C4)
            buf_eeprom[3]=0x02;   //VH
       else if(nVal<0x4680)
            buf_eeprom[3]=0x04;   //UHF
       else return(1);
       break;
  case TV_PAL_I:
       if(nVal<0x0E72)buf_eeprom[3]=0x01;         //VL
       else if(nVal<0x27C2)buf_eeprom[3]=0x02;    //VH
       else if(nVal<=0x4662)buf_eeprom[3]=0x04;   //UHF
       else return(1);
       break;
  case TV_PAL_BG:
       break;
  case TV_SECAM_L:
       if(nVal<0x07FF)                          //VL1  L'
       {
          SetMode_JS6B2121(TV_SECAM_L1);
          buf_eeprom[3]=0x01;
       }
       else if(nVal<0x0F10)buf_eeprom[3]=0x01;    //VL2
       else if(nVal<=0x2AA8)buf_eeprom[3]=0x02;   //UHF
       else if(nVal<=0x46DC)buf_eeprom[3]=0x04;   //UHF
       else return(1);
       break;
  case TV_SECAM_L1:
       if(nVal<0x07FF)                          //VL1  L'
           buf_eeprom[3]=0x01;
       else if(nVal<0x0F10)
       {
          SetMode_JS6B2121(TV_SECAM_L);
          buf_eeprom[3]=0x01;
       }
       else if(nVal<=0x2AA8)
       {
          SetMode_JS6B2121(TV_SECAM_L);
          buf_eeprom[3]=0x02;
       }
       else if(nVal<=0x46DC)
       {
          SetMode_JS6B2121(TV_SECAM_L);
          buf_eeprom[3]=0x04;
       }
       else return(1);
       break;
  default:
       break;
 }
 buf_eeprom[0]=(unsigned char)(nVal>>8);
 buf_eeprom[1]=(unsigned char)(nVal&0x00FF);
 buf_eeprom[2]=0xC8;
 buf_eeprom[4]=0xD8;
 buf_eeprom[5]=0x60;
 return(SetTV_Module(TVMIDFREQ_WRITE,buf_eeprom,6));
}

*/

⌨️ 快捷键说明

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