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

📄 tv_tuner.c

📁 mtv512mg + mx88v462 液晶电视驱动C完整程序
💻 C
字号:
#include 	"..\inc\public2.h"
#include	"..\inc\Tuner_FP_Tab.h"

BYTE	RegB,RegC,RegE;

void 		I2C_SendStart2();
void 		I2C_SendStop2();
void 		I2C_SendByte2(BYTE);
BYTE 		I2C_GetByte2(bit);

long int	_Fp = Fp_VL_Start;
BYTE		_SIF = 0;
BYTE		_CS = 0;
BYTE		_FINE = 0x80;

extern	void	I2C_Delay(unsigned char);

void 	TV_Init()
{
	#ifdef	DEMOD_WRID
		Set_SIF(2);
		Set_DEMOD();
	#endif
	
	Set_Fosc(Fp_VL_Start,_FINE);
}

unsigned int	Set_VL()
{
	Set_Fosc(Fp_VL_Start,0x80);
	return	Fp_VL_Start;	
}

unsigned int	Set_VH()
{
	Set_Fosc(Fp_VH_Start,0x80);
	return	Fp_VH_Start;
}

unsigned int	Set_UHF()
{
	Set_Fosc(Fp_UHF_Start,0x80);
	return	Fp_UHF_Start;
}

void 	Set_Fosc( unsigned int fp_p, unsigned char fine)
{
	BYTE	i, tmp;

	if ( (fp_p >= Fp_VL_Start) && (fp_p < Fp_VH_Start) )
		tmp = PLL_CTR2_VL;					// V-L
	else if ( (fp_p >= Fp_VH_Start) && (fp_p < Fp_UHF_Start) )
		tmp = PLL_CTR2_VH;					// V-H
	else if ( fp_p <= Fp_UHF_End )
		tmp = PLL_CTR2_UHF;					// UHF
	else
	{
		tmp = PLL_CTR2_VL;
		fp_p = Fp_VL_Start;
	}

    I2C_SendStart2();
    I2C_SendByte2(PLL_WRID);				//Write W_ID
	if ( fp_p >= _Fp )
	{
	    I2C_SendByte2((Fp_Table[fp_p]+Fif+fine-0x80)/256);
	    I2C_SendByte2((Fp_Table[fp_p]+Fif+fine-0x80)%256);
	    I2C_SendByte2(PLL_CTR1);
	    I2C_SendByte2(tmp);					//VL VH UH select
	}
	else
	{
	    I2C_SendByte2(PLL_CTR1);
	    I2C_SendByte2(tmp);					//VL VH UH select
	    I2C_SendByte2((Fp_Table[fp_p]+Fif+fine-0x80)/256);
	    I2C_SendByte2((Fp_Table[fp_p]+Fif+fine-0x80)%256);
	}	
	I2C_SendStop2();						//Stop 
	  	
	_Fp = fp_p;
	_FINE = fine;
	   	
	for(i=0;i<200;i++)
	{
	   	I2C_SendStart2();
	   	I2C_SendByte2(PLL_WRID|0x1);		//Write W_ID
	   	tmp = I2C_GetByte2(1);
	   	I2C_SendStop2();
	   	if ( (tmp&0xC0) == 0x40 )			// Locked 
	   		break;
	}

	for(i=0;i<200;i++);						// Delay
	
	#ifdef	DEMOD_WRID
		if ( TV_If_AFC() )
			for(i=0;i<250;i++);				// Delay
	#endif
}

#ifdef	DEMOD_WRID

	void	Set_CS(BYTE	cs)
	{
		_CS = cs;
	}

	void	Set_SIF(BYTE sif)
	{
		_SIF = sif;
	}
	
	void 	Set_DEMOD()
	{
		BYTE	sif;

		switch (_CS)
		{
			case	NTSC	:
			case	NTSC443	:
			case	NTSCN	:
				_CS	= NTSC;
				break;
			default			:
				_CS = PAL;
				break;
		}
	
		switch ( _SIF )
		{
			case	M:
				sif = 0;
				break;
			case	BG:
				sif = 1;
				break;
			case	DK:
				sif = 3;
				break;
			case	I:
				sif = 2;
				break;
			case	L:
				_CS = SECAM;
				sif = 3;
				break;
		}

		switch (_CS)
		{
			case	NTSC:
				RegB = 0x16;
				RegC = 0x30;					// -16dB takeover
				RegE = 0x00;
				break;
			case	PAL:
				RegB = 0xD6;//0xD6;
				RegC = 0x70;//60				// -16dB takeover
				RegE = 0x00;//0x40;
				break;
			case	SECAM:						// SECAM L
				RegB = 0x06;//0x46;
				RegC = 0x70;//0x50;				// 0 dB takeover
				RegE = 0x00;//40
				break;
		}
		
//		RegB = RegB | 0x01;						// Sound trap bypass
	
		#ifdef	PIF_38_9
			RegE = RegE | 0x08 | sif;			// 08 for VIF38.9MHz
		#endif

		#ifdef	PIF_38_0
			RegE = RegE | 0x0C | sif;			// 0C for VIF38.0MHz
		#endif
		
/*
		RegB = 0xC6;//0x16;
		RegC = 0x60;//0x70;
		RegE = 0x89;
*/		
		I2C_SendStart2();
		I2C_SendByte2(DEMOD_WRID);				// Write W_ID
		I2C_SendByte2(0x0);
	
		I2C_SendByte2(RegB);
		I2C_SendByte2(RegC);
		I2C_SendByte2(RegE);
	
		I2C_SendStop2();	
	}
	
	bit		TV_If_AFC()
	{
		BYTE	d_status;
		
		I2C_SendStart2();
		I2C_SendByte2(DEMOD_WRID|0x01);			//Write W_ID
		d_status = I2C_GetByte2(1);
		I2C_SendStop2();
	
		if ( (d_status&0xC0) == 0xC0 )
			return	1;
		else
			return	0;
	}

	bit		TV_If_Locked()
	{
		BYTE	d_status;
		
		I2C_SendStart2();
		I2C_SendByte2(DEMOD_WRID|0x01);			//Read W_ID
		d_status = I2C_GetByte2(1)&0xDF;
		I2C_SendStop2();
	
		if ( (d_status==0xC4) ||(d_status==0xC2) || (d_status==0xC0) || (d_status==0xDE) || (d_status==0xDC) )
			return	1;
		else
			return	0;
	}
#endif

void 	I2C_SendStart2(void)
{
	I2C_SDA2 = 1;
	I2C_Delay(2);
	I2C_SCL2 = 1;
	I2C_Delay(2);
		
	I2C_SDA2 = 0;
	I2C_Delay(2);	
	I2C_SCL2 = 0;
	I2C_Delay(2);
}

void 	I2C_SendStop2(void)
{
	I2C_SDA2 = 0;
	I2C_Delay(2);	
	I2C_SCL2 = 1;		
	I2C_Delay(2);
	I2C_SDA2 = 1;		
	I2C_Delay(2);
}

void 	I2C_SendByte2(BYTE val)
{
	BYTE i;

    for (i=0; i<8; i++)
    {
    	I2C_SDA2 = (bit)(val & 0X80);
    	I2C_Delay(2);
		I2C_SCL2 = 1;
		val <<= 1;
		I2C_Delay(2);
		I2C_SCL2 = 0;
		I2C_Delay(2);
    }

	I2C_SDA2 = 1;
	I2C_Delay(2);
	I2C_SCL2 = 1;
	I2C_Delay(2);
	I2C_SCL2 = 0;
	I2C_Delay(2);
}

BYTE 	I2C_GetByte2(bit ACK_NACK)
{
    BYTE i;
    BYTE rd_byte;

    rd_byte = 0;

    for(i=0; i<8; i++)
    {
		I2C_SCL2 = 1;
        rd_byte <<= 1;
		I2C_Delay(2);
		rd_byte |= I2C_SDA2;
		I2C_SCL2 = 0;
		I2C_Delay(2);
    }

	I2C_SDA2 = ACK_NACK;
	I2C_Delay(2);
	I2C_SCL2 = 1;
	I2C_Delay(2);
	I2C_SCL2 = 0;
	I2C_Delay(2);
	I2C_SDA2 = 1;
	I2C_Delay(2);
	
    return(rd_byte);
}

⌨️ 快捷键说明

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