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

📄 tv_tuner.c

📁 一款车载DVD的车机源程序(正在生成中的哦)
💻 C
字号:
#include "TV_tuner.h"
#include "Inter.h"
#include "Libr.h"
#include "St72321.h"
#include "IOport.h"                                                         

#include "Sys_config.h" 
#include "System_operation.h"
#include "I2c_drv.h"
#include "OSD.h"

unsigned long TVpllPCfreq = VLF_MIN_FPC;
unsigned char TVchannelNum = 1;
unsigned char TV_tuner_flag;
unsigned char TV_fromat = TV_PAL_I;
unsigned long TV_frequence_list[50] = {VLF_MIN_FPC};

void TV_changer_freq(void);
void TV_adjust_divider(unsigned long PCfreq);
static unsigned char TV_station_detect(void);
void TV_autosearch(void);
static void TV_stepsearch(void);
void TVTUNER_init(void);
void TV_search_key_process(void);
void TV_change_format(void);
/************************************************************
Function:The frequecne adding 625 or dec 625
************************************************************/
void TV_changer_freq(void)
{
	if(ValBit(System_flag,bSearchDir))
		{
		TVpllPCfreq += TV_STEP_SIZE;
		if(TVpllPCfreq == (VLF_MAX_FPC + TV_STEP_SIZE))
			TVpllPCfreq = VHF_MIN_FPC;
		if(TVpllPCfreq == (VHF_MAX_FPC + TV_STEP_SIZE))
			TVpllPCfreq = UHF_MIN_FPC;
		}
	else
		{
		TVpllPCfreq -= TV_STEP_SIZE;
		if(TVpllPCfreq == (UHF_MIN_FPC - TV_STEP_SIZE))
			TVpllPCfreq = VHF_MAX_FPC;
		if(TVpllPCfreq == (VHF_MIN_FPC - TV_STEP_SIZE))
			TVpllPCfreq = VLF_MAX_FPC;
		}

	TV_frequence_list[TVchannelNum -1] = TVpllPCfreq;
}
/************************************************************
Function:Send the frequence and the band to the tuner
************************************************************/
void TV_adjust_divider(unsigned long  PCfreq)
{
	unsigned char Temp_data[4] ={0};
	unsigned short int PllDivider;
	unsigned char TVband;
	if((PCfreq <= VLF_MAX_FPC) && (PCfreq >= VLF_MIN_FPC))
		TVband = VLF_BAND;
	if((PCfreq >= VHF_MIN_FPC) && (PCfreq <= VHF_MAX_FPC))
		TVband = VHF_BAND;
	if((PCfreq >= UHF_MIN_FPC) && (PCfreq <= UHF_MAX_FPC))
		TVband = UHF_BAND;

	PllDivider = (unsigned short int)((PCfreq + 389000) * 16 /10000);//62.5khz
	if(ValBit(System_flag,bSearchDir))
		{
		Temp_data[0] = HIBYTE(PllDivider);
		Temp_data[1] = LOBYTE(PllDivider);
		Temp_data[2] = CONTROL_BYTE;
		Temp_data[3] = TVband;
		}
	else
		{
		Temp_data[0] = CONTROL_BYTE;
		Temp_data[1] = TVband;
		Temp_data[2] = HIBYTE(PllDivider);
		Temp_data[3] = LOBYTE(PllDivider);
		}
	I2CWrite_nBytes(TV_TUNER_ADDR, Temp_data, 4);
}
/********************************************************
Function:Check than the frequence have signal or not
********************************************************/
static unsigned char TV_station_detect(void)
{
	unsigned char TVlockOK;
    	unsigned char tuner_status = 0;
	tuner_status = I2CReadByte_no_sub(TV_TUNER_ADDR);
	asm	nop;
	asm	nop;
	if((tuner_status == 0x7c) && (!((TVpllPCfreq + 2500) % 5000)) && ValBit(PF_DR,VIDEO_ID))
		{
		if(TVchannelNum == 1)
			TVlockOK = 1;
		else
			{
			if(TVpllPCfreq - TV_frequence_list[TVchannelNum -2] >20000)
				TVlockOK = 1;
			else
				TVlockOK = 0;
			}
		}
	else
		TVlockOK = 0;
	
	return TVlockOK;
}
/*************************************************************
Function:All frequence search,start from 482500 to 8552500
*************************************************************/
void TV_autosearch(void)
{
	if(System_mode != TV_mode)
		return;
	if(ValBit(TV_tuner_flag,TVsearchOK))	/*If search successly then return*/
		return;
 	TV_changer_freq();	/*Adding frequence 625 or dec frequence 625*/
	if((TVpllPCfreq + 2500) % 5000)
		return;
	if(TVpllPCfreq > UHF_MAX_FPC || TVpllPCfreq < VLF_MIN_FPC)
		{
		SetBit(TV_tuner_flag,TVsearchOK);
		ClrBit(PE_DR,TV_MUTE);
		TVchannelNum = 1;
		TVpllPCfreq = TV_frequence_list[TVchannelNum -1];
		if(TVpllPCfreq > UHF_MAX_FPC || TVpllPCfreq < VLF_MIN_FPC)
			TVpllPCfreq = VLF_MIN_FPC;
		TV_adjust_divider(TVpllPCfreq);
		System_mute_off();
		return;
		}

	TV_adjust_divider(TVpllPCfreq);
	WAIT_10ms();
	WAIT_10ms();
	if(TV_station_detect())
		{
		TV_frequence_list[TVchannelNum -1] = TVpllPCfreq + 5000;
		TVchannelNum++;
		if(TVchannelNum > 50)
			{
			TVchannelNum = 1;
			TVpllPCfreq = TV_frequence_list[TVchannelNum -1];
			if(TVpllPCfreq > UHF_MAX_FPC || TVpllPCfreq < VLF_MIN_FPC)
				TVpllPCfreq = VLF_MIN_FPC;
			TV_adjust_divider(TVpllPCfreq);
			SetBit(TV_tuner_flag,TVsearchOK);
			System_mute_off();
			}
		}
}
/************************************************************
Function:Search step by step,one step id 625
************************************************************/
static void TV_stepsearch(void)
{
	TV_changer_freq();
	if(TVpllPCfreq > UHF_MAX_FPC)
		TVpllPCfreq = VLF_MIN_FPC;
	if(TVpllPCfreq < VLF_MIN_FPC)
		TVpllPCfreq = UHF_MAX_FPC;

	TV_adjust_divider(TVpllPCfreq);
}
/*************************************************************
Function:Init the TV tuner
*************************************************************/
void TVTUNER_init(void)
{
	unsigned char Temp_data[3] ={0};

	#ifdef TNJ_3321_UF
	Temp_data[0] = TV_B_DATA;
	Temp_data[1] = TV_C_DATA;
	if(TV_fromat == TV_PAL_BG)
		Temp_data[2] = TV_PAL_BG_DATA;	
	if(TV_fromat == TV_PAL_I)
		Temp_data[2] = TV_PAL_I_DATA;
	if(TV_fromat == TV_PAL_DK)
		Temp_data[2] = TV_PAL_DK_DATA;			
	if(TV_fromat == TV_NTSC_MN)
		Temp_data[2] = TV_NTSC_MN_DATA;	
	#endif
	
	#ifdef TNJ_8355_QF
	if(TV_fromat == TV_PAL_BG ||TV_fromat == TV_PAL_I ||TV_fromat == TV_PAL_DK)
		{
		Temp_data[0] = 0x56;
		Temp_data[1] = 0x70;
		}
	switch(TV_fromat)
		{
		case TV_PAL_BG:
			Temp_data[2] = 0x09;
			break;
		case TV_PAL_I:
			Temp_data[2] = 0x0a;
			break;
		case TV_PAL_DK:
			Temp_data[2] = 0x0b;	
			break;
		case TV_NTSC_MN:
			Temp_data[0] = 0x16;
			Temp_data[1] = 0x30;
			Temp_data[2] = 0x08;
			break;
		case TV_C_L:
			Temp_data[0] = 0x16;
			Temp_data[1] = 0x50;
			Temp_data[2] = 0x4b;
			break;
		case TV_C_L_L:
			Temp_data[0] = 0xc6;
			Temp_data[1] = 0x50;
			Temp_data[2] = 0x53;
			break;
		}
	#endif
	
	I2C_write_sub(TV_SUB_ADDR, TV_DATA_ADDR, Temp_data, 3);
	
	TVpllPCfreq = TV_frequence_list[TVchannelNum -1];
	if(TVpllPCfreq > UHF_MAX_FPC || TVpllPCfreq < VLF_MIN_FPC)
		TVpllPCfreq = VLF_MIN_FPC;
	TV_adjust_divider(TVpllPCfreq);   
}
void TV_search_key_process(void)
{
	if(ValBit(TV_tuner_flag,TVsearchOK))
		{
		System_mute_on();
		TVchannelNum = 1;
		SetBit(System_flag,bSearchDir);	//From the min to the max
		TVpllPCfreq = VLF_MIN_FPC;
		TV_adjust_divider(TVpllPCfreq);
		ClrBit(TV_tuner_flag,TVsearchOK);
		}
	else
		{
		SetBit(TV_tuner_flag,TVsearchOK);
		System_mute_off();
		}
}

void TV_change_format(void)
{
	TV_fromat++;
	#ifdef TNJ_3321_UF
	if(TV_fromat > TV_NTSC_MN)
		TV_fromat = TV_PAL_BG;
	#endif

	#ifdef TNJ_8355_QF
	if(TV_fromat > TV_C_L_L)
		TV_fromat = TV_PAL_BG;
	#endif
	
	TVTUNER_init();
}














⌨️ 快捷键说明

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