📄 main.c
字号:
// 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 + -