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

📄 main.c

📁 mtv512mg + mx88v462 液晶电视驱动C完整程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	Write_OSDCode(buf, 2, 1, 0);						//Write OSD Code buffer
	OSD_Attribute(0, 2, FG_COLOR, BG_COLOR);			//Set Title line attribute
	Show_Subwin(0x80);	
}

void	Show_VideoMode()
{
	TitleFlag = 1;
	VolumeFlag = 0;
	MenuFlag = 0;
	Input_Num = 0;	
	Show_Subwin(0x00);
	
	OSDTimer = 1000;
	
	if ( Screen_mode )
		OSD_SubWin_Attr(7,7,1,9,2,0);
	else
		OSD_SubWin_Attr(7,3,1,9,2,0);
	
	if ( Source_type == TV_CHL )
	{
		memcpy(buf, OSD_Table_Video[12], 9);
		Show_Number(Channel,&buf[3]);
		
		memcpy(buf+9, OSD_Table_Video_Type[Video_SYS],9);
		if ( Video_SYS == PAL )
			memcpy(buf+13,OSD_Table_Sound_Type[SIF],3);
		if ( Video_SYS == SECAM )
			memcpy(buf+15,OSD_Table_Sound_Type[SIF],3);
	}
	else
	{
		memcpy(buf, OSD_Table_Video[Source_type], 9);
		memcpy(buf+9, OSD_Table_Video_Type[8],9);
	}

	Write_OSDCode(buf, 9, 2, 0);						//Write OSD Code buffer
	OSD_Attribute(0, 18, FG_COLOR, BG_COLOR);			//Set Title line attribute
	
	Show_Subwin(0x80);
}

/**--------------------------------------------------------------------------
* Name			Show_Bar(BYTE *buf, BYTE input)
*
* Description	Show Mtc on screen
*
* Flow Chart
*
* Return
*
* DATE          Author          Description
* ===========================================================================
* 2005-06-23    Microntek       Created
*/
void Show_Bar(BYTE *buf, BYTE value)
{
	BYTE	i;

	if ( value >= 50 )
		value = 51;
		
	buf[0] = 0x3E;
	buf[18] = 0x42;
	
	for (i=0; i< 17; i++)
	{
		if (value<=i*3)
			buf[i+1] = 0x41;
		else if (value >= (i+1)*3)
			buf[i+1] = 0x82;
		else
			buf[i+1] = 0x7F + value%3;
	}
}

void Show_TV_Bar(BYTE *buf, unsigned long int Fp_P)
{
	BYTE	value;
	
	if ( (Fp_P >= Fp_UHF_Start) && (Fp_P <= Fp_UHF_End) )
		value = (Fp_P-Fp_UHF_Start)*52/(Fp_UHF_End-Fp_UHF_Start);
	else if ( (Fp_P >= Fp_VH_Start) && (Fp_P < Fp_UHF_Start) )
		value = (Fp_P-Fp_VH_Start)*52/(Fp_UHF_Start-Fp_VH_Start-1);
	else if ( (Fp_P >= Fp_VL_Start) && (Fp_P < Fp_VH_Start) )
		value = (Fp_P-Fp_VL_Start)*52/(Fp_VH_Start-Fp_VL_Start-1);
	else
		value = 0;
	
	Show_Bar(buf,value);
}

void Set_HV()
{
//	BYTE	buf[2];
	
//	Show_Subwin(0x00);
	
	V46X_HV(Horizontal,Vertical);
/*
	buf[0] = 0x00;
	buf[1] = 0x00;
		
	if ( Horizontal )
		buf[0] = 0x80;
	if ( Vertical )
		buf[1] = 0x80;

	Write_OSDReg(buf, SEL_OSDCTRLREG, 2, 0x04);
		
	Show_HV();
*/
}

void	Power_On()
{
	OnOff = 1;					// On Off flag
//	POWER = 0;
	LED_R = 1;
	
	Horizontal = 0;
	Vertical = 0;
	
	Load_Factory();
	V46X_Init();
	Load_Parameter();
 	
	Set_VideoPP(0);
	Set_HV();
	V46X_Set_ScreenMode(Screen_mode);
		
	C_Input = 0;
	Input_Num = 0;

	Idle_Mode();
	
	Set_SourceType();
	MuteFlag = 0;
	_Volume = 0xFF;
	_Hue = 0xFF;
	
	MuteFlag = 0;
	;//AUDIO_MUTE = 0;
}

void	Power_Off()
{
	;//AUDIO_MUTE = 1;
	
	OnOff = 0;
	
	LED_R = 0;
	
	Mute();
	
	PanelOFF;
	ScreenOFF;
}

void	To_Idle_Mode()
{
	if ( MenuFlag || TitleFlag || VolumeFlag )
	{
		Idle_Mode();
		Show_Mute();	
	}
}

void	Idle_Mode()
{
	Show_Subwin(0x00);
	Clr_OSDCode();

	Search_Flag = 0;

	VolumeFlag = 0;
	MenuFlag = 0;
	TitleFlag = 0;
	Menu_mode = 0;

	OSDTimer = 0;

	C_Input = 0;
	Input_Num = 0;
}

void	MCU_Init()
{
	OPTION = 0x21;					// Double clock, P7.7 Enable
	PADMOD0	= 0x00;					// AD3-AD0/P6.3-P6.0
	PADMOD1	= 0x1F;					// P5.5-P5.0/DA5-DA0
	PADMOD3 = 0xDF;					// P5.7-P5.0 Output/Input
	PADMOD4 = 0x00;					// P6.7-P6.0 Output/Input
	PADMODF = 0xC0;					// P7.7-P7.6 Output/Input

	;//AUDIO_MUTE	= 1;
									// ISP_CHECK
	EINT1PEN = 0x80;
	if ( P3_3 == 1 )				// Debug Mode
	{
		PADMOD2 = 0;				// ISP DIsable
	}
	
	Timer_Init();					//Setting 8051 baud rate and timer clock	//
}

void	Mute()
{
	;//AUDIO_MUTE = 1;
	Adj_Volume(0);
}

void	SpkOut()
{
	;//AUDIO_MUTE = 0;
	Adj_Volume(Volume);
}
/*
void	SoundSystem_Check()
{
	if ( (SoundEN&0x1F) == 0x00 )
		SoundEN = 0x1F;
}
*/
void	SoundSystem_Up()
{
	for(;;)
	{
		if (SIF < 4)
			SIF++;
		else
			SIF = 0;
		if ( (0x1<<SIF) & SoundEN )
		{
			if ( (Video_SYS == NTSC || Video_SYS == PALM || Video_SYS == PALN) && SIF == M )
				return;
			else if ( Video_SYS == PAL && (SIF == BG || SIF == DK || SIF == I ) )
				return;
			else if ( Video_SYS == SECAM && (SIF == BG || SIF == DK || SIF == L ) )
				return;
			if ( Video_SYS == NTSC443 && SIF == M )
				return;	
		}			
	}
}

void	SoundSystem_Down()
{
	for(;;)
	{
		if (SIF != 0)
			SIF--;
		else
			SIF = 4;
		if ( (0x1<<SIF) & SoundEN )
		{
			if ( (Video_SYS == NTSC || Video_SYS == PALM || Video_SYS == PALN ) && SIF == M )
				return;
			else if ( Video_SYS == PAL && (SIF == BG || SIF == DK || SIF == I ) )
				return;
			else if ( Video_SYS == SECAM && (SIF == BG || SIF == DK || SIF == L ) )
				return;
			if ( Video_SYS == NTSC443 && SIF == M )
				return;	
		}			
	}
}
/*
void	ColorSystem_Check()
{
	switch ( ColorEN )
	{
		case	0x00 :
			ColorEN = 0x02;
		case	0x02 :
			Video_SYS = PAL;
			return;
		case	0x01 :
			Video_SYS = NTSC;
			return;
		case	0x04 :
			Video_SYS = SECAM;
			return;
		default		 :
			ColorEN = ColorEN | 0x08;
			break;
	}
	if ( (0x1<<Video_SYS) & ColorEN )
		return;

	Video_SYS = 3;
	return;
}
*/
void	ColorSystem_Up()
{
	for(;;)
	{
		if (Video_SYS < NTSC443)
			Video_SYS++;
		else
			Video_SYS = 0;

		if ( (0x1<<Video_SYS) & ColorEN )
			return;
	}
}

void	ColorSystem_Down()
{
	for(;;)
	{
		if (Video_SYS != 0)
			Video_SYS--;
		else
		{
			Video_SYS = NTSC443;
		}
		if ( (0x1<<Video_SYS) & ColorEN )
			return;
	}
}

//------------------------------------------------------------------------------
//	TV Subroutine
//------------------------------------------------------------------------------

void 	Channel_Up()
{
	BYTE	chl;

//	ScreenOFF;
		
	for (chl=(Channel+1)&0x7F;chl!=Channel; chl=(chl+1)&0x7F)
	{
		if (chl > 99 )
			chl = 99;
		if ( !(TV_Skip[chl/8] & (1<<(chl%8))) )
		{
			Channel = chl;
			break;
		}
		if	(chl >= 99)		
			chl = 0x7F;		
	}
	 
	if (Source_type == TV_CHL )
	{
		Show_Channel();
		Show_VideoMode();
	}
	else
	{
		S_Source_type = Source_type = TV_CHL;
		Set_SourceType();
	}
}

void 	Channel_Down()
{
	BYTE	chl;
	
//	ScreenOFF;
	
	for (chl=(Channel-1)&0x7F;chl!=Channel; chl=(chl-1)&0x7F)
	{
		if	(chl >= 0x7F)
			chl = 99;
		if ( !(TV_Skip[chl/8] & (1<<(chl%8))) )
		{
			Channel = chl;
			break;
		}
	} 
						
	if (Source_type == TV_CHL )
	{
		Show_Channel();
		Show_VideoMode();
	}
	else
	{
		S_Source_type = Source_type = TV_CHL;
		Set_SourceType();
	}
}

void	Set_Channel_Skip()
{
	if (Skip)
		TV_Skip[Channel/8] = TV_Skip[Channel/8] | (1<<(Channel%8)) ;
	else
		TV_Skip[Channel/8] = TV_Skip[Channel/8] & (~(1<<(Channel%8))) ;
}

bit		Get_Channel_Skip()
{
	return	(TV_Skip[Channel/8] & (1<<(Channel%8)));
}

void	Save_Channel()
{
	Save_Channel_Info();
	Save_Channel_Skip();
}

void	Save_Channel_Info()
{
	BYTE	channel_data[4];
	
	channel_data[0]=Fp_Position%256;
	channel_data[1]=Fp_Position/256;
	channel_data[2]=Video_SYS|(SIF<<4);
	channel_data[3]=Fine_Turn;
	
/*	
	if(cn>63)
	{
		cn-=36;		
		I2C_Write(EEPROM_WRID,cn*4, 0x4, channel_data);
	}
	else
	 	I2C_Write(EEPROM_WRID|0x2,cn*4, 0x4, channel_data);
	Delay(2000);
*/	
	if ( Channel <64 )
		I2C_Write(EEPROM_WRID|0x2, Channel*4, 0x4, channel_data);
	else if ( Channel <100 )
	{
		I2C_Write(EEPROM_WRID, (Channel-36)*4, 0x4, channel_data);
	}	
	Delay(3000);

	Set_Channel_Skip();
}

void	Save_Channel_Skip()
{
	I2C_Write(EEPROM_WRID, 0x20, 0x10, TV_Skip);		//Write TV skip info
	Delay(3000);
}

void	Load_Channel()
{
	BYTE	channel_data[4];
	
	if ( Channel <64 )
		I2C_Read(EEPROM_WRID|0x2, Channel*4, 0x4, channel_data);
	else if ( Channel <100 )
		I2C_Read(EEPROM_WRID, (Channel-36)*4, 0x4, channel_data);
	
	Fp_Position = channel_data[1]*256 + channel_data[0];
	Video_SYS = channel_data[2]&0xF;
	SIF = channel_data[2]>>4;
	Fine_Turn = channel_data[3];
	
	if ( (Fp_Position < Fp_VL_Start) || (Fp_Position > Fp_UHF_End) )
		Fp_Position = Fp_VL_Start;
		
	if ( SIF > L )
		SIF = BG;

	if ( Video_SYS >= 5 )
		Video_SYS = NTSC;
		
	if (Fine_Turn>0x8A || Fine_Turn<0x76)
		Fine_Turn = 0x80;
		
	I2C_Read(EEPROM_WRID, 0x20, 0x10, TV_Skip);		//Read TV skip info
	Skip = Get_Channel_Skip();
}

void 	Show_Channel()
{
	ScreenOFF;
	
	Mute();
	
	Delay(4000);
	
	Load_Channel();

	Set_CS(Video_SYS);
	Set_SIF(SIF);
	Set_DEMOD();
	Set_Fosc(Fp_Position,Fine_Turn);
	Delay(4000);
	Auto_Detect_TV_in();
	Auto_Detect_TV_in();
	Auto_Detect_TV_in();
}

void	Save_Channel_Default()
{
	Fp_Position = Fp_VL_Start;
	Video_SYS = NTSC;
	SIF = M;
	Skip = 1;
	Fine_Turn = 0x80;
	
	for(Channel=0; Channel<128; Channel++)
		Save_Channel_Info();

	Save_Channel_Skip();
}

void	Search_TV()
{
	if ( !Search_Flag )
		return ;

	OSDTimer = 1000;

	switch	(Search_Flag)
	{
		case 3:
			if (Fp_Position<= Fp_VL_Start)
				Fp_Position = Fp_UHF_End;
			else
				Fp_Position--;
			break;
		case 4:
			if (Fp_Position>= Fp_UHF_End )
				Fp_Position = Fp_VL_Start;
			else
				Fp_Position++;
			break;
		case 5:
			if ( Auto_Start )
			{
				Auto_Start = 0;
				break;
			}
			if ( Fp_Position >= Fp_UHF_End ) 
			{
				Skip = 1;
				for (;Channel <= 99; Channel++ )
					Set_Channel_Skip();
				Save_Channel_Skip();
				
				Channel = 0;
				Show_Channel();
				Idle_Mode();
				Show_VideoMode();
				return;
			}
			else
				Fp_Position ++;
			break;
	}
	Set_Fosc(Fp_Position, 0x80 );
	Show_MainMenu1();
	Show_MainMenu2();
	Delay(20000);
	
	if ( TV_If_Locked() )
	{
		Delay(30000);
		
		if ( V46X_If_Signal_In() )
		{
			if( (Search_Flag == 3) || (Search_Flag == 4) )
			{
				Search_Flag = 0;
				Save_Channel();
			}
			else
			{
				Skip = 0;
				Save_Channel();
	
//				Delay(20);
//				Auto_Detect_TV_in();
				Delay(20000);
				
				Skip = 1;
				Channel = (Channel+1)&0x7F;
				if ( Channel > 99 )
				{
					Channel = 0;
					Show_Channel();
					Idle_Mode();
					Show_VideoMode();
					return;
				}
			}
		}
	}
}

//------------------------------------------------------------------------------
//	Language Subroutine
//------------------------------------------------------------------------------

void	Language_Check()
{
	if ( !Language_Enable[Language] )
		Language = 0;
}
		
void	Language_Up()
{
	for(;;)
	{
		if (Language<7)
			Language ++;
		else
			Language =0;
		if ( Language_Enable[Language] )
			return;
	}
}

void	Language_Down()
{
	for(;;)
	{
		if (Language)
			Language --;
		else
			Language =7;
		if ( Language_Enable[Language] )
			return;
	}
}

void	Screen_Blue()
{
	if ( Blue_back )
		CVD1_ReadWrite(W_TYPE, 0x07, 0x20);
	else
		CVD1_ReadWrite(W_TYPE, 0x07, 0x30);
}

//------------------------------------------------------------------------------
//	Parameter Subroutine
//------------------------------------------------------------------------------

void	Save_Parameter()
{
	I2C_Write(EEPROM_WRID, 0x10, 0x10, Adj_Value);		//Write Preset Data to EEPROM
	Delay(3000);
}

void	Load_Parameter()
{
	I2C_Read(EEPROM_WRID, 0x00, 0x10, Adj_Value);
	if (memcmp(Adj_Value, "MTC_46X_CL_V7111", 16))		//Compares EEPROM 0x00~0x10 has "MTC logo"
	{												
		Save_Channel_Default();					// Save Channel with Fosc1, V_AUTO, SIF, Skip=1
				
		Volume = 25;							// Volume
		S_Brightness = 25;						// Brightness;
		S_Contrast = 25;						// Contrast;
		S_Saturation = 25;						// Saturation;
		S_Sharpen = 25;							// Sharpen
		S_Hue = Hue = 25;						// Hue
		
		Screen_mode = 0x00;						// Display Mode
		
		Blue_back = 1;							// Hue;

		Language = 0;							// Language
		S_Horizontal = Horizontal = 0;			// Horizontal
		S_Vertical = Vertical = 0;				// Vertical	
		S_Source_type = Source_type = VIDEO1;	// Input Source	

		Power_OnOff = 1;
		HPosition = 32;
		VPosition = 0;
		Channel = 0;
		
		I2C_Write(EEPROM_WRID, 0x10, 0x10, Adj_Value);	//Write Preset Data to EEPROM
		Delay(3000);

		memcpy(Adj_Value, "MTC_46X_CL_V7111", 16);		//No, the ID not equal, so set default value
		I2C_Write(EEPROM_WRID, 0x00, 0x10, Adj_Value);	//Write ID string to EEPROM
		Delay(3000);

		I2C_Read(EEPROM_WRID, 0x10, 0x10, Adj_Value);

	}
	else
	{													//Yes, read data from EEPROM
		I2C_Read(EEPROM_WRID, 0x10, 0x10, Adj_Value);
		Source_type = S_Source_type;
		Horizontal = S_Horizontal;
		Vertical = S_Vertical;
		Hue = S_Hue;

		Language_Check();
		
	}
	if (Source_type > VIDEO2)
		Source_type = VIDEO2; 

	S_Source_type = Source_type = VIDEO2;	// Input Source	
}

//------------------------------------------------------------------------------
//	Factory Mode Subroutine
//------------------------------------------------------------------------------

void	Factory_Mode()
{
	Menu_mode = 1;
	Menu_item = 0;
	ScreenOFF;

	Horizontal = 0;
	Vertical = 0;
	Set_HV();
		
	Load_Factory();
	Factory_Menu_Init();
	
	for(;;)
		Factory_Key_Check();
}

void	Save_Factory()
{
	memcpy(buf,"FA",2);	
	buf[2] = ColorEN;
	buf[3] = SoundEN;
	
	I2C_Write(EEPROM_WRID, 0x40, 4, buf);				//Write Preset Data to EEPROM
	Delay(3000);
	
	I2C_Write(EEPROM_WRID, 0x44, 10, UserOSD);
	Delay(3000);
}

void	Load_Factory()
{
//	ColorEN = 0x19;
//	SoundEN = 0x01;
	
	return;
	
	I2C_Read(EEPROM_WRID, 0x40, 4, buf);
	I2C_Read(EEPROM_WRID, 0x44, 10, UserOSD);
	
	if ( memcmp(buf, "FA", 2) )
	{
		ColorEN = 0x19;
		SoundEN = 0x01;
		UserOSD[0] = 0x59;
		UserOSD[1] = 0x59;	
		UserOSD[2] = 0x0C;
		UserOSD[3] = 0x18;
		UserOSD[4] = 0x17;
		UserOSD[5] = 0x10;
		UserOSD[6] = 0x15;
		UserOSD[7] = 0x12;
		UserOSD[8] = 0x59;		
		UserOSD[9] = 0x59;
	
		Save_Factory();
	}
	else
	{
		ColorEN = buf[2];
		SoundEN = buf[3];
	}
}

void	Factory_Menu_Init()
{
	BYTE	i;
	
	Show_Subwin(0x00);
	Clr_OSDCode();
	
	OSDTimer = 1000;

	if ( Menu_mode == 1 )
	{
		OSD_SubWin_Attr(0,13,3,8,8,0);
		OSD_SubWin_Attr(1,25,3,6,8,64);
	
		for (i=0;i<64;i++)
		{
			buf[i] = OSD_Factory_Menu[Menu_mode-1][i];
		}
			
		Write_OSDCode(buf,8,8,0);		//Write OSD Code buffer
	
		Factory_Menu_1();	
		Factory_Menu_HL();
		Show_Subwin(0x03);
	}
	if ( Menu_mode == 2 )
	{
		OSD_SubWin_Attr(0,13,3,16,1,0);
		OSD_SubWin_Attr(1,13,5,10,2,16);

		memcpy(buf,OSD_Factory_OSD,8);
		Write_OSDCode(buf,8,1,0);		//Write OSD Code buffer

		Factory_Menu_1();
		OSD_Attribute(0, 16, FG_COLOR, BG_COLOR);
		OSD_Attribute(16, 10, FG_COLOR_H, BG_COLOR);
		OSD_Attribute(26, 10, FG_COLOR, BG_COLOR);
		Show_Subwin(0x03);
	}
}

void	Factory_Menu_HL()
{
	BYTE	hl;
	
	hl = Menu_item;

	OSD_Attribute(0, 112, FG_COLOR, BG_COLOR);
	OSD_Attribute(hl*8, 8, FG_COLOR_H, BG_COLOR);
	OSD_Attribute(64+hl*6, 6, FG_COLOR_H, BG_COLOR);
}

void	Factory_Menu_1()
{
	BYTE	i, EN[2], DIS[3];

	if ( Menu_mode == 1 )
	{
		EN[0] = 0x0E;
		EN[1] = 0x17;
		DIS[0]= 0x54;
		DIS[1]= 0x54;
		DIS[2]= 0x59;
		
		for (i=0; i<48; i++)
			buf[i] = 0x59;
			
		if ( Menu_mode == 1 )
		{
			if ( ColorEN&0x1 )
				memcpy(&buf[0],EN,2);
			else
				memcpy(&buf[0],DIS,3);
				
			if ( ColorEN&0x2 )
				memcpy(&buf[6],EN,2);
			else
				memcpy(&buf[6],DIS,3);			
				
			if ( ColorEN&0x4 )
				memcpy(&buf[12],EN,2);
			else
				memcpy(&buf[12],DIS,3);
				
			if ( SoundEN&0x1 )
				memcpy(&buf[18],EN,2);
			else
				memcpy(&buf[18],DIS,3);
	
			if ( SoundEN&0x2 )
				memcpy(&buf[24],EN,2);
			else
				memcpy(&buf[24],DIS,3);
	
			if ( SoundEN&0x4 )
				memcpy(&buf[30],EN,2);
			else
				memcpy(&buf[30],DIS,3);
	
			if ( SoundEN&0x8 )
				memcpy(&buf[36],EN,2);

⌨️ 快捷键说明

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