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

📄 tuner.c

📁 此代码是LG tuner(模拟电视解调器)的51MCU驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "Globe.h"

//#define 	SlvTuner		0xC0
//#define	CH_IN_EAD		2
#define	PictureIF		38.0
#define 	TUNER_IF		0x86
//#define 	C_CTRL_BYTE	0x88

BYTE	PLL_Band;
WORD	PB;
BIT		NOSign;
BYTE	TunerADC;
WORD	H_Count;
WORD	V_Count;

BYTE code TunerBar_Code[5] = 
	{_Tuner_BAR_EMP,_Tuner_BAR_1,_Tuner_BAR_2,_Tuner_BAR_3,_Tuner_BAR_FULL};


//BYTE	OSD_H_Start;
void Write_PLL_IF(void)
{
	IICBuf.ByteArray[0] = 0xd6;//0xd6;
	IICWrite(TUNER_IF, 0x00, 1);
	DelayX10ms(50);

	IICBuf.ByteArray[0] = 0x70;//0x94;//0x70;
	IICWrite(TUNER_IF, 0x01, 1);
	DelayX10ms(50);

	IICBuf.ByteArray[0] = 0x0e;//0x48;//0x4a;//0x0e;
	IICWrite(TUNER_IF, 0x02, 1);
	DelayX10ms(50);	
}

void GetBand(WORD PLL)
{
	if(PLL<=TV_BAND_VH_LLIMIT)
		PLL_Band = VLF_BAND;		// 0x01
	else if(PLL<= TV_BAND_VU_LLIMIT)
		PLL_Band = VHF_BAND;		//0x02
	else 
		PLL_Band = UHF_BAND;		//0x04
}

void Write_PLL(BYTE band,WORD PLL)
{
	
	BYTE TV_Add;
	//DelayX10ms(3000);
	TV_Add = (BYTE)(PLL>>8);
	IICBuf.ByteArray[0] = (BYTE)PLL;
	IICBuf.ByteArray[1] = C_CTRL_BYTE;	//0xc6;
	IICBuf.ByteArray[2] = band;
	IICBuf.ByteArray[3] = 0x98;
	IICBuf.ByteArray[4] = 0x60;
	IICWrite(SlvTuner, TV_Add, 5);
	//DelayX10ms(3000);
}

void ManualSearch(BYTE Key_direction)
{
	BYTE i,j;
	WORD PB1,PB2;
	BYTE AFC;
	BIT channel_found=0;
	//CloseOSD();			//////////////////OpenOSD_Border();
	//ResetOSD();
	if(PB < (TV_BAND_VL_LLIMIT-0x80)||PB > (TV_BAND_VU_HLIMIT+0x80))
		PB = TV_BAND_VL_LLIMIT;
	byM230_DA3 = 0;		//静音
	if(Key_direction == PLUS_KEY&&PB<TV_BAND_VU_HLIMIT)
	{
		gotoxy(Menu_HStart1+2,Menu_VStart3);
		PrintChar(_RIGHT, Arrow_Color, 0);
		PB+=30;
	do{
		do{
			SetWatchDog(4);
			Print_PLL(8, VIDEO_BAR_VStart+1, PB);
			Show_Menu();
			Forward_50KHZ(10);
			
			//GetRemoteKey();
			GetKey();
			if(KeyCode == SUBTRACT_KEY)
				{
					ManualSearch(KeyCode);
					return;
				}
			
			HSYNC_Range();
			DelayTuner(5);			
			}
		while((NOSign == 1)&&(PB<=TV_BAND_VU_HLIMIT));
		if((NOSign == 0)&&(PB<=TV_BAND_VU_HLIMIT))
		{
		PB-=5;
		PB1 = PB;
		
		do{
			SetWatchDog(4);
			Print_PLL(8, VIDEO_BAR_VStart+1, PB);
			Show_Menu();
			Forward_50KHZ(4);
			DelayTuner(5);	
			Tuner_ADC();
			PB2 = PB;
			}
		while(TunerADC!=2&&TunerADC!=3&&(PB2-PB1)<10);
		if(TunerADC>=2)
			for(j=0;j<5;j++)
		{
		PB-=3;
		for(i=0;1<6;i++)
			{
				Forward_50KHZ(1);
				DelayTuner(5);	
				AFC=Tuner_AFC();
				if(AFC<=3||AFC>=0x0c)
					break;
			}
		if((AFC<=3||AFC>=0x0c)&&VIF_Level())
			{
				channel_found = 1;
				i =EEPROM_Rd_Byte(EAD_TV_CHANNEL_CURRENT);
				i = EAD_TV_START + i*CH_IN_EAD;
				EEPROM_Wr_Byte(i, PB>>8);
				EEPROM_Wr_Byte(i+1, PB&0xff);
			}
		}
	}
}
	while(channel_found==0&&PB<=TV_BAND_VU_HLIMIT);

		}
	
	else if(Key_direction == SUBTRACT_KEY&&PB>TV_BAND_VL_LLIMIT)
	{
		gotoxy(Menu_HStart1+2,Menu_VStart3);
		PrintChar(_LEFT, Arrow_Color, 0);
		PB-=30;
	do{
		do{
			SetWatchDog(4);
			Print_PLL(8, VIDEO_BAR_VStart+1, PB);
			Show_Menu();
			Back_50KHZ(10);
			
			//GetRemoteKey();
			GetKey();
			if(KeyCode == PLUS_KEY)
				{
					ManualSearch(KeyCode);
					return;
				}
			
			HSYNC_Range();
			DelayTuner(5);			
			}
		while((NOSign == 1)&&(PB>=TV_BAND_VL_LLIMIT));
		if((NOSign == 0)&&(PB>=TV_BAND_VL_LLIMIT))
		{
		PB+=5;
		PB1 = PB;
		
		do{
			SetWatchDog(4);
			Print_PLL(8, VIDEO_BAR_VStart+1, PB);
			Show_Menu();
			Back_50KHZ(3);
			DelayTuner(5);	
			Tuner_ADC();
			PB2 = PB;
			}
		while(TunerADC!=2&&TunerADC!=3&&(PB1-PB2)<10);
		if(TunerADC>=2)
			for(j=0;j<5;j++)
		{
		PB+=4;
		for(i=0;1<6;i++)
			{
				Back_50KHZ(1);
				DelayTuner(5);	
				AFC=Tuner_AFC();
				if(AFC<=3||AFC>=0x0c)
					break;
			}
		if((AFC<=2||AFC>=0x0d)&&VIF_Level())
			{
				channel_found = 1;
				i =EEPROM_Rd_Byte(EAD_TV_CHANNEL_CURRENT);
				i = EAD_TV_START + i*CH_IN_EAD;
				EEPROM_Wr_Byte(i, PB>>8);
				EEPROM_Wr_Byte(i+1, PB&0xff);
			}
		}
		}
	}		
	while(channel_found==0&&PB>=TV_BAND_VL_LLIMIT);
	/*{
	//PB-=30;
	do{
		do{
			Print_PLL(8, VIDEO_BAR_VStart+1, PB);
			Show_Menu();
			Back_50KHZ(10);	
			
			//GetRemoteKey();
			GetKey();
			if(KeyCode == PLUS_KEY)
				{
					ManualSearch(KeyCode);
					return;
				}
			
			HSYNC_Range();
			DelayTuner(5);
			}
		while((NOSign == 1)&&(PB>=TV_BAND_VL_LLIMIT));
		PB+=5;
		PB1 = PB;
		
		do{
			Print_PLL(8, VIDEO_BAR_VStart+1, PB);
			Show_Menu();
			Back_50KHZ(4);
			DelayTuner(5);	
			Tuner_ADC();
			PB2 = PB;
			}
		while(TunerADC!=2&&TunerADC!=3&&((PB1-PB2)<10));
		if(TunerADC>=2)
			for(j=0;j<5;j++)
		{
		PB+=3;
		for(i=0;i<6;i++)
			{
				Back_50KHZ(1);
				DelayTuner(5);	
				AFC=Tuner_AFC();
				if(AFC<=3||AFC>=0x0c)
					break;
			}
		if((AFC<=3||AFC>=0x0c)&&VIF_Level())
			{
				channel_found = 1;
				i = EEPROM_Rd_Byte(EAD_TV_CHANNEL_CURRENT);
				i = EAD_TV_START + i*CH_IN_EAD;
				EEPROM_Wr_Byte(i+1, PB>>8);
				EEPROM_Wr_Byte(i+2, PB&0xff);
			}
		}
		}
	while(channel_found==0&&PB>=TV_BAND_VU_LLIMIT);*/

	
	}
		Print_PLL(8, VIDEO_BAR_VStart+1, PB);
		Show_Menu();
		
		if(channel_found)
			Get_CH(EEPROM_Rd_Byte(EAD_TV_CHANNEL_CURRENT));
		else
			{
				GetBand(TV_BAND_VL_LLIMIT);
				Write_PLL(PLL_Band, TV_BAND_VL_LLIMIT);
				PB = TV_BAND_VL_LLIMIT;
				i = EAD_TV_START+CH_IN_EAD*EEPROM_Rd_Byte(EAD_TV_CHANNEL_CURRENT);
				//EEPROM_Wr_Byte(i,TV_CHDEF_STATE);
				EEPROM_Wr_Byte(i,PB>>8);
				EEPROM_Wr_Byte(i+1,PB&0xff);
			}
		byM230_DA3 = EEPROM_Rd_Byte(EAD_VOL);

	}	

void AutoSearch(void)
{
	BYTE i,m,AFC,ChannelNUM=0;
	WORD PB1,PB2;
	KeyCode=NO_KEY;
	REM_KeyCode=NO_KEY;
	PB = TV_BAND_VL_LLIMIT;
	Initial_EEPROM_PLL();
	EEPROM_Wr_Byte(EAD_TV_CHANNEL_CURRENT,0);
	EEPROM_Wr_Byte(EAD_TV_CHANNEL_SUM,0);
	byM230_DA3 = 0;		//静音
	//ResetOSD();
		Print_PLL(8, VIDEO_BAR_VStart+1, PB);
	Show_Menu();
	//PAL_NTSC = 0;
	//Print_CH(24, 1, ChannelNUM);
	do{
		SetWatchDog(4);
		Show_Menu();
		AFC = 8;	
		do{
			SetWatchDog(4);
		Print_PLL(8, VIDEO_BAR_VStart+1, PB);
		Show_Menu();
			//Print_CH(24, 1, ChannelNUM);
			Forward_50KHZ(5);
			//GetRemoteKey();
			GetKey();
			if(KeyCode == MENU_KEY||REM_KeyCode == REM_MENU)
				{
					Get_CH(0);
					return;
				}
			HSYNC_Range();
			DelayTuner(5);
			}
		while(NOSign == 1&&PB<=TV_BAND_VU_HLIMIT);
		PB-=4;
		PB1 = PB;
		do{
			SetWatchDog(4);
		Print_PLL(8, VIDEO_BAR_VStart+1, PB);
		Show_Menu();
			//Print_CH(24, 1, ChannelNUM);
			Forward_50KHZ(2);
			HSYNC_Range2();
			DelayTuner(5);
			PB2 = PB;
			}
		while(NOSign == 1&&(PB2-PB1)<10);
		if(NOSign == 0)
			for(m=0;m<3;m++)
		{
		PB-=4;
		for(i=0;1<8;i++)
			{
		Print_PLL(8, VIDEO_BAR_VStart+1, PB);
		Show_Menu();
				//Print_CH(24, 1, ChannelNUM);
				Forward_50KHZ(2);
				DelayTuner(5);
				AFC = Tuner_AFC();
				if(AFC<=6||AFC>=9)
					break;
			}
		if(AFC>=9)
			//for(j=1;j<5;j++)
			{
				PB-=2;
				for(i=0;i<6;i++)
					{			
						Forward_50KHZ(1);		
						DelayTuner(5);
						AFC = Tuner_AFC();
						if(AFC<=2||AFC>=0x0d)
							break;
					}
				PB+=3;
				for(i=0;i<6;i++)
					{			
						Back_50KHZ(1);		
						DelayTuner(5);
						AFC = Tuner_AFC();
						if(AFC<=2||AFC>=0x0d)
							break;
					}				
			} // >62.5k
		else if(AFC<=6)
			//for(j=1;j<5;j++)
			{
				PB+=2;
				for(i=0;i<6;i++)
					{
						Back_50KHZ(1);			
						DelayTuner(5);
						AFC = Tuner_AFC();
						if(AFC<=2||AFC>=0x0d)
							break;
					}
				PB-=3;
				for(i=0;i<6;i++)
					{			
						Forward_50KHZ(1);			
						DelayTuner(5);
						AFC = Tuner_AFC();
						if(AFC<=2||AFC>=0x0d)
							break;
					}

⌨️ 快捷键说明

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