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

📄 sync.c

📁 NT68617源程序代码集合
💻 C
📖 第 1 页 / 共 2 页
字号:
* 	函 数 名: SyncClearIntFlag
* 	功能描述: 清除与同步处理相关的中断标志
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/
void SyncClearIntFlag(void)
{
	WrScalarReg(rP1AB, 0x3F);				// 清除中断标志
	WrScalarReg(rP1AC, 0x1F);				// 清除中断标志
}


/*
********************************************************************************
* 	函 数 名: SyncSelType
* 	功能描述: 选择同步信号类型
* 	输    入: Type     : 选择同步信号的类型,只有三个值
*                        SYNCTYPE_SEPA: 分离式同步信号
*                        SYNCTYPE_COMP: 复合式同步信号
*                        SYNCTYPE_SOG:  绿色同步信号
* 	返    回: 无
********************************************************************************
*/
void SyncSelType(uint8 Type)
{
	if (Type == SYNCTYPE_SOG)  WrScalarRegBit(rP000, 0x08, 0x08);
	else  WrScalarRegBit(rP000, 0x00, 0x08);
}


/*
********************************************************************************
* 	函 数 名: SyncGetHcnt
* 	功能描述: 从Scalar寄存器当中读取当前水平同步频率的计数值
* 	输    入: 无
* 	返    回: 水平同步频率的计数值,如果OVER则返回0x1FFF
********************************************************************************
*/
static uint16 SyncGetHcnt(void)
{
	uint8 state;

	state = RdScalarReg(rP19A);

	if (state & 0x40)  return 0x1FFF;
	else if (state & 0x08)  return (RdScalarWord(rP19B) & 0x1FFF);
	else return 0x1FFF;
}


/*
********************************************************************************
* 	函 数 名: SyncGetVcnt
* 	功能描述: 从Scalar寄存器当中读取当前垂直同步频率的计数值
* 	输    入: 无
* 	返    回: 垂直同步频率的计数值,如果OVER则返回0x1FFF
********************************************************************************
*/
static uint16 SyncGetVcnt(void)
{
	uint8 state;

	state = RdScalarReg(rP19A);

	if (state & 0x80)  return 0x1FFF;
	else if (state & 0x30)  return (RdScalarWord(rP19D) & 0x1FFF);
	else return 0x1FFF;
}


/*
********************************************************************************
* 	函 数 名: SyncGetPol
* 	功能描述: 读取当前同步信号的极性,1表示正极性,0表示负极性
* 	输    入: 无
* 	返    回: 返回当前的同步信号极性
*			  第0位:水平极性;	
*			  第1位:垂直极性;
********************************************************************************
*/
static uint8 SyncGetPol(void)
{
	uint8 pol;
	uint8 v;

	pol = RdScalarReg(rP19A) & 0x03;

	//	所读到的值得第0位和第1位交换
	v = (pol>>1) & 0x01;
	pol = ((pol << 1) & 0x02) + v;
	return pol;
}


/*
********************************************************************************
* 	函 数 名: SyncFreeRun
* 	功能描述: 在没有水平和垂直同步信号或者是同步超出范围时自由运行
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/
void SyncFreeRun(void)
{
	SarBF3Disable(0);
	SarBF3Disable(1);
	
	SarPower(POWER_NORMAL);
	PowerLED(POWER_NORMAL);
	
//	WrScalarRegBit(rP0F0, B0000_1000, B0000_1000);		//chen add	08-05-22
//	WrScalarRegBit(rP0F0, B0000_0000, B0000_1000);		//chen add	08-05-22
	
	SarFreeRun();
	PanelPowerSequence(ON);
	AdjBacklight(HIDE, 0);
	AdjBri(HIDE, 0);
	AdjCon(HIDE, 0);
	AdjOsdHpos(HIDE, 0);
	AdjOsdVpos(HIDE, 0);

	SarBF3DisBoard(0);
	if (!Flg_BackLighPower) BackLightPower(ON);
}


uint8 BurnPat;
/*
********************************************************************************
* 	函 数 名: SyncBurn
* 	功能描述: 产生老化测试画面,只有在满足没有同步信号输入,同时允许老化的条件下
*             才能产生老化的测试画面。
* 	输    入: 无
* 	返    回: 无
*   注    意: BurnPat用来指明是使用哪一个测试画面。
********************************************************************************
*/
void SyncBurn(void)
{
	BurnPat &= 0x0F;
	WrScalarReg(rP154, (BurnPat<<4) + 0x01);
	BurnPat++;
}


/*
********************************************************************************
* 	函 数 名: SyncEnterSleep
* 	功能描述: 当没有同步信号输入时,判断是否允许老化,如果允许老化则进入老化
*             否则显示无信号输入提示画面之后,进入省电状态
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/
static void SyncEnterSleep(void)
{
	SyncFreeRun();
	if (SysPar.Flag & FLAG_BURNIN)  {
		BurnPat = 0;
		SysState = SYS_BURNIN;
		MenuBurning();
		SyncBurn();
		Flg_EnBurning = 1;
		}

	else  {
		MenuShowNoSync();
		ActivePowerSaving();
		}
}


/*
********************************************************************************
* 	函 数 名: SyncGetAttr
* 	功能描述: 读取同步信号属性,包括水平同步和垂直同步的计数值,水平/垂直同步极性
* 	输    入: Sync   : 指向保存同步属性的结构指针
* 	返    回: 无
********************************************************************************
*/
static void SyncGetAttr(SYNCATTR * Sync)
{
	Sync->Hcount = SyncGetHcnt();
	Sync->Vcount = SyncGetVcnt();
	Sync->HVPol  = SyncGetPol();
}



/*
********************************************************************************
* 	函 数 名: SyncInt
* 	功能描述: 禁止或者是允许同步处理中断
* 	输    入: state   = ON    允许同步处理中断
*                     = OFF   禁止同步处理中断
* 	返    回: 无
********************************************************************************
*/
void SyncInt(uint8 state)
{
	if (state == ON)  EnableScalarInt();
	else  DisableScalarInt();
}


/*
********************************************************************************
* 	函 数 名: SyncOutOfRangeProc
* 	功能描述: 对同步信号超出范围,或者显示模式不在列表的情况进行处理
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/
static void SyncOutOfRangeProc(void)
{
	SysState = SYS_OUTOFHIGH;
	SyncFreeRun();
	MenuShowOutOfRange();
	ActivePowerSaving();
}


uint8 SyncState;
uint8 ModeWaitCount;
void SyncDet(void)
{
#if EN_ALWAYSAUTO
	uint8 AutoResult;
#endif

#if EN_NT68167_C //|| EN_NT68167_B
	uint8 xdata *Addr;
#endif

	uint8 CurSyncState;
	
	switch (ModeState)  {
		case MODE_INIT:
			Flg_SyncInt = 1;
			ModeState = MODE_DETECT;
			break;

		case MODE_DETECT:
			if (!Flg_SyncInt) break;
			DisplayMute(ON);						// 关屏幕
			
//chen 08-05-13解决NT68167 B版无信号开机进入待机,再接入信号时图象不正常
			if(SysState != SYS_NORMAL)
			{
#if EN_NT68167_B 
				SarPower(POWER_NORMAL); 	//chen 08-05-13
#elif EN_NT68167_C
				Addr = 0xF000 + IDX_LDO_ADJ;
				*Addr = 0x8B;			//Power up APLL //chen 08-05-16
				
				Addr = 0xF000 + IDX_CURR_ADJ1;
				*Addr = 0x55;			//Set the current of PortB/PortA to mid value	//chen 08-05-16
#endif
			}
			SarDispCtrl(DISP_OSD);
			DisableScalarInt();
			SyncInt(OFF);
    		SyncClearIntFlag();					// 清除中断标志
	
			SetTimerEvent(EVENT_POWERSAVING, 0);	// 清除节能事件
			Flg_EnBurning = 0;
	
			if (GetEventTime(EVENT_SAVEPAR))  SaveAllPar();	
			if (SysState != SYS_SWITCH) {
				CtrlOsdParReset();
				}
			SyncState = 0x55;
			ModeWaitCount = 0x00;
			ModeState = MODE_WAIT;
			break;

		case MODE_WAIT:
			CurSyncState = (RdScalarReg(rP1AB) & B0011_1100) + (RdScalarReg(rP1AC) & B0000_0011);
			if (CurSyncState != SyncState)  {
				SyncState = CurSyncState;
				ModeWaitCount = 0x00;
				Delay(2);
				}
			else  {
				ModeWaitCount++;
				if (ModeWaitCount > 100)  {
					SyncGetAttr(&SyncAttr);
					ModeState = MODE_STAB;
					}
				else Delay(2);
				}
			SyncClearIntFlag();
			break;

		case MODE_STAB:
			SyncClearIntFlag();		// 清除中断标志, 这条放在这里很重要,否则快速插拔信号时
										// 会出现问题
			Flg_SyncInt = 0;
			SyncInt(ON);
			ModeState = MODE_DETECT;
/*
================================================================================
=		对稳定状态的处理
=
=	Vtotal = 水平同步频率/垂直同步频率
=	水平同步频率 = 96000000/水平计数值
=	垂直同步频率 = 46875/垂直计数值
=	因此推算出来的计算公式: Vtotal = (2048 * 垂直计数值)/水平计数值
=	要注意一点, 这些公式是在SCALAR时钟频率为12M时得出来的
=
================================================================================
*/
			Hfre = 9600000L/SyncAttr.Hcount;		// 公式计算出来的值除以100就是水平同步频率,单位是:kHz
			Vfre = 4687500L/SyncAttr.Vcount;		// 公式计算出来的值除以100就是水平同步频率,单位是:Hz
			Vtotal = ((uint32)SyncAttr.Vcount * 2048)/SyncAttr.Hcount;

/*
================================================================================
=		判断同步频率有没有超过上限值
================================================================================
*/
			if (Hfre > MAX_HSYNC || Vfre > MAX_VSYNC)  {
				SarSetBackGround(0x00, 0x00, 0x00);
				SyncOutOfRangeProc();
				break;
				}

/*
================================================================================
=		判断同步频率有没有超过下限值
================================================================================
*/
			if (Hfre < MIN_HSYNC || Vfre < MIN_VSYNC)  {
				if (Hfre < MIN_HSYNC && Vfre < MIN_VSYNC) SysState = SYS_OUTOFLOW;
				else if (Hfre < MIN_HSYNC) SysState = SYS_OUTOFHLOW;
				else SysState = SYS_OUTOFVLOW;
				SarSetBackGround(0x00, 0x00, 0x00);
				SyncEnterSleep();
				break;
				}

	
/*
================================================================================
=		对频率在正常范围内的处理
================================================================================
*/
			SyncSetInterlace();
			ModePar.mode = SyncGetIndex();
			if (ModePar.mode == 0xFF)  {
				SyncOutOfRangeProc();
				break;
				}
			LoadRelPar(ModePar.mode);
			SyncGetModePixels();
			AdjClock(HIDE, 0);
			AdjPhase(HIDE, 0);
			SyncGetHscnt();
			ModeState = MODE_OUTPUT;
			break;

/*
================================================================================
=		参数输出部分
================================================================================
*/
		case  MODE_OUTPUT:
			ModeState = MODE_DETECT;
			SarSetBackGround(0x00, 0x00, 0x00);
			if (SysState != SYS_NORMAL) 
			{
				SarPower(POWER_NORMAL);
			}
			SyncOutRelPar();
			if (Flg_SyncInt) break;
			if (SysState != SYS_NORMAL)  {		// 这里的处理是防止从其他同步模式到这里
				PowerLED(POWER_NORMAL);		// 电源没有正常控制
				SyncOutOneTimePar();
				PanelPowerSequence(ON);
				}
	
			if (Flg_SyncInt) break;
			DisplayMute(OFF);
			SysState = SYS_NORMAL;

		#if USE_AUDIO		//chen 08-05-22
			AudioVolume(SysPar.Volume);
			AdjMute(HIDE,0);
		#endif
		
		#if EN_ALWAYSAUTO						// 允许总是在模式切换发生时进行AUTO
			AutoResult = AutoTuneProc();
			if ((AutoResult == AUTO_OK) && (!ModePar.flag)) {
				ActiveSave_VGAMODE();
				SaveAllPar();
				}
		#endif
			break;
		}
}
/*
********************************************************************************
*                                文 件 结 束                                   *
********************************************************************************
*/

⌨️ 快捷键说明

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