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

📄 mmi.c

📁 非常好的电源管理和按键处理
💻 C
字号:
/*****************************************************************************
*
*  $Log: D:\VM700\software\power.c $
*
*  1     03-11-17 19:51  Wang Guanping
*  Begin to edit the source code.
*****************************************************************************/

#define GLOBALS_MMI
#include "include.h"

//static void Enter_Menu(void);
//static void Exit_Menu(void);
//static void Exit_Testmode(void);
//static int8u password_index;

/*
static void PostKeyMessage(MSG_MODULE p,MESSAGE_ID nMsg)
{
	PostMessage(p,nMsg,0);
	return;
}

void Send_Power_On(void)
{
		PostKeyMessage(PwrMsgQueue,MSG_POWER_ON);
		ActiveValue=NO_KEY;
}
void Send_Power_Off(void)
{
			PostKeyMessage(PwrMsgQueue,MSG_POWER_OFF);
			if(ValBit(Sys_Flag,F_Test))
			{
				Exit_Testmode();
			}
			PowerOffSource=KEY_POWER_OFF;
			SaveSetting();	
}
*/
/*
static void Exit_Testmode(void)
{
	ClrBit(Sys_Flag,F_Test);
	PostOsdMsg(MSG_OSD_TEST_EXIT,(int16u)nTest_Setp);
	Save_RB5_Data();
	RB5_Init();
	SaveSetting();
	return;
}
*/

/*
static int8u KeySource(int8u action)
{
	int8u source=0;
	//Determine key source
	for(;;)
	{
		if(ValBit(action,0))break;
		source++;
		action>>=1;
	}
	return source;
}

static void CheckRepeat(int8u source)
{
	static int16u nTimeMem[NUMOFKEYSOURCE];
	int16u i;
	if(ValBit(Key_Status,source)==0)
	{
		g_Key[source].Time=0;
		return;
	}
	if(g_Key[source].Time<T_RPT_DELAY)
	{
		nTimeMem[source]=0;
		return;
	}
	if(nTimeMem[source])
	{
		i=g_Key[source].Time-nTimeMem[source];
		if(i<T_RPT_CYCLE)return;

		//防止按键时间无限自增而导致计数器溢出
		if(g_Key[source].Time>=MAXKEYTIME)
		g_Key[source].Time-=T_RPT_CYCLE;
	}
	nTimeMem[source]=g_Key[source].Time;
	SetBit(Repeat,source);
	return;
}

#define F_Press     0
#define F_Release   1
#define F_LongPress 2
#define F_Repeat    3
#define F_LP_Status 4

#define bPress      ValBit(action,F_Press)
#define bRelease    ValBit(action,F_Release)		//按键释放
#define bLongPress  ValBit(action,F_LongPress)
#define bRepeat     ValBit(action,F_Repeat)
#define bLP_Status  ValBit(action,F_LP_Status)
static int8u GetEvent(void)
{
	int8u action;
	action=0;
	if(ValBit(Press,ActiveSource))
	{
		SetBit(action,F_Press);		//F_Press/F_Release/F_LongPress是
	}
	if(ValBit(Release,ActiveSource))
	{
		SetBit(action,F_Release);	//按键释放
	}
	if(ValBit(LongPress,ActiveSource))
	{
		SetBit(action,F_LongPress);
	}
	if(ValBit(Repeat,ActiveSource))
	{
		SetBit(action,F_Repeat);
	}
	if(action==0)
		return 0;
	if(ValBit(LongPress_StatusMem,ActiveSource)
	||ValBit(LongPress_Status,ActiveSource))
	{
		SetBit(action,F_LP_Status);
	}
	return action;
}

static int8u nWatch_OSD_Timer;

static void Enter_Menu()
{
	nWatch_OSD_Timer=0;
	SetBit(Video_Flag,F_SysMenu);				//在菜单状态
	Setup_Index=SETUP_SCREEN_SELECT;
	PostOsdMsg(MSG_OSD_MENU_PRO,WORD(Setup_Index,0));
	return;
}

#define OSD_TIMEOUT_INTERVAL T100_25S

extern void Watch_Menu()						//菜单的有效时间控制
{
	if(ValBit(Video_Flag,F_SysMenu)==0)
	{
		nWatch_OSD_Timer=0;
		return;
	}
	nWatch_OSD_Timer++;
	if(nWatch_OSD_Timer>=OSD_TIMEOUT_INTERVAL)
	{
		Exit_Menu();
	}
	return;
}

static void Exit_Menu()
{
#if 0
    {//zyq.
		Delay_us();
		Delay_us();
		Delay_us();
		Delay_us();
		Delay_us();
		Clr_Character();
		Delay_us();
		Delay_us();
		Delay_us();
		Delay_us();
		Delay_us();
		Exit_MenuWin();
		Delay_us();
		Delay_us();
		Delay_us();
		Delay_us();
		Delay_us();
		Clr_Character();
	}
#endif	
	nWatch_OSD_Timer=0;
	ClrBit(Video_Flag,F_SysMenu);				//没有在菜单状态
	PostOsdMsg(MSG_OSD_SYS_SETUP_CLR,0);		//清屏上所有显示
	SaveSetting();
	return;
}
*/
/*
//关机后只检测Power和Mute两个按键的按下
static void CtrlMainPower(void)
{
	int8u action;
	if(F_PowerStatus_Val()==0)return;
	action=GetEvent();
	if(action==0)return;
	if(ActiveValue==K_POWER&&ActiveSource==PANEL_POWER)
	{
		//关机后不需要判断长按、短按
		if(Machine_Power()==0)
		{
			if(bPress)
			{
			    //Printf_Debug(11,13,6);//debug;
    		    //return;//debug;
				PostKeyMessage(PwrMsgQueue,MSG_POWER_ON);
				ActiveValue=NO_KEY;
				//nVideoSw_Flag=0xaa;//0112.Power On;
			}
			return;
		}

		if(bLongPress) //LongPress进入关机状态
		{
		    Printf_Debug(11,12,0x55);//debug;
		    //return;//debug;
			PostKeyMessage(PwrMsgQueue,MSG_POWER_OFF);
			//ActiveValue=NO_KEY;//???
			//Printf_Debug(1,1,'!');//debug;
			if(ValBit(Sys_Flag,F_Test))
			{
				Exit_Testmode();
			}
			PowerOffSource=KEY_POWER_OFF;
			//nVideoSw_Flag=0x55;//0112.Power off
			SaveSetting();
			return;
		}
		if(bRelease)//短按进入MUTE状态
		{
		    if(Mute_Audio_Val)
		    { 
		        Mute_Audio_Clr
		    }
		    else
		    {
		        Mute_Audio_Set
		    }
			return;
		}
		return;
	}
	return;
}*/
/*
//extern unsigned char main_key_message;
static void Video_Sw_Setup()
{
	int8u action;
	if(!Machine_Power())
	{
		PostOsdMsg(MSG_OSD_RGB_ON,0);			//关机要清屏顶的OSD显示
		return;
	}
	action=GetEvent();
	if(action==0)return;
	switch(ActiveValue)
	{
		case K_MENU:
#if 0		
		main_key_message=1;

				if(ValBit(Video_Flag,F_Video_Sw))//在菜单模式下按MENU键
				{
					if(bLP_Status==false)
					{
						if(bRelease)
						{
							PostOsdMsg(MSG_OSD_VOFF_ON,0);
							ClrBit(Video_Flag,F_Video_Sw);
							//nVideoSw_Flag=0xaa;
							break;
						}
					}
				}
				if(bLongPress)			//长按MENU是video off
				{
						if(CCFL_EN_Val==0)return;
						if(ValBit(Video_Flag,F_SysMenu))
						{
						Exit_Menu();
						}
						PostOsdMsg(MSG_OSD_VOFF_OFF,0);
						SetBit(Video_Flag,F_Video_Sw);				//在菜单状态
						//nVideoSw_Flag=0x55;
						break;
				}
#endif
				break;

		case K_LEFT:
#if 0
				main_key_message=2;
#endif
				break;
		case K_RIGHT:
#if 0
				main_key_message=3;
#endif
				break;
		case K_POWER:
			if(ValBit(Video_Flag,F_Video_Sw))//在菜单模式下按MENU键
			{
				if(bLP_Status==false)
				{
					if(bRelease)
					{
						PostOsdMsg(MSG_OSD_VOFF_ON,0);
						ClrBit(Video_Flag,F_Video_Sw);
						//nVideoSw_Flag=0xaa;
						break;
					}
				}
			}
			break;

		case K_MODE:
#if 0
			if(ValBit(Video_Flag,F_Video_Sw))//在菜单模式下按MENU键
			{
				if(bLP_Status==false)
				{
					if(bRelease)
					{
						PostOsdMsg(MSG_OSD_VOFF_ON,0);
						ClrBit(Video_Flag,F_Video_Sw);
						//nVideoSw_Flag=0xaa;
						break;
					}
				}
				if(bLongPress)			//长按MENU是video off
				{
					if(CCFL_EN_Val==0)return;
					SetBit(Video_Flag,F_SysAvOut);
					nAvOut_Flag=~nAvOut_Flag;
					//zyq.if(nAvOut_Flag==0x55){Sel_AV_OUTPUT2};
					//zyq.if(nAvOut_Flag==0xaa){Sel_AV_OUTPUT1};
					if(nAvOut_Flag==0x55){//zyq.
					    Set_Mute_B   //BOX Mute
					    Delay_ms(20);
					    Sel_AV_OUTPUT2
					    Delay_ms(20);
					    Clr_Mute_B   //Clear BOX Mute
					};
					if(nAvOut_Flag==0xaa){//zyq.
					    Set_Mute_B   //BOX Mute
					    Delay_ms(20);
					    Sel_AV_OUTPUT1
					    Delay_ms(20);
					    Clr_Mute_B   //Clear BOX Mute
					};
					PostOsdMsg(MSG_OSD_TOP_AVOUT,(int16u)nAvOut_Flag);
					Tip_Timer=150;
					SaveSetting();
				}
			}
#endif
			break;
	}
	return;
}
//--------------------------------------

#pragma CONST_SEG DEFAULT
const int8u PasswordTable[6]=
{
	K_RIGHT,
	K_LEFT,
	K_RIGHT,
	K_RIGHT,
	K_LEFT,
	K_LEFT
};
#pragma CODE_SEG DEFAULT

static void Enter_Testmode(void)
{
	SetBit(Sys_Flag,F_Test);
	password_index=0;
	DefaultPictureSetting();//进入工厂设定模式后,自动调为默认参数?
	RB5_Init();
	PostOsdMsg(MSG_OSD_TEST_ENTER,0);
	return;
}
*/

/*
static void CheckTestKey()
{
	if(password_index>5)
		password_index=0;
	if(ActiveValue==PasswordTable[password_index])
	{
		password_index++;
		if(password_index==6)
		{
			Enter_Testmode();
		}
	}
	else
	{
		password_index=0;
	}
}

static void Key_Test_Setup()
{
	int8u action;
	int8u Msg_ID;
	Msg_ID=ActiveValue;
	//int8u test_key_val;
	if(!Machine_Power())
	{
		PostOsdMsg(MSG_OSD_TEST_EXIT,(int16u)nTest_Setp);			//关机要清屏顶的OSD显示
		return;
	}
	if(Msg_ID==NO_KEY)return;
	action=GetEvent();
	if(action==0)return;
	if(action==1)return;
	if(ValBit(Video_Flag,F_SysMenu))return;		//在MENU操作时,不允许进入TEST MODE
	if(ValBit(Video_Flag,F_SysAvOut))return;
	if(ValBit(Video_Flag,F_SysAvIn))return;
	if(ValBit(Video_Flag,F_SysMode))return;
	if(ValBit(Video_Flag,F_Video_Sw))return;
	if(!ValBit(Sys_Flag,F_Test))				//没有在测试模式下
	{
		if(Msg_ID==K_LEFT||Msg_ID==K_RIGHT)
		{
			CheckTestKey();
		}
		else
		{
			Prepare_TestMode();
		}
		return;
	}

	if(Msg_ID==K_LEFT)
	{
		if(bLP_Status==false)
		{
			if(bRelease)
			{
				if(ValBit(Sys_Flag,F_Test))
				{
					PostOsdMsg(MSG_OSD_TEST_PRO,(int16u)nTest_Setp);
					RB5_Adjust_Reg(nTest_Setp,false);
				}
			}
		}
		if(bLongPress)
		{
			if(ValBit(Sys_Flag,F_Test))
			{
			Exit_Testmode();
			}
		}
		return;
	}

	if(Msg_ID==K_RIGHT)
	{
		if(bLP_Status==false)
		{
			if(bRelease)
			{
				if(ValBit(Sys_Flag,F_Test))
				{
					PostOsdMsg(MSG_OSD_TEST_PRO,(int16u)nTest_Setp);
					RB5_Adjust_Reg(nTest_Setp,true);
				}
			}
		}
		return;
	}

	if(Msg_ID==K_MODE)
	{
		if(bLP_Status==false)
		{
			if(Release)
			{
				if(ValBit(Sys_Flag,F_Test))
				{
					nTest_Setp++;
					if(nTest_Setp>TEST_TINT)
					nTest_Setp=TEST_COLOR;//TEST_PICTURE;
					PostOsdMsg(MSG_OSD_TEST_PRO,(int16u)nTest_Setp);
				}
			}
		}
		return;
	}
	return;
}
*/
/*
//-------------------------------------
static void Key_Top_Setup()
{
	int8u action;
	if(!Machine_Power())
	{
		PostOsdMsg(MSG_OSD_TOP_CLR,0);			//关机要清屏顶的OSD显示
		return;
	}
	action=GetEvent();
	if(action==0)return;
	switch(ActiveValue)
	{
		case K_MODE:
		break;

		case K_POWER:
		if(ValBit(Video_Flag,F_SysMenu)==0&&ValBit(Video_Flag,F_Video_Sw)==0)		//不是在菜单模式下,是快捷键操作
		{
			if(bLP_Status==false)			//不要该条件可不可以???
			{
				if(bRelease)			//短按POWER是V.SEL的AV-IN切换
				{
					if(CCFL_EN_Val==0)return;
					SetBit(Video_Flag,F_SysAvOut);
					nAvIn_Flag=~nAvIn_Flag;
						if(nAvIn_Flag==0x55)
						{
						//Sel_AV_INPUT1
						avv=AV1;
						}
						if(nAvIn_Flag==0xaa)
						{
						//Sel_AV_INPUT2
						avv=AV2;
						}
					//TFT_Device_Init();
					//PostOsdMsg(MSG_OSD_MUTE,0);
					//PostOsdMsg(MSG_OSD_UNMUTE,0);
					Clr_CCFL_EN
					V_RGB_BLANK_OFF();
					Video_Soft_Mute();
					Set_IR_SW   //zyq.IR headphone off
					PostOsdMsg(MSG_OSD_TOP_AVIN,(int16u)nAvIn_Flag);
					Tip_Timer=150;
					SaveSetting();
				}
				break;
			}
		}
		break;

		default:
		break;
	}
	return;
}

static void CtrlMenuSetup(void)
{
	int8u action;//,disp_prm;
	if(!Machine_Power())//关机要退出菜单
	{
		Exit_Menu();
		return;
	}
	action=GetEvent();
	if(action==1)return;		//Press把按键按下动作拿掉,按键释放有效
	if(action==0)return;
	switch(ActiveValue)
	{
		case K_MENU:

			break;

		case K_LEFT:

			break;
		case K_RIGHT:

			break;

		case K_POWER:			//在菜单模式下按短按K_POWER或者K_MODE退出菜单
			break;
		case K_MODE:

			break;
		default:
			break;
	}
	//PostOsdMsg(MSG_OSD_MENU_PRO,WORD(Setup_Index,disp_prm));
	return;
}
*/
/*
void DispatchMessage()
{
	int8u source;

	//按键测试模式下,不响应任何按键
	if(ValBit(Sys_Flag,F_Test))
	{
		;
		//if(Get_OSD_Test_State()!=OSD_TEST_KEYVALUE)
		//	bKeyTest=false;
		//if(bKeyTest)			暂时没有做上去
		//	Key_Status=0;
	}

	//计算按键状态的上升沿和下降沿
	//If Key_Status is also set at IR interrupt
	//Then IR interrupt must be disabled during operation of Key_Status and Key_StatusMem
	Press=((~Key_StatusMem)&Key_Status);
	Release=(Key_StatusMem&(~Key_Status));
	Key_StatusMem=Key_Status;

	//计算长按状态的上升沿
	LongPress_Status=0;
	for(source=0;source<NUMOFKEYSOURCE;source++)
	{
		if(ValBit(Key_Status,source))
		{
			if(g_Key[source].Time>=T_LONG_PRESS)
			SetBit(LongPress_Status,source);
		}
	}
	LongPress=((~LongPress_StatusMem)&LongPress_Status);

	//计算重复状态的上升沿
	Repeat=0;
	for(source=0;source<NUMOFKEYSOURCE;source++)CheckRepeat(source);


	//Process the new pressed key.
	if(Press)
	{
		ActiveSource=KeySource(Press);
		ActiveValue=g_Key[ActiveSource].Value;
	}
	CtrlMainPower();
	Key_Test_Setup();
	if(Machine_Power()&&(ValBit(Sys_Flag,F_Test)==0))
	{
    	//debug;Key_Top_Setup();	//快揭键下的关机在Key_Power_Setup()里
	    CtrlMenuSetup();	//菜单下的关机也在Key_Power_Setup()里
    	Video_Sw_Setup();
	}


	ClrBit(Press,ActiveSource);
	ClrBit(Release,ActiveSource);
	ClrBit(LongPress,ActiveSource);
	ClrBit(Repeat,ActiveSource);

	LongPress_StatusMem=LongPress_Status;
	for(source=0;source<NUMOFKEYSOURCE;source++)
	{
		if(ValBit(Key_Status,source)==0)
		{
			ClrBit(Press,source);
			ClrBit(Release,source);
			ClrBit(LongPress,source);
			ClrBit(Repeat,source);
		}
	}
	return;
}*/

⌨️ 快捷键说明

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