📄 tvmodule.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 + -