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

📄 saa7114.c

📁 NT68521源代码
💻 C
字号:
#include "IIC.H"
#include "8051.H"
#include "stdio.h"
#include "SAA7114.H"
#include "RAM.H"
#include "F63REG.H"
#include "MyDef.H"
#include "MCU.H"
#include "OSD.H"
#include "Scaler.H"
#include "PANEL.H"
#include "sRGB.H"

idata unsigned char MuteFlag;
unsigned char code NTSC_AV[]={//register data
//0x01~0x0f
	0x00,0x08,0xc5,0x10,0x90,0x90,0xeb,0xe0,
	0xb8,0x40,0x80,0x44,0x40,0x00,0x89,0x2a,
//0x10~0x1f
	0x0e,0x00,0x00,0x00,0x00,0x11,0xfe,0x40, 
	0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
//0x20~0x2f					
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0x30~0x3f					
	0xbc,0xdf,0x02,0x00,0xcd,0xcc,0x3a,0x00,
	0x03,0x20,0x03,0x00,0x00,0x00,0x00,0x00,
//0x40~0x4f	
	0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
//0x50~0x5f					
	0xff,0xff,0xff,0xff,0x5f,0xff,0xff,0xff,
	0x00,0x47,0x06,0x83,0x00,0x3e,0x00,0x00,
//0x60~0x6f					
	0x00,0x05,0xa0,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0x70~0x7f					
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0x80~0x8f					
	0x12,0x00,0x00,0x01,0x01,0x04,0x45,0x01,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0x90~0x9f								
	0x00,0x08,0x09,0x40,0x10,0x00,0xd0,0x02,
	0x0a,0x00,0xf0,0x00,0xd0,0x02,0xf0,0x00,
//0xa0~0xaf					
	0x01,0x00,0x00,0x00,0x80,0x40,0x40,0x00,
	0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,
//0xb0~0xbf					
	0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0xc0~0xcf					
	0x00,0x08,0x10,0x81,0x10,0x00,0xd0,0x02,
	0x0a,0x00,0x20,0x01,0xd0,0x02,0x20,0x01,
//0xd0~0xdf					
	0x01,0x00,0x00,0x00,0x80,0x40,0x40,0x00,
	0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,
//0xe0~0xef					
	0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void SAA7114Init(void)
{
	
unsigned char i;
//saa7114 load table
	VideoEnable();
	ScalerPowerUp();
	Sleep(10);
	flag1 &= ~BIT_1;		//Clear fource to background
	ForceToBackground(0);
	for(i=0; i<0xf0; i=i+16){
		WritePageSAA7114(i,i);
	}
	WriteIIC_HW(SAA7114,0x88,0xe0);
	switch(PowerStatus)
	{
	case 0x81:
		WriteIIC_HW(SAA7114,0x02,0xc5);	//SAA7114 AV In
		WriteIIC_HW(SAA7114,0x09,0x40);	//SAA7114 no YCOMB
		WriteIIC_HW(SAA7114,0x14,0x22);	//aout=ad2
		break;
	case 0x82:
		WriteIIC_HW(SAA7114,0x02,0xc6);	//SAA7114 Y/C In
		WriteIIC_HW(SAA7114,0x09,0x40);	//SAA7114 no YCOMB
		WriteIIC_HW(SAA7114,0x14,0x22);	//aout=ad2
		break;
	case 0x83:
		WriteIIC_HW(SAA7114,0x02,0xc4);	//SAA7114 TV In 
		WriteIIC_HW(SAA7114,0x09,0xc0);	//SAA7114 YCOMB
		WriteIIC_HW(SAA7114,0x14,0x22);	//aout=ad1
		break;
	}

	WriteIIC_HW(Scaler_Addr,0x12,0x03);
	WriteIIC_HW(Scaler_Addr,0x13,0x33);
	WriteIIC_HW(Scaler_Addr,0x00,0x32);
	WriteIIC_HW(Scaler_Addr,0xE8,0x00);

	R_Gain = 80;
	G_Gain = 80;
	B_Gain = 80;
	sRGB();

	Brightness = Read24C16(0xd6);		//0xd6 = brightness
	Contrast = Read24C16(0xd7);			//0xd7 = contrast
	Saturation = Read24C16(0xd8);		//0xd8 = video saturation
	Tint = Read24C16(0xd9);				//0xd6 = video hue
	Sharpness = Read24C16(0xda);		//0xda = Sharpness(video)
	SetVideoBrightness();
	SetVideoContrast();
	SetVideoSaturation();
	SetVideoTint();
	SetVideoSharpness();

	ColorStatus = 0;
	flag2 |= 0x07;
//	NT68520PowerUp();
//	Sleep(100);
//	if(((PortC & BIT_0) == 0)&&(PowerStatus > 0x80)){
//		Sleep(PowerUpInvTiming);
		BackLightOn();
//	}
	SetVolume();
}
/*
void CheckVideo(void)
{
unsigned char value;
	value = ReadIIC_HW(SAA7114,0x1f);
	if(((value & 0x41) != 0x01) && ((flag2 & BIT_1) == 0)){
//change to unlocked
		flag2 &= ~BIT_0;
		flag2 |= BIT_1;
		flag1 &= ~BIT_1;		//Clear fource to background
		ForceToBackground(1);
		Timer3 = 100;
		if(PowerStatus == 0x83){
			AUDIO_MUTE();
		}
		if((flag3 & BIT_2) != 0x00){
			printf("No Video\r\n");
		}
	}
	if(((value & BIT_6) == 0) && ((flag2 & BIT_1) != 0)){
//change to locked
		flag2 &= ~BIT_0;
		flag2 &= ~BIT_1;
		SetAV_System();
		Timer3 = 100;
		if(PowerStatus == 0x83){
			if((flag3 & BIT_4) == 0)
				AUDIO_On();
			else
				AUDIO_MUTE();
		}
		if((flag3 & BIT_2) != 0x00){
			printf("Video again\r\n");
		}
	}
//check vertical
	if(((value & BIT_5) == 0) && ((flag2 & 0x06) == 0x04)){
//change to 50Hz
		flag2 &= ~BIT_0;
		flag2 &= ~BIT_2;
		SetAV_System();
		Timer3 = 100;
	}
	if(((value & BIT_5) != 0) && ((flag2 & 0x06) == 0x00)){
//change to 60Hz
		flag2 &= ~BIT_0;
		flag2 |= BIT_2;
		SetAV_System();
		Timer3 = 100;
	}
//check color system
	if(((value & 0x41) == 0x00)&&((flag2 & BIT_1) == 0)){
		CheckColorSystem();
	}
}
*/
void CheckVideo(void)
{
unsigned char value;
//	if(DecodeDelay==0)
//	{
//		DecodeDelay=50;
		value = ReadIIC_HW(SAA7114,0x1f);
		if(((value & BIT_6) != 0x00) && ((flag2 & BIT_1) == 0))
	    { //change to unlocked
			AUDIO_MUTE();  //AUDIO MUTE
			flag2 &= ~BIT_0;
			flag2 |= BIT_1;
			Timer3 = 100;
//			flag1 &= ~BIT_1;		//Clear force to background
//			ForceToBackground(1);
		}
		else if(((value & BIT_6) == 0) && ((flag2 & BIT_1) != 0))
	    { //change to locked
			if((value & BIT_5) == 0)
			{ //change to 50Hz
				if(Volume !=0)   //CANCEL AUDIO MUTE
				{	if(MuteFlag != 1)
					 AUDIO_On();
				}
				flag2 &= ~BIT_0;
				flag2 &= ~BIT_1;
				flag2 &= ~BIT_2;
				SetAV_System();
				Timer3 = 100;
			}
			if((value & BIT_5) != 0)
			{ //change to 60Hz
				if(Volume !=0)   //CANCEL AUDIO MUTE
				{	if(MuteFlag != 1)
					 AUDIO_On();
				}
				flag2 &= ~BIT_0;
				flag2 &= ~BIT_1;
				flag2 |= BIT_2;
				SetAV_System();
				Timer3 = 100;
			}
		}
		else if(((value & BIT_6) != 0x00) && ((flag2 & BIT_1) != 0))
	    { //change to unlocked
			AUDIO_MUTE();  //AUDIO MUTE
			flag1 &= ~BIT_1;		//Clear force to background
			ForceToBackground(1);
		}
//	}
}

void SetAV_System(void)
{
	flag1 &= ~BIT_5;
	CheckColorSystem();
	SetScalerAV();
	SetDisplayNormal();
}

void CheckColorSystem(void)
{
unsigned char code tab1[]={
//	0x09,0x29,0x01,0x31,0x21,0x11,0x59
	0x81,0x91,0xa1,0xb1,0xc1,0xd0
//	0x01,0x11,0x21,0x31,0x41,0x51
};

unsigned char code tab2[]={
//	0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0xae
//	0x2e,0x2e,0x2e,0x2e,0x2e,0xae
	0x2a,0x2a,0x2a,0x2a,0x2a,0x80
};

unsigned char i,value,k;
	if((flag1 & BIT_5) != 0)
		return;
	i = 0;
	WriteIIC_HW(SAA7114,0x0e,tab1[i]);
	WriteIIC_HW(SAA7114,0x0f,tab2[i]);
	k = 3;
	while(k != 0){
		k--;
		value = ReadIIC_HW(SAA7114,0x1f);
		if((value & 0x41) != 0x01){
			for(i=0; i<6; i++){
				WriteIIC_HW(SAA7114,0x0e,tab1[i]);
				WriteIIC_HW(SAA7114,0x0f,tab2[i]);
				Sleep(100);
				value = ReadIIC_HW(SAA7114,0x1f);
				if((value & 0x41) == 0x01){
					ColorStatus = i;
					break;
				}
			}
		}
	}
	if(i == 0x06){
		i = ColorStatus;
		WriteIIC_HW(SAA7114,0x0e,tab1[i]);
		WriteIIC_HW(SAA7114,0x0f,tab2[i]);
		flag1 |= BIT_5;
		if((flag3 & BIT_2) != 0x00){
			printf("Color system = B/W\r\n");
		}
	}
	else{
		flag1 &= ~BIT_5;
		if((flag3 & BIT_2) != 0x00){
			printf("Color system = %x\r\n",(unsigned short)i);
		}
	}
	WriteIIC_HW(SAA7114,0x0e,tab1[i] & ~BIT_7);
	WriteIIC_HW(SAA7114,0x0e,tab1[i]);
	i = i * 2;
	if(((value & BIT_5) == 0) && ((flag2 & 0x06) == 0x04)){
//change to 50Hz
		flag2 &= ~BIT_2;
	}
	if(((value & BIT_5) != 0) && ((flag2 & 0x06) == 0x00)){
//change to 60Hz
		flag2 |= BIT_2;
	}
	if((flag2 & BIT_2) != 0)
		i++;
	switch(i){
	case 0:
	case 3:
	case 4:
	case 7:
//PAL
		value = ReadIIC_HW(SAA7114,0x09);
		value &= BIT_7;
		value |= BIT_6;
		WriteIIC_HW(SAA7114,0x09,value);
		value = ReadIIC_HW(SAA7114,0x0e);
		value &= ~BIT_3;
		WriteIIC_HW(SAA7114,0x0e,value);
		WriteIIC_HW(SAA7114,0x0f,0x2a);
		WriteIIC_HW(SAA7114,0x10,0x06);
		break;
	case 1:
	case 2:
	case 5:
	case 6:
	case 9:
//NTSC
		value = ReadIIC_HW(SAA7114,0x09);
		value &= BIT_7;
		value |= BIT_6;
		WriteIIC_HW(SAA7114,0x09,value);
		value = ReadIIC_HW(SAA7114,0x0e);
		value |= BIT_3;
		WriteIIC_HW(SAA7114,0x0e,value);
		WriteIIC_HW(SAA7114,0x0f,0x2a);
		WriteIIC_HW(SAA7114,0x10,0x0e);
		break;
	case 10:
//SECAM
		value = ReadIIC_HW(SAA7114,0x09);
		value &= BIT_7;
		value |= 0x1b;
		WriteIIC_HW(SAA7114,0x09,value);
		WriteIIC_HW(SAA7114,0x0f,0x80);
		WriteIIC_HW(SAA7114,0x10,0x00);
		break;
	}
}

void WritePageSAA7114(unsigned char addr1,unsigned char addr2)
{
unsigned char i,ch;
/* start bit */
/* transmit device */
	INTIIC1_FLG = 0xff;
	IIC1_DATA = SAA7114;
	IIC1_CLK = 0x20 | IIC_BaudRate;
	IIC1_CON = 0x00;
/* transmit addr */
	MasterSendByte(addr1);
	for(i=0; i<16; i++){
		ch = NTSC_AV[addr2 + i];
		MasterSendByte(ch);
	}
/* transmit dumy data for stop bit */
	WaitTx();
/* stop bit */
	IIC1_CLK = 0xA0|IIC_BaudRate;
//	IIC1_CON = 0x00;
	WaitStop();
}

void SetVideoBrightness(void)
{
unsigned char value;
	value = Brightness * 2 + 28;
	WriteIIC_HW(SAA7114,0x0a,value);
	if((flag3 & BIT_2) != 0x00){
		printf("Brightness of SAA7114 = %x\r\n",(unsigned short)value);
	}
}
void SetVideoContrast(void)
{
unsigned char value;
	value = Contrast + 14;
	WriteIIC_HW(SAA7114,0x0b,value);
	if((flag3 & BIT_2) != 0x00){
		printf("Contrast of SAA7114 = %x\r\n",(unsigned short)value);
	}
}
void SetVideoSaturation(void)
{
unsigned char value;
	value = Saturation + 14;
	WriteIIC_HW(SAA7114,0x0c,value);
	if((flag3 & BIT_2) != 0x00){
		printf("Saturation of SAA7114 = %x\r\n",(unsigned short)value);
	}
}
void SetVideoTint(void)
{
unsigned char value;
	value = (((unsigned short)Tint * 255 + 50) / 100) - 128;
	WriteIIC_HW(SAA7114,0x0d,value);
	if((flag3 & BIT_2) != 0x00){
		printf("Tint of SAA7114 = %x\r\n",(unsigned short)value);
	}
}
void SetVideoSharpness(void)
{
code unsigned char SharpnessTab[]={
//	0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x00,0x07,0x06,0x05,0x04,0x03,0x02,0x01
	0x0b,0x0a,0x09,0x08,0x00,0x06,0x04,0x02
};
unsigned char value;
	value = ReadIIC_HW(SAA7114,0x09) & 0xf0;
	value |= SharpnessTab[Sharpness];
	WriteIIC_HW(SAA7114,0x09,value);
	if((flag3 & BIT_2) != 0x00){
		printf("Sharpness of SAA7114 = %x\r\n",(unsigned short)value);
	}
}

⌨️ 快捷键说明

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