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

📄 misc.c

📁 NT68617源程序代码集合
💻 C
字号:
/*
********************************************************************************
*
*	                                LCD控制程序
*
*	                        不是很方便归类的部分都在这里
*
*	文件名	: MISC.C
*	设计者	: Terry
********************************************************************************
*                                   功 能 描 述
*
*		1. 不方便归类或者类别不明显的接口函数都放在这一部分
*		2. 与这一部分相关的函数声明放在头文件GLOBAL.H当中
********************************************************************************
*/
#include "global.h"
#include "scalar.h"
#include "osd.h"


void FlashLED(void);
void PowerCtrl(uint8 state);

bit Flg_BackLighPower = 0;
bit Flg_PanelPower = 0;

/*
********************************************************************************
* 	函 数 名: Delay
* 	功能描述: 延时函数,延时的间隔是1ms
* 	输    入: Time	:控制延时的间隔
* 	返    回: 无
********************************************************************************
*/
void Delay(uint16 Time)
{
	uint8 i;

//	需要执行1000个指令周期
#if McuFosc == 12000000L		// 时钟频率
	while(Time--)  {
		ClearWatchDog();
		i = 100;
		//	这一段将执行10个指令周期
		while(i--)  {
			_nop_();
			_nop_();
			}
		}
#endif


//	需要执行2000个指令周期
#if McuFosc == 24000000L		// 时钟频率
	while(Time--)  {
		ClearWatchDog();
		i = 200;
		//	这一段将执行10个指令周期
		while(i--)  {
			_nop_();
			_nop_();
			}
		}
#endif

//	需要执行3000个指令周期
#if McuFosc == 36000000L		// 时钟频率
	while(Time--)  {
		ClearWatchDog();
		i = 250;
		//	这一段将执行12个指令周期
		while(i--)  {
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			}
		}
#endif

//	需要执行6000个指令周期
#if McuFosc == 72000000L		// 时钟频率
	while(Time--)  {
		ClearWatchDog();
		i = 250;
		//	这一段将执行12个指令周期
		while(i--)  {
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			}

		i = 250;
		//	这一段将执行12个指令周期
		while(i--)  {
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			}
		}
#endif
}


/*
********************************************************************************
* 	函 数 名: PowerLED
* 	功能描述: 根据输入的状态,控制电源指示灯的显示
* 	输    入: state,指明电源指示灯的状态
* 	返    回: 无
********************************************************************************
*/
void PowerLED(POWERSTATE state)
{
#if EN_PLED_INVERSE
	switch(state)  {
		case POWER_NORMAL:
			Pin_LEDG_High();
			Pin_LEDY_Low();
			break;

		case POWER_SUSPEND:
		case POWER_STADBY:
			Pin_LEDG_High();
			Pin_LEDY_High();
			break;

		case POWER_OFF:
			Pin_LEDG_Low();
			Pin_LEDY_High();
			break;

		case POWER_CUTOFF:
			Pin_LEDG_Low();
			Pin_LEDY_Low();
			break;
		}

#else
	switch(state)  {
		case POWER_NORMAL:
			Pin_LEDG_Low();
			Pin_LEDY_High();
			break;

		case POWER_SUSPEND:
		case POWER_STADBY:
			Pin_LEDG_Low();
			Pin_LEDY_Low();
			break;

		case POWER_OFF:
			Pin_LEDG_High();
			Pin_LEDY_Low();
			break;

		case POWER_CUTOFF:
			Pin_LEDG_High();
			Pin_LEDY_High();
			break;
		}
#endif
}


/*
********************************************************************************
* 	函 数 名: BackLightPower
* 	功能描述: 背光灯电源控制
* 	输    入: ON/OFF	ON:电源打开 OFF:电源关闭
* 	返    回: 无
********************************************************************************
*/
void BackLightPower(SWITCHSTATE state)
{
#if EN_BLPOWER_INVERSE
	if (state == ON)  {
		Flg_BackLighPower = 1;
		Pin_BLP_High();
		}
	else  {
		Flg_BackLighPower = 0;
		Pin_BLP_Low();
		}
#else
	if (state == ON)  {
		Flg_BackLighPower = 1;
		Pin_BLP_Low();
		}
	else  {
		Flg_BackLighPower = 0;
		Pin_BLP_High();
		}
#endif
}


void Flash(uint8 Count)
{
	uint8 i;

	for (i = 0; i < Count; i++)  {
		PowerLED(POWER_OFF);
		Delay(200);
		PowerLED(POWER_NORMAL);
		Delay(200);
		}
}


/*
********************************************************************************
* 	函 数 名: DisplayMute
* 	功能描述: 关闭屏幕显示
* 	输    入: 无
* 	返    回: 无
*   注    意: 如果不关闭背光灯,那么屏幕依然可以看见底光
********************************************************************************
*/
void DisplayMute(uint8 state)
{
	if (state==ON)  {
		SarCapture(OFF);
		BackLightPower(OFF);
		}
	
	else  {
		//WrScalarReg(rP159, 0xA0);
		SarCapture(ON);
		SarDispCtrl(DISP_NORMAL);
		Delay(100);
		BackLightPower(ON);
		}
}


/*
********************************************************************************
* 	函 数 名: PanelPower
* 	功能描述: Panel电源控制
* 	输    入: ON/OFF	ON:电源打开 OFF:电源关闭
* 	返    回: 无
********************************************************************************
*/
void PanelPower(uint8 state)
{
	if (state==ON)  {
		Pin_PanelPower_High();						// 用MCU控制
		Flg_PanelPower = 1;
		}
	else  {
		Pin_PanelPower_Low();						// 用MCU控制
		Flg_PanelPower = 0;
		}
}


/*
********************************************************************************
* 	函 数 名: PanelPowerSequence
* 	功能描述: Panel的开/关电源的顺序,通常Panel对开关电源都有严格的时序
*			  要求,否则对Panel是有损坏的
* 	输    入: ON/OFF	ON:Panel上电 	OFF:Panel断电
* 	返    回: 无
********************************************************************************
*/
void PanelPowerSequence(uint8 state)
{
	if (state == ON)  {//	上电的操作
		PanelPower(ON);
		Delay(PanelOnOff_T2);
		SarDataOut(ON);
		SarDispCtrl(DISP_OSD);
		SarLVDSPower(ON);
		Delay(PanelOnOff_T3);
		//BackLightPower(ON);
		}

	else  {				//	断电的操作
		BackLightPower(OFF);
		Delay(PanelOnOff_T4);
		SarDispCtrl(DISP_MUTE);
		SarDataOut(OFF);
		SarLVDSPower(OFF);
		Delay(PanelOnOff_T5);
		PanelPower(OFF);
		}
}


/*
********************************************************************************
* 	函 数 名: PowerSaving
* 	功能描述: 系统状态复位
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/
void PowerSaving(void)
{
	CtrlOsdReset();
	switch (SysState)  {
		case SYS_OUTOFHLOW:
		case SYS_OUTOFVLOW:
			PowerLED(POWER_SUSPEND);
			break;

		case SYS_OUTOFHIGH:
		case SYS_OUTOFLOW:
			PowerLED(POWER_OFF);
			break;
		}
	PanelPowerSequence(OFF);
	SarPower(POWER_STADBY);

#if USE_AUDIO	//chen 08-05-22
	AudioPowerDown();	
#endif
}


bit Flg_FlashLED = 0;
/*
********************************************************************************
* 	函 数 名: FlashLED
* 	功能描述: 使电源指示灯闪烁
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/
void FlashLED(void)
{
	if (SysPar.Flag & FLAG_POWER)  {
		Flg_FlashLED = ~Flg_FlashLED;
		if (Flg_FlashLED)  PowerLED(POWER_OFF);
		else  PowerLED(POWER_NORMAL);
		}
}


/*
********************************************************************************
* 	函 数 名: SetBackLight
* 	功能描述: 控制背光灯的亮度,这是通过SCALAR输出的PWM来调整,而不是原来的MCU输出
* 	输    入: val	: 背光灯的亮度值
* 	返    回: 无
********************************************************************************
*/
void SetBackLight(uint8 val)
{
	val = ((uint16)val * 255)/100;

#if EN_BACKLIGHT_INVERSE
	WrScalarReg(rP075, val);
	WrScalarReg(rP074, 255 - val);
	WrScalarReg(rP077, val);
	WrScalarReg(rP076, 255 - val);

#else
	WrScalarReg(rP074, val);
	WrScalarReg(rP075, 255 - val);
	WrScalarReg(rP076, val);
	WrScalarReg(rP077, 255 - val);
#endif
}


/*
********************************************************************************
* 	函 数 名: PowerOn
* 	功能描述: 开电源
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/
void PowerOn(void)
{
	PowerLED(POWER_NORMAL);
	LoadAllPar();
	SarPostInit();
	OsdInit();
	SyncInit();

#if EN_LOGO
	MenuShowLogo();
	OsdInit();
#endif

#if EN_PanelReverse
	PanelReverse();
#endif
	ModeState = MODE_INIT;
	Pin_SysPower = HIGH;
}


/*
********************************************************************************
* 	函 数 名: PowerOff
* 	功能描述: 关电源
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/
void PowerOff(void)
{
	DisplayMute(ON);
	PowerLED(POWER_CUTOFF);
	SetTimerEvent(EVENT_MUTEOFF, 0x00);
	SetTimerEvent(EVENT_SYSREST, 0x00);
	if (GetEventTime(EVENT_SAVEPAR))  SaveAllPar();
	CtrlOsdReset();
	PanelPowerSequence(OFF);
	SarPower(POWER_CUTOFF);
	
	Flg_Factory = 0;
		
#if USE_AUDIO
	AudioPowerDown();
#endif

	SysState = SYS_POWEROFF;
	ModeState = MODE_POWEROFF;
	DisableScalarInt();
	Flg_SyncInt = 0;
	Pin_SysPower = LOW;
	Delay(400);
}


/*
********************************************************************************
* 	函 数 名: HexToDisp
* 	功能描述: 将16进制数转换成可以显示的OSD字符,并放入制定的缓冲区
* 	输    入: Flag	: 0表示转成可显示的基本码,1: 表示转成ASCII码
*			  Hex	: 需要转换的16进制数
*             Str	: 结果存放的目的缓冲区指针
* 	返    回: 返回转换的位数
*	注    意: 这里采用的是减法进行转换,另外的方法还有除法转换和循环移位的方法
********************************************************************************
*/
uint8 HexToDisp(uint8 Flag, uint16 Hex, uint8 *Str)
{
	uint16 va;
	uint8 i;
	bit Flg_Inc;

	va = 10000;
	i  = 0;
	Flg_Inc = 0;

	for (;;)  {
		if (Flag) Str[i] = '0';
		else Str[i] = 1;
		while ((Hex >= va) && (va > 9))  {
			Hex -= va;
			Str[i]++;
			Flg_Inc = 1;
			}
		va /= 10;
		if (Flg_Inc)  i++;
		if (va <= 9)  break;
		}
	if (Flag) Str[i] = Hex + '0';
	else Str[i] = Hex + 1;
	return (i + 1);
}


/*
********************************************************************************
* 	函 数 名: PanelReverse
* 	功能描述: 控制Panel左右上下的翻转控制
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/
#if EN_PanelReverse
void PanelReverse(void)
{
}
#endif


void ActivePowerSaving(void)
{
	SetTimerEvent(EVENT_POWERSAVING, SysPar.PowerSaveTime<<1);
}


uint8 code MenuSource[] = {
	SOURCE_VGA,
};

uint8 GetSourceCount(void)
{
	return sizeof(MenuSource);
}


/*
********************************************************************************
* 	函 数 名: SelVideoInput
* 	功能描述: 选择视频信号输入的通道,这里头包括Video Decoder的视频信号通道选择
*             同时也包括Scalar的通道选择。
* 	输    入: input   : 指定信号的输入源
* 	返    回: 无
********************************************************************************
*/
void SelVideoInput(uint8 input)
{
	uint8 rp1a7,rp1a8;
	
#if USE_AUDIO
	AudioMute(ON);
#endif

	rp1a7 = 0x0A;									// 设定同步变化的门限
	rp1a8 = 0x26;
	SyncSelType(SYNCTYPE_SEPA);

	switch (input)  {
		case  SOURCE_VGA:
			WrScalarReg(rP008, B0000_0000);		// 选择图形口输入,0通道
			//WrScalarReg(rP008, B0000_0100);		// 选择图形口输入,1通道
			WrScalarRegBit(rP020, 0x00, 0x02);		// 选择模拟输入
			WrScalarReg(rP023, 0x00);				// VGA输入
			WrScalarReg(rP16E, 0x07);
			WrScalarReg(rP060, 0x01);
			AdcDigitalContrast(0x90);
			SyncInt(ON);
			SarSetColorToneMode(CEM_OFF);
			SarBF3YCPeaking_Disable();
			break;

		case  SOURCE_DVI_D:
			WrScalarReg(rP008, B0000_0000);		// 选择图形口输入,0通道
			WrScalarRegBit(rP020, 0x02, 0x02);		// 选择数字输入
			WrScalarReg(rP023, B0010_1000);		// 数字输入条件下的一些参数设定
			WrScalarReg(rP023, 0x00);
			WrScalarReg(rP16E, 0x07);
			WrScalarReg(rP060, 0x01);
			AdcDigitalContrast(0x90);
			SyncInt(ON);
			SarSetColorToneMode(CEM_OFF);
			SarBF3YCPeaking_Disable();
			break;

		default:
			WrScalarReg(rP008, B0000_1000);		// 选择视频口输入
			WrScalarRegBit(rP020, 0x00, 0x02);		// 选择模拟输入
			WrScalarReg(rP023, 0x01);				// YPbPr输入
			//WrScalarReg(rP16E, 0xC6);
			WrScalarReg(rP16E, 0x86);
			WrScalarReg(rP040, B0100_0010);
			WrScalarReg(rP041, B0000_0000);
			WrScalarReg(rP042, B0000_0000);
			WrScalarReg(rP060, 0x05);
			AdcDigitalContrast(0xB0);
			rp1a7 = 0x0A;
			rp1a8 = 0x28;
			SarSetColorToneMode(CEM_HIGH);
			SarBF3YCPeaking_Enable();
			WrScalarWord(rP14E, RdScalarWord(rP14C)/2);
			break;
		}
	SarAutoOffset();
	WrScalarReg(rP1A7, rp1a7);
	WrScalarReg(rP1A8, rp1a8);
}


/*
********************************************************************************
* 	4:3		= 1.333		640 x 480, 800 x 600, 1024 x 768, 1400 x 1050, 1600 x 1200
*	5:4		= 1.25		1280 x 1024
*	15:10	= 1.5
*	16:9	= 1.778		1280 x 720, 1366 x 768
*	16:10	= 1.6		1280 x 800, 1440 x 900, 1680 x 1050, 1920 x 1200
*	10:6	= 1.667		800 x 480, 1280 x 768
********************************************************************************
*/
bit IsWidthPanel(void)
{
	uint8 scale;

	scale = ((uint32)PanelWidth * 100)/PanelHeight;
	if (scale > 145) return 1;
	else return 0;
}
/*
********************************************************************************
*                                文 件 结 束                                   *
********************************************************************************
*/

⌨️ 快捷键说明

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