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

📄 main.c

📁 tw9910的驱动源码,来自techwell的FAE
💻 C
📖 第 1 页 / 共 5 页
字号:
//			if(MenuLayer == 2)
//				CaptionOn(0x00);
			break;
		case 6:	
			if(MenuLayer == 2){
				CaptionOn(0x00);
				delay(100);
			}
			break;

		default:	break;
	}
}
	



BYTE MaxMenu(void)
{
	switch(MenuLayer){
		case 0: MaxMenuIndex = 0x00; break;		// logo
		case 1: MaxMenuIndex = 0x06; break;		// Menu table
		case 2:									// data
			switch(OneMenuIndex){
				case 0: MaxMenuIndex = 0x04; break;	// video input
				case 1: MaxMenuIndex = 0x02; break;	// register			//$11
				case 2: MaxMenuIndex = 0x02; break;	// scaling
				case 3: MaxMenuIndex = 0x01; break;	// caption
				case 4: MaxMenuIndex = 0x01; break;	// initializing
				case 5: MaxMenuIndex = 0x01; break;	// escape menu
				case 6: MaxMenuIndex = 0x00; break;	// help menu
				default: MaxMenuIndex = 0x00;	 break;
			}
			break;
		case 3: 
			switch(OneMenuIndex){
				case 0:	if(TwoMenuIndex == 0x04)
							MaxMenuIndex = 0x01; break; // super out
				case 1:		MaxMenuIndex = 0x50; break;	// execution register	//$11
				case 2:		MaxMenuIndex = 0xff; break;	// execution scaling
				default:	MaxMenuIndex = 0x00; break;	// execution layer
			}
			break;
		case 4:
			switch(OneMenuIndex){				//$11
				case 1:	MaxMenuIndex = 0xff;	break;
				default:						break;
			}
			break;

		default:	break;
	}
	return MaxMenuIndex;
}



void MakeSpecialMenuIndex(void)
{
	if(MenuLayer != OldMenuLayer){
		if(OldMenuLayer == 0x01)
			OneMenuIndex = OldMenuIndex;
	}

	if(OneMenuIndex == 0){
		if(MenuLayer != OldMenuLayer)
			if(MenuLayer == 0x03)
				TwoMenuIndex = OldMenuIndex;
			else if(MenuLayer == 0x02 && OldMenuLayer == 0x03)
				MenuIndex = TwoMenuIndex;
	}

	
	if(OneMenuIndex == 1){
		if(MenuLayer != OldMenuLayer){
			if(MenuLayer == 0x03 && OldMenuLayer == 0x02)
				ThreeMenuIndex = OldMenuIndex;
			else if(MenuLayer == 0x02 && OldMenuLayer == 0x03)
				MenuIndex = ThreeMenuIndex;
			else if(MenuLayer == 0x04){		//$11
				TwoMenuIndex = OldMenuIndex;
				OldOSDData = OSDData;
				MenuIndex = OSDData;
			}else if(MenuLayer == 0x03 && OldMenuLayer == 0x04)
				MenuIndex = TwoMenuIndex;
		}
	}

	if(OneMenuIndex == 2){
		if(MenuLayer != OldMenuLayer){
			if(MenuLayer == 0x03){
				switch(OldMenuIndex){
					case 0: TwoMenuIndex = 0x0e;	break;
					case 1: TwoMenuIndex = 0x0f;	break;
					case 2: TwoMenuIndex = 0x0d;	break;
					default:	break;
				}
				OldOSDData = OSDData;
				MenuIndex = OSDData;
			}
			if(MenuLayer == 0x02 && OldMenuLayer == 0x03){
				switch(TwoMenuIndex){
					case 0x0e:	MenuIndex = 0x00;	break;
					case 0x0f:	MenuIndex = 0x01;	break;
					case 0x0d:	MenuIndex = 0x02;	break;
					default:	break;
				}
			}
		}
	}
}


void CallOSD(void)
{

	if((OneMenuIndex == 0x06) && (MenuLayer == 2)){
		MenuIndex = 0;
		MenuLayer = 0;
		OldMenuIndex = 0;
		OldMenuLayer = 0;
		OneMenuIndex = 0;
		TwoMenuIndex = 0;
		ThreeMenuIndex = 0;
		IndOSD = 0;
		delay(10);
	}
		
	else{	
		if(MenuLayer != OldMenuLayer)
			OSDMemoryErase();
		OSDDisplay(MenuLayer, MenuIndex, OSDData);
	}
}


void ChangeUpDownKey(void)
{
	switch(OneMenuIndex){
		case 1: 
			switch(MenuLayer){
				case 3:		ReverseUpDownKey = 1;	break;
				case 4:		ReverseUpDownKey = 1;	break;
				default:	ReverseUpDownKey = 0;	break;
			}
			break;
		case 2:
			switch(MenuLayer){
				case 3:		ReverseUpDownKey = 1;	break;
				default:	ReverseUpDownKey = 0;	break;
			}
			break;
		default:			ReverseUpDownKey = 0;	break;
	}
}


void ChangeLayerIndex(void)
{
	#ifdef OLDKEY
	KeyState = P0 & KeyValue;
	#elif defined	NEWKEY	//OLDKEY
	KeyState = P2 & KeyValue;
	#endif	//NEWKEY

//	Printf("\r\n(Debug)KeyState : %2x, OldKeyState : %2x",(WORD)KeyState, (WORD)OldKeyState);

	if(OldKeyState != KeyState){

		ChangeUpDownKey();
		MaxMenuIndex = MaxMenu();

		switch(KeyState){
			case BUTTON_ENTER :
				if(MenuLayer < MaxMenuLayer){
					MenuLayer++;
					MenuIndex = 0x00;
				}
				break;
			case BUTTON_ESC :
				if(MenuLayer > 0x00)
					MenuLayer--;
				if(MenuLayer == 1)
					MenuIndex = OneMenuIndex;
				break;
			case BUTTON_UP :
				if(!ReverseUpDownKey){
					if(MenuIndex < MaxMenuIndex)
						MenuIndex++;
					else
						MenuIndex = 0x00;
				}else {
					if(MenuIndex > 0x00)
						MenuIndex--;
					else
						MenuIndex = MaxMenuIndex;
				}
				break;
			case BUTTON_DOWN :
				if(!ReverseUpDownKey){
					if(MenuIndex > 0x00)
						MenuIndex--;
					else
						MenuIndex = MaxMenuIndex;
				}else{
					if(MenuIndex < MaxMenuIndex)
						MenuIndex++;
					else
						MenuIndex = 0x00;
				}
				break;

			case BUTTON_MENU :
				MenuLayer = 0x01;
				MenuIndex = 0x00;
				break;
			default:	break;
		}


		if(	KeyState != KeyValue){
			MakeSpecialMenuIndex();
			ExeMenu();
			CallOSD();
		}
		OldKeyState = KeyState;
		OldMenuLayer = MenuLayer;
		OldMenuIndex = MenuIndex;
	}
}

void RepKeyIn(BYTE OffKey)
{

	BYTE KeyPort;

	#ifdef OLDKEY
	KeyPort = P0;
	#elif defined NEWKEY
	KeyPort = P2;
	#endif

	if((KeyPort & OffKey) != OffKey && ~MaskKey){
		OldKeyState = KeyPort & OffKey;
		tic02 = 0;
		MaskKey = 1;
		StayKey = OldKeyState;
	}else if(((KeyPort & OffKey) == StayKey) && (tic02 > 0x20) && MaskKey){
		OldKeyState = OffKey;
	}else if((KeyPort & OffKey) == OffKey){
		StayKey = OffKey;
		MaskKey = 0;
	}
/*
	if((P0 & OffKey) != OffKey && ~MaskKey){
		OldKeyState = P0 & OffKey;
		tic02 = 0;
		MaskKey = 1;
		StayKey = OldKeyState;
	}else if(((P0 & OffKey) == StayKey) && (tic02 > 0x20) && MaskKey){
		OldKeyState = OffKey;
	}else if((P0 & OffKey) == OffKey){
		StayKey = OffKey;
		MaskKey = 0;
	}	*/

}		


void OSDMenuIn(void)
{
	BYTE P2Value;
	P2Value = P2;

	if(!IndOSD){
//		Printf("\r\n(Debug)P2 : %2x", (WORD)P2Value);

		IndOSD = OSDWakeup(MenuLayer);
		if(IndOSD)
			delay(10);
	}
	else{
		MakeMaxMenuLayer();
		ChangeLayerIndex();
	}
	RepKeyIn(KeyValue);
}

void OSDInit(void)
{
	OSDCmd2(0xc2, 0x66);;	// detect falling edge of external h.sync
	ThreeMenuIndex = 0;

}

#ifdef SUPPORT_TELETEXT

void TeleTextInit(void)
{
	
	TeleTextHPol();
	delay(1);
	TeleTextVPol();
	delay(1);
	TeleTextPos(0x05, 0x2a);

	ReData[0] = 0x53; ReData[1] = 0x26; ReData[2] = 0x0f; ReData[3] = 0x8f; ReData[4] = 0x95;	// initial cancel	
	ReData[5] = 0x0A; ReData[6] = 0x00; ReData[7] = 0x00; 
	WriteI2Cn(TEXTAddress, ReData, 8);	
}

void RemoNumber(void)
{

	if((RemoDataCode & 0x0f) != 0x08)
		RepRemoNo = 0;
	else if((RemoDataCode & 0x0f) == 0x08){
		CmdRemNo(RemoDataCode);
	}
}

void TeleText(void)
{
//	Printf("\r\nRemoDataCode : %2x", (WORD)RemoDataCode);
	if(RemoDataCode != 0xff ){

		if(RemoDataCode == 0x04)
			OsdTextInit();
		else if(RemoDataCode == 0xda)
			CaptionOn(0);

		if(((TTToggle & 0x01) == 0x01) && (RemoDataCode != REMO_TTXPOSITION))	// escape cancel mode
			TeleTextCancel();

		Printf("\r\n(Debug)RemoDataCode : %2x", (WORD)RemoDataCode);
		switch(RemoDataCode){			// in both mode
			case REMO_TTXON:	TeleTextON();	TeleTextStatus = 1;		break;
			case REMO_TTXOFF:	TeleTextOFF();	TeleTextStatus = 0;		break;
			case REMO_TTXTIME:	TeleTextTime();							break;	
			default:		break;
		}

		RemoNumber();	// Number keys of remocon 

		if(TeleTextStatus){
	
			switch(RemoDataCode){		// in text mode
//				case REMO_TTXON:		TeleTextON();					break;
//				case REMO_TTXOFF:		TeleTextOFF();					break;
				case REMO_TTXRED:		TeleTextRed();					break;
				case REMO_TTXGREEN:		TeleTextGreen();				break;
				case REMO_TTXYELLOW:	TeleTextYellow();				break;
				case REMO_TTXCYAN:		TeleTextCyan();					break;
				case REMO_TTXHOLD:		TeleTextHold();					break;
//				case REMO_TTXTIME:		TeleTextTime();					break;	// tv mode
		   		case REMO_TTXSIZE:		TeleTextSize();					break;
				case REMO_TTXINDEX:		TeleTextIndex();				break;
				case REMO_TTXPOSITION:	TeleTextCancel();				break;
				case REMO_TTXMODE:		TeleTextMode();					break;
				case REMO_TTXPAGEUP:	TeleTextPageUp();				break;
				case REMO_TTXPAGEDOWN:	TeleTextPageDown();				break;

				default:				break;
			}
	  	}
	RemoDataCode = 0xff;	
	}
}

#endif //SUPPORT_TELETEXT


void Main_Initialize(void)
{

	InitCPU();
	delay(10);
	FPGAwrite();
	delay(10);
	reset = 0;	delay(1);
	reset = 1;	delay(1);

	ChipID = ReadTW99(0x00);

	DetectEncoderID();

	delay(10);

	StatusReg1    = ReadTW99(0x01);

	DetInterace   = 0;//IsInteraced();	
	MD0 		  = 1;		
	DetVideo      = 1;//IsVideoIn(StatusReg1);			
	PAL_NTSC      = GetColorSystem(StatusReg1);		
	Last_PAL_NTSC = PAL_NTSC;
	BUSY          = PAL_NTSC;				// Report color system to FPGA
	OldDetAuto    = DetAuto;
	MenuLayer	  = 0;
	MenuIndex     = 0;
	OldP0		  = 0;
	OneMenuIndex  = 0x00;

	OldDetVlock	  = 0x18;
	VDelayReg	  = GetVDelay();
	SelectedSW	  = 0x00;
//	OldCCFlag	  = CCFlag;
	
	OldKeyState		=	KeyValue;
	OldMenuLayer	=	0x00;
	OldMenuIndex	=	0x00;
	IndOSD			=	0;
	ReverseUpDownKey	= 0;
	VcoStrobe		= 	0;
	OldBypassKey 	= 	BypassKey;
	OSDInit();

	//------- Initial Data for TW990X --------
	InitRegisterSet(ChipID);
	//----------------------------------------

	InSel = 0;
	NewLine();
	if(!NotDefineID){
		if( SQ==0 ) {                                   // It's need to force when SQ mode
			if( (ReadTW99(0x01) & 0xc8) != 0x48 ) {     // Lock checking of H,V 
				I2CDeviceSet(ManualSetSqNtsc);          // Force NTSC SQ
				if((ReadTW99(0x01) & 0xc8) != 0x48)
					I2CDeviceSet(ManualSetSqPal);       // After forcing NTSC, if it is still unlock,
			}                                           //   forcing again to PAL.
		}
	}

	Usage();
	Prompt();
	MenuTableInitial();

	#ifdef SUPPORT_TELETEXT
	TeleTextInit();
//	EnableRemoconInt();
	#endif //SUPPORT_TELETEXT
//	WriteI2C(FPGAAddress, 0x02, 0x18);

	#ifndef BDREV200
	MD7 = 1;
//	Puts("(Debug)\r\nNondefined!!");
	#elif defined BDREV200
	MD7 = 0;
//	Puts("(Debug)\r\nDefined!!");
	#endif

	VCOWriteData(0x21, 0x04, 0x02);

}


/*===========================================================================*/
/*                             MAIN PROGRAM                                  */
/*===========================================================================*/

void main (void)
{

	Main_Initialize();
	
	while(1) {

		AutoDetectRegSet();				//----- Check Color

⌨️ 快捷键说明

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