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

📄 v46x_panel.c

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

extern 	void 			I2C_Write(unsigned char,unsigned char,unsigned char,unsigned char *);
extern 	void 			I2C_Read(unsigned char,unsigned char,unsigned char,unsigned char *);
extern 	void 			I2C_WriteByte(unsigned char,unsigned char,unsigned char);
extern 	unsigned char 	I2C_ReadByte(unsigned char,unsigned char);
	
extern	unsigned char	CVD1_ReadWrite(unsigned char, unsigned char, unsigned char);

void	V46X_Set_ScanLines(unsigned char);


bit		V46X_If_CorrectCS();


#define V46X_WRID		0x28
#define W_TYPE			0x01		//Type for Write in CVD1 
#define R_TYPE			0x00

extern	unsigned char ColorEN;

//unsigned char	_Color = NTSC, _Source = VIDEO1, _Screen = 0, _HPosition = 0x20, _VPosition = 0;
unsigned char	_Scan = S525, _Color = NTSC, _Source = VIDEO1, _Screen = 0, _HPosition = 0x20, _VPosition = 0;

code unsigned char	_VStatus[8] =
{
	0x00, // NTSC 
	0x05, // PAL
	0x06, // SECAM
	0x01, // PAL M
	0x05, // PAL N
	0x01, // PAL 60
	0x00, // NTSC 433
	0x04, // NTSC N
};

void _Delay(unsigned int value)
{
	while(value>0) 
		value--;
}

void	V46X_RegInit()
{

// 	I2C_WriteByte(V46X_WRID, 0xAD, 0x07);				//Enable TV-Decoder source detect interrupt

	I2C_Write(V46X_WRID, 0x00, 0x87, TCON_Ctrl);		//V462 Reg. from 0x00~ 0x86
	I2C_WriteByte(V46X_WRID, 0xA7, TCON_Ctrl[0x87]);	//RGBDAC output voltage
	
//	I2C_WriteByte(V46X_WRID, 0x90, 0x04);				//Dither ON	(Digital Panel)	*
//	I2C_WriteByte(V46X_WRID, 0x92, 0x20);				//			(Digital Panel)	*

	V46X_Gamma_Init();	
}

void	V46X_Gamma_Init()
{
	unsigned char i;
	
	I2C_WriteByte(V46X_WRID, 0x0C, 0xF6);
	for (i=0;;i++)
	{
		I2C_WriteByte(V46X_WRID, 0x15, Gamma_Table2[i]);
		I2C_WriteByte(V46X_WRID, 0x15, Gamma_Table2[i]);
		I2C_WriteByte(V46X_WRID, 0x15, Gamma_Table2[i]);
		if ( i == 0xFF )
			break;
	}
	I2C_WriteByte(V46X_WRID, 0x0C, 0xFA);
}

void 	V46X_HV(bit horizontal, bit vertical)
{
	unsigned char 	hv;
	
	hv = TCON_Ctrl[0x60];

	if ( horizontal )
		hv ^= 0x18;
	if ( vertical )
		hv ^= 0x60;

	I2C_WriteByte(V46X_WRID, 0x60, hv);
}

bit		V46X_If_Signal_In()
{
	unsigned char r3A;
	
	r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00) & 0x1;
	
	if ( r3A == 0x0 )
		return	1;
	else
		return	0;	
}


void	V46X_VideoSource(unsigned char video_source)
{
	_Source = video_source;
	
	if ( _Source <= SVIDEO2 )
	{
		V46X_Change_Mode(_Source, _Color, _Screen);
		return;
	}
}


void	V46X_Set_ScreenMode(unsigned char screen_mode)
{
	_Screen = screen_mode;
}

void	V46X_ScreenMode(unsigned char screen_mode)
{
	_Screen = screen_mode;
//	_Screen = 0;

	I2C_WriteByte(V46X_WRID, 0x1A, 0x80);				// Turn OFF Screen;
	
	I2C_Write(V46X_WRID, 0x08, 0x03, &TCON_Scaler[_Screen][_Scan][0]);
	I2C_Write(V46X_WRID, 0x38, 0x28, &TCON_Scaler[_Screen][_Scan][3]);
	
	_Delay(20000);
//	I2C_WriteByte(V46X_WRID, 0x1A, 0x40);				// Turn ON Screen;
}

unsigned char V46X_Get_ColorSystem()
{
	return	_Color;
}

void	V46X_ColorSystem(unsigned char color_system)
{
	unsigned char	i,R00;

	_Color = color_system;
	
	if ( _Source == SVIDEO1 || _Source == SVIDEO2)
		R00 = VideoSTD_Data[_Color][0] | 0x1;
	else
		R00 = VideoSTD_Data[_Color][0];

	if ( _Scan == S625 )
		R00 = R00 | 0x30;
	else
		R00 = R00 & 0xCF;

	CVD1_ReadWrite(W_TYPE, 0x00, R00);

	for (i=1; i<19; i++)
		CVD1_ReadWrite(W_TYPE, VideoSTD_Addr[i], VideoSTD_Data[_Color][i]);
	_Delay(20000);
}

unsigned char	V46X_Detect_ColorSystem()
{
	unsigned char r3A,r3C;
	
	r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
	r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
	if ( (r3C&0x8) || (r3A&0x1) )						// Noisy or NO Signal
		return	_Color;
	if ( V46X_If_CorrectCS() )
		return	_Color;

	_Delay(200);
	r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
	r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
	if ( (r3C&0x8) || (r3A&0x1) )						// Noisy or NO Signal
		return	_Color;
	if ( V46X_If_CorrectCS() )
		return	_Color;
		
	_Delay(200);
	r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
	r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
	if ( (r3C&0x8) || (r3A&0x1) )						// Noisy or NO Signal
		return	_Color;
	if ( V46X_If_CorrectCS() )
		return	_Color;		

	I2C_WriteByte(V46X_WRID, 0x1A, 0x80);				// Turn OFF Screen;

	_Delay(50000);
	_Delay(30000);
	
	r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
	r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
	
	if ( r3A&0x1 )										// No Signal
	{
//		I2C_WriteByte(V46X_WRID, 0x1A, 0x40);			// Turn ON Screen;
		return	_Color;
	}
	
	if ( (r3C&0x4) )									// 625 Detected
	{
		if ( ColorEN&0x2 )
		{
			V46X_ColorSystem(PAL);
			if ( V46X_If_CorrectCS() )
			{

//				I2C_WriteByte(V46X_WRID, 0x1A, 0x40);	// Turn ON Screen;
					return	_Color;
			}
		}
			
		if ( ColorEN&0x4 )
			V46X_ColorSystem(SECAM);
	}
	else
	{
		V46X_ColorSystem(NTSC);
	}

//	I2C_WriteByte(V46X_WRID, 0x1A, 0x40);				// Turn ON Screen;
	return _Color ;		
}

unsigned char	V46X_Detect_ColorSystem_AV()
{
	unsigned char r3A,r3C;
	
	r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
	r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
			
	if ( r3A&0x1 )										// No Signal
		return	_Color;
		
	while (1)
	{
		if ((r3C&0x4) && _Color != PAL )
			break;
		if ( (r3C&0x4)==0 && _Color != NTSC )
			break;
		if ( !V46X_If_CorrectCS() )
			break;
		return	_Color;
	}
		
/*		
	if ( r3A&0x1 )										// No Signal
		return	_Color;
	if ( (r3C&0x4) && _Color == PAL )
		return	_Color;
	if ( (r3C&0x4)==0 && _Color == NTSC )
		return	_Color;
		
	_Delay(500);
	r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
	r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);
		
	if ( r3A&0x1 )										// No Signal
		return	_Color;
	if ( (r3C&0x4) && _Color == PAL )
		return	_Color;
	if ( (r3C&0x4)==0 && _Color == NTSC )
		return	_Color;
		
	_Delay(500);
	r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
	r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);

		
	if ( r3A&0x1 )										// No Signal
		return	_Color;
	if ( (r3C&0x4) && _Color == PAL )
		return	_Color;
	if ( (r3C&0x4)==0 && _Color == NTSC )
		return	_Color;

*/
	I2C_WriteByte(V46X_WRID, 0x1A, 0x80);				// Turn OFF Screen;

	_Delay(60000);
	_Delay(60000);

	r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
	r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);

	if ( r3A&0x1 )										// No Signal
		return	_Color;
		
	if ( r3C&0x4 )
	{
		V46X_Set_ScanLines(S625);
		V46X_ColorSystem(PAL);
	}
	else
	{
		V46X_Set_ScanLines(S525);
		V46X_ColorSystem(NTSC);
	}
		
//	I2C_WriteByte(V46X_WRID, 0x1A, 0x40);				// Turn ON Screen;
	return	_Color;
}

void	V46X_Set_ScanLines(unsigned char scan)
{
	unsigned char	R00;
	
	_Scan = scan;
	
	R00 =  CVD1_ReadWrite(R_TYPE, 0x00, 0x00);	
	if ( _Scan )
		R00 = R00 | 0x30;
	else
		R00 = R00 & 0xCF;
	CVD1_ReadWrite(W_TYPE, 0x00, R00);
	
	CVD1_ReadWrite(W_TYPE, 0x3F, 0x01);
	CVD1_ReadWrite(W_TYPE, 0x3F, 0x00);

	I2C_Write(V46X_WRID, 0x08, 0x03, &TCON_Scaler[_Screen][_Scan][0]);
	I2C_Write(V46X_WRID, 0x38, 0x28, &TCON_Scaler[_Screen][_Scan][3]);
	
	_Delay(20000);
}

void	V46X_Detect_ScanLines()
{
	unsigned char r3A,r3C;
	
	r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
	r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);	

	if ( r3A&0x1 )										// No Signal
		return ;
	if ( (r3C&0x4)==4 && _Scan == S625 )
		return ;
	if ( (r3C&0x4)==0 && _Scan == S525 )
		return ;

	I2C_WriteByte(V46X_WRID, 0x1A, 0x80);
	
	if ( r3C&0x4 )
		V46X_Set_ScanLines(S625);
	else
		V46X_Set_ScanLines(S525);

	_Delay(20000);
}

bit		V46X_If_CorrectCS()
{
	unsigned char r3A,r3C;	

	r3A = CVD1_ReadWrite(R_TYPE, 0x3A, 0x00);
	r3C = CVD1_ReadWrite(R_TYPE, 0x3C, 0x00);

/*
	if ( _Color == SECAM )
	{
		if ( (r3A&0x8) == 0x08 && (r3C&0x7) == 0x6 )					// Chroma Locked
			return	1;													// and In correct color system
		else
			return	0;
	}
*/	
	if ( (r3A&0x8) == 0x08 && (r3C&0x3) == (_VStatus[_Color]&0x3) )		// Chroma Locked
		return	1;														// and In correct color system
	else
		return	0;
}

void	V46X_Change_Mode(unsigned char video_source, unsigned char color_system,
						 unsigned char screen_mode )
{
	unsigned char	i;
	
	_Source = video_source;
	_Color = color_system;
	_Screen = screen_mode;

	I2C_WriteByte(V46X_WRID, 0x1A, 0x80);				//Turn OFF Screen;

	I2C_WriteByte(V46X_WRID, 0x00, 0x60);
	I2C_WriteByte(V46X_WRID, 0x01, 0x01);
	I2C_WriteByte(V46X_WRID, 0x05, 0x00);

	I2C_Write(V46X_WRID, 0x08, 0x03, &TCON_Scaler[_Screen][_Scan][0]);
	I2C_Write(V46X_WRID, 0x38, 0x28, &TCON_Scaler[_Screen][_Scan][3]);
	
	for (i=0; i<9; i++)
		CVD1_ReadWrite(W_TYPE, VideoSUR_Addr[i], VideoSUR_Data[_Source][i]);
		
	if ( _Source == SVIDEO1 || _Source == SVIDEO2 )
		i = VideoSTD_Data[_Color][0] | 0x1;
	else
		i = VideoSTD_Data[_Color][0];
		
	if ( _Scan == S625 )
		i = i | 0x30;
	else
		i = i & 0xCF;

	CVD1_ReadWrite(W_TYPE, 0x00, i);

	for (i=1; i<19; i++)
		CVD1_ReadWrite(W_TYPE, VideoSTD_Addr[i], VideoSTD_Data[_Color][i]);
		
	_Delay(60000);
//	I2C_WriteByte(V46X_WRID, 0x1A, 0x40);				//Turn ON Screen;
}

⌨️ 快捷键说明

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