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

📄 menu.c

📁 EVD测试仪开发源码含测试图片及部分GUI开发源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/************************************************************ 
	FileName: menu.c 

	Author:胡贵    

	Version :V1.0      

	Date: 2007.9.13

	Description: 
		菜单
	History: 

      <author>      <time>      <version >      <desc> 


************************************************************/ 

#include "includes.h"

#include "global_variable.h"


/********************************************************************
	UINT8 Index;//菜单索引
	UINT8 KeyOkIndex;//按下OK转向的菜单项索引
	UINT8 KeyPreIndex;//按下PRE转向的菜单项索引
	UINT8 KeyNextIndex;//按下NEXT转向的菜单项索引
	UINT8 KeyCancleIndex;//按下CANCLE转向的菜单项索引

	UINT8 ExcuteMode;//0x01:base only 0x02:special only 0x03:base%special

	EXP_FUN *p_ExpFun;
***********************************************************************/

//菜单结构表格
struct _menu_ code MenuTable[30]=
//MENU MenuTable[]=
{
	{0,	1,	0,	0,	0,	TXT0,	KEY1_EXP_ONLY|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_EXP_ONLY,
		ExpFunCodeCheckEnter,	ExpFunMainOnPre,		ExpFunMainOnNxt,		ExpFunMainOnQuit},	

	{1,	2,	0,	0,	0,	TXT1,	KEY1_EXP_ONLY|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_EXP_ONLY,
	ExpFunCodeCheckOnOk,	ExpFunCodeCheckOnPre,	ExpFunCodeCheckOnNxt,	ExpFunRefreshMainInterface},	

	{2,	6,	0,	3,	0,	TXT2,	KEY1_BASE_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_EXP_ONLY,
	NULL,					NULL,					NULL,					ExpFunRefreshMainInterface},	

	{3,	9,	2,	4,	0,	TXT3,	KEY1_BASE_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_EXP_ONLY,
	NULL,					NULL,					NULL,					ExpFunRefreshMainInterface},	

	{4,	12,	3,	5,	0,	TXT4,	KEY1_BASE_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_EXP_ONLY,
	NULL,					NULL,					NULL,					ExpFunRefreshMainInterface},	

	{5,	14,	4,	0,	0,	TXT5,	KEY1_BASE_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_EXP_ONLY,
	NULL,					NULL,					NULL,					ExpFunRefreshMainInterface},	

	{6,	18,	0,	7,	2,	TXT6,	KEY1_EXP_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_BASE_ONLY,
	ExpFunDataSearchEnter,	NULL,					NULL,					NULL},	

	{7,	19,	6,	8,	2,	TXT7,	KEY1_EXP_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_BASE_ONLY,
	ExpFunDataClearSelEnter,	NULL,					NULL,					NULL},	

	{8,	20,	7,	0,	2,	TXT8,	KEY1_EXP_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_BASE_ONLY,
	ExpFunDataClearAllEnter,	NULL,				NULL,				NULL},	

	{9,	21,	0,	10,	3,	TXT9,	KEY1_EXP_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_BASE_ONLY,	
	ExpFunPrintModeSetEnter,					NULL,					NULL,					NULL},	

	{10,	22,	9,	11,	3,	TXT10,	KEY1_EXP_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_BASE_ONLY,
	ExpFunDataPrintSelEnter,	NULL,					NULL,					NULL},	

	{11,	23,	10,	0,	3,	TXT11,	KEY1_EXP_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_BASE_ONLY,
	ExpFunDataPrintAllEnter,					NULL,					NULL,					NULL},	

	{12,	24,	0,	13,	4,	TXT12,	KEY1_EXP_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_BASE_ONLY,
	ExpFunYYMMDDCreat,	NULL,					NULL,					NULL},	

	{13,	25,	12,	0,	4,	TXT13,	KEY1_EXP_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_BASE_ONLY,
	ExpFunHHMMSSCreat,	NULL,					NULL,					NULL},	

	{14,	26,	0,	15,	5,	TXT14,	KEY1_EXP_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_BASE_ONLY,
	ExpFunTimeSetForSleepEnter,NULL,					NULL,					NULL},	

	{15,	27,	14,	16,	5,	TXT15,	KEY1_EXP_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_BASE_ONLY,
	ExpFunCodeSetEnter,	NULL,					NULL,					NULL},	

	{16,	28,	15,	17,	5,	TXT16,	KEY1_EXP_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_BASE_ONLY,
	ExpFunSysInfoEnter,		NULL,					NULL,					NULL},	

	{17,	29,	16,	0,	5,	TXT17,	KEY1_EXP_ONLY|KEY2_BASE_ONLY|KEY3_BASE_ONLY|KEY4_BASE_ONLY,
	ExpFunSysResetEnter,		NULL,					NULL,					NULL},	

	{18,	18,	0,	0,	6,	TXT18,	KEY1_EXP_ONLY|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_BASE_EXP,	
	ExpFunDataSearchOnOk,	ExpFunDataSearchOnPre,ExpFunDataSearchOnNxt,	ExpFunDataSearchQuit},	

	{19,	19,	0,	0,	7,	TXT19,	KEY1_EXP_ONLY|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_BASE_EXP,
	ExpFunDataClearSelOnOk,ExpFunDataClearSelOnPre,ExpFunDataClearSelOnNxt,	ExpFunDataClearSelectQuit},	

	{20,	8,	0,	0,	8,	TXT20,	KEY1_EXP_ONLY|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_BASE_EXP,
	ExpFunDataClearAllOnOk,	ExpFunNop,					ExpFunNop,					ExpFunDataClearAllQuit},	

	{21,	9,	0,	0,	9,	TXT21,	KEY1_BASE_EXP|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_BASE_EXP,
	ExpFunPrintModeSetOnOk,					ExpFunPrintModeSetOnPre,		ExpFunPrintModeSetOnNxt,					ExpFunDataPrintModeSetQuit},	

	{22,	22,	0,	0,	10,	TXT22,	KEY1_EXP_ONLY|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_BASE_EXP,
	ExpFunDataPrintSelOnOk,	ExpFunDataPrintSelOnPre,	ExpFunDataPrintSelOnNxt,	ExpFunDataPrintSelectQuit},	

	{23,	11,	0,	0,	11,	TXT23,	KEY1_EXP_ONLY|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_BASE_EXP,	
	ExpFunDataPrintAllOnOk,	ExpFunDataPrintAllOnPre,ExpFunNop,				ExpFunDataPrintAllQuit},	

	{24,	12,	0,	0,	12,	TXT24,	KEY1_BASE_EXP|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_BASE_EXP,
	ExpFunYYMMDDOnOk,	ExpFunYYMMDDOnPre,	ExpFunYYMMDDOnNxt,	ExpFunTimeSetEsc},	

	{25,	13,	0,	0,	13,	TXT25,	KEY1_BASE_EXP|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_BASE_EXP,	
	ExpFunHHMMSSOnOk,	ExpFunHHMMSSOnPre,	ExpFunHHMMSSOnNxt,	ExpFunTimeSetEsc},	

	{26,	14,	0,	0,	14,	TXT26,	KEY1_BASE_EXP|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_BASE_EXP,
	ExpFunTimeSetForSleepOnOk,ExpFunTimeSetForSleepPre,	ExpFunTimeSetForSleepNxt,	ExpFunTimeSetForSleepQuit},	

	{27,	15,	0,	0,	15,	TXT27,	KEY1_BASE_EXP|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_BASE_EXP,
	ExpFunCodeSetOnOk,		ExpFunCodeSetPre,		ExpFunCodeSetNxt,		ExpFunCodeSetQuit},	

	{28,	16,	0,	0,	16,	TXT28,	KEY1_BASE_EXP|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_BASE_EXP,	
	ExpFunSysInfoOk,		ExpFunNop,				ExpFunNop,				ExpFunSysInfoBack},	

	{29,	29,	0,	0,	17,	TXT29,	KEY1_EXP_ONLY|KEY2_EXP_ONLY|KEY3_EXP_ONLY|KEY4_BASE_EXP,	
	ExpFunSysReset,			ExpFunNop,				ExpFunNop,				ExpFunSysResetQuit},	
};



//UINT8 FocusIndex=0;
//UINT8 xdata CursorLocation=0;//base to 0

//UINT8 xdata IndexStack[10]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
//UINT8 *xdata p_Stack=IndexStack;


/*********************************************************************
	Description:光标位置入栈
	
	Input:
		CursorLocation:光标位置,基于0
	
	Output:

	Return:

	Gloable:	

	Calls:

	Called By:

	Others:

	Modify Record:
	
*********************************************************************/
void CursorLocationPush(UINT8 CursorLocation)
{
	*p_Stack++=CursorLocation;
}


/*********************************************************************
	Description:光标位置出栈
	
	Input:
		CursorLocation:光标位置,基于0
	
	Output:

	Return:

	Gloable:	

	Calls:

	Called By:

	Others:

	Modify Record:
	
*********************************************************************/
UINT8 CursorLocationPop(void)
{
	UINT8 tmp;

	tmp=*(--p_Stack);
	*p_Stack=0xff;
	
	return tmp;
}


/*********************************************************************
	Description:绘制菜单项
	
	Input:
		index:菜单编号
	
	Output:

	Return:

	Gloable:	

	Calls:

	Called By:

	Others:

	Modify Record:
	
*********************************************************************/
void DrawMenu(UINT8 index)
{
	UINT8 IndexTmp[3],	TextLen[3];
	UINT8 i;

	i=sizeof(struct _menu_);
	
	switch(CursorLocation)
	{
		case 0:
		{
			IndexTmp[0]=index;
			IndexTmp[1]=MenuTable[index].KeyNextIndex;
			if(IndexTmp[1])
				IndexTmp[2]=MenuTable[IndexTmp[1]].KeyNextIndex;
			else
				IndexTmp[2]=0x00;
		}
			break;
		case 1:
		{
			IndexTmp[0]=MenuTable[index].KeyPreIndex;
			IndexTmp[1]=index;
			IndexTmp[2]=MenuTable[index].KeyNextIndex;
		}
			break;
		case 2:
		{
			IndexTmp[2]=index;
			IndexTmp[1]=MenuTable[index].KeyPreIndex;
			if(IndexTmp[1])
				IndexTmp[0]=MenuTable[IndexTmp[1]].KeyPreIndex;
			else
				IndexTmp[0]=0x00;
		}
			break;
	}

	if(IndexTmp[0] || IndexTmp[1] || IndexTmp[2])
	{

		GUI_ClearRect(0,	 127,	 0,	 46);
//		GUI_ClearRect(0,	 127,	 0,	 46);
		
		/*GUI_DrawHLine(1,	 100,	 0);
		GUI_DrawVLine(0,	 10,	 1);	
		GUI_DrawHLine(2,	 64,	 44);
		GUI_DrawHLine(14,	 92,	 45);
		GUI_DrawHLine(30,	 125,	 46);
		GUI_DrawVLine(0,	 15,	 123);
		GUI_DrawVLine(4,	 22,	 124);
		GUI_DrawVLine(8,	 32,	 125);*/

		GUI_DrawRect(1,	 125,	 0,	 44);
		GUI_DrawHLine(2,	 126,	 45);
		GUI_DrawVLine(1,	 45,	 126);
		
		for(i=0;i<3;i++)
		{
			if(IndexTmp[i])
				TextLen[i]=GUI_DispLine_(MenuTable[IndexTmp[i]].p_Text,	 
				MENU_TXT_X_COORDINATE,	 
				MENU_TXT_Y_COORDINATE+i*MENU_TXT_Y_SPACE);
		}

		GUI_InvertRect(MENU_TXT_X_COORDINATE-1,	 
			MENU_TXT_X_COORDINATE+12*TextLen[CursorLocation],	 
			MENU_TXT_Y_COORDINATE+MENU_TXT_Y_SPACE*CursorLocation-12,	 
			MENU_TXT_Y_COORDINATE+MENU_TXT_Y_SPACE*CursorLocation);

		//GUI_InvertRect(1,	 83,	 0,	 46);
		
		Display();
	}
}


/*********************************************************************
	Description:菜单上下行
	
	Input:
		key:按键消息
	
	Output:

	Return:

	Gloable:	

	Calls:

	Called By:

	Others:

	Modify Record:
	
*********************************************************************/
void MenuServer(UINT8 key)
{
	EXTERN_INT1_DISABLE;
	switch (key)
	{
		case KEY_SET:
		{
			switch(MenuTable[FocusIndex].ExcuteMode&0x000f)
			{
				case KEY1_BASE_ONLY:
				{
					FocusIndex=MenuTable[FocusIndex].KeyOkIndex;
					CursorLocationPush(CursorLocation);
					CursorLocation=0;
					DrawMenu(FocusIndex);
				}
					break;
				case KEY1_EXP_ONLY:
				{
					(*MenuTable[FocusIndex].p_Btn1Serv)();
				}
					break;
				case KEY1_BASE_EXP:
				{
					(*MenuTable[FocusIndex].p_Btn1Serv)();
					FocusIndex=MenuTable[FocusIndex].KeyOkIndex;
					//CursorLocationPush(CursorLocation);
					//CursorLocation=0;
					DrawMenu(FocusIndex);
				}
					break;
			}
		}
			break;
		case KEY_PRE:
		{
			switch(MenuTable[FocusIndex].ExcuteMode&0x00f0)
			{
				case KEY2_BASE_ONLY:
				{
					if(MenuTable[FocusIndex].KeyPreIndex)
						FocusIndex=MenuTable[FocusIndex].KeyPreIndex;
					CursorLocation--;
					if(CursorLocation==255)
						CursorLocation=0;
					DrawMenu(FocusIndex);
				}
					break;
				case KEY2_EXP_ONLY:
				{
					(*MenuTable[FocusIndex].p_Btn2Serv)();
				}
					break;
				case KEY2_BASE_EXP:
				{
					(*MenuTable[FocusIndex].p_Btn2Serv)();
					if(MenuTable[FocusIndex].KeyPreIndex)
						FocusIndex=MenuTable[FocusIndex].KeyPreIndex;
					CursorLocation--;
					if(CursorLocation==255)
						CursorLocation=0;
					DrawMenu(FocusIndex);
		
				}
					break;
			}
		}
			break;
		case KEY_NXT:
		{
			switch(MenuTable[FocusIndex].ExcuteMode&0x0f00)
			{
				case KEY3_BASE_ONLY:
				{
					if(MenuTable[FocusIndex].KeyNextIndex)
					{
						FocusIndex=MenuTable[FocusIndex].KeyNextIndex;
						CursorLocation++;
					}
					if(CursorLocation==3)
						CursorLocation=2;
					DrawMenu(FocusIndex);
				}
					break;
				case KEY3_EXP_ONLY:
				{
					(*MenuTable[FocusIndex].p_Btn3Serv)();

				}
					break;
				case KEY3_BASE_EXP:
				{
					(*MenuTable[FocusIndex].p_Btn3Serv)();
					if(MenuTable[FocusIndex].KeyNextIndex)
					{
						FocusIndex=MenuTable[FocusIndex].KeyNextIndex;
						CursorLocation++;
					}
					if(CursorLocation==3)
						CursorLocation=2;
					DrawMenu(FocusIndex);		
				}
					break;
			}
		}
			break;
		case KEY_ESC:
		{
			switch(MenuTable[FocusIndex].ExcuteMode&0xf000)
			{
				case KEY4_BASE_ONLY:
				{
					FocusIndex=MenuTable[FocusIndex].KeyCancleIndex;
					CursorLocation=CursorLocationPop();
					DrawMenu(FocusIndex);
				}
					break;
				case KEY4_EXP_ONLY:
				{
					(*MenuTable[FocusIndex].p_Btn4Serv)();

				}
					break;
				case KEY4_BASE_EXP:
				{
					(*MenuTable[FocusIndex].p_Btn4Serv)();
					FocusIndex=MenuTable[FocusIndex].KeyCancleIndex;
					CursorLocation=CursorLocationPop();
					DrawMenu(FocusIndex);

				}
					break;
			}			
		}
			break;
	}
	EXTERN_INT1_ENABLE;
}


/*********************************************************************
	Description:重绘主界面
	
	Input:
	
	Output:

	Return:

	Gloable:	

	Calls:

	Called By:

	Others:

	Modify Record:
	
*********************************************************************/
void ExpFunRefreshMainInterface(void)
{
	FlagIdleMode=1;
	FocusIndex=MenuTable[FocusIndex].KeyCancleIndex;
	CursorLocation=CursorLocationPop();
	DrawManiInterface();
	DrawFlash(1);
	ExperimentStep=1;
	TIMER0_START;
}


/*********************************************************************
	Description:创建设置年月日的标签
	
	Input:
	
	Output:

	Return:

	Gloable:	

	Calls:

	Called By:

	Others:

	Modify Record:
	
*********************************************************************/
void ExpFunYYMMDDCreat(void)
{
	CursorLocationPush(CursorLocation);
	FocusIndex=MenuTable[FocusIndex].KeyOkIndex;
	CreateStpLabel_YMD(MenuTable[FocusIndex].p_Text, 
		32, 
		20, 
		&SystemTime, 
		44, 
		40, 
		1);
	ExpFunBtnRedraw3();
	Display();
}


/*********************************************************************
	Description:创建设置时分秒的标签
	
	Input:
	
	Output:

	Return:

	Gloable:	

	Calls:

	Called By:

	Others:

	Modify Record:
	
*********************************************************************/
void ExpFunHHMMSSCreat(void)
{
	CursorLocationPush(CursorLocation);
	FocusIndex=MenuTable[FocusIndex].KeyOkIndex;
	CreateStpLabel_YMD(MenuTable[FocusIndex].p_Text, 
		32, 
		20, 
		&SystemTime, 

⌨️ 快捷键说明

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