📄 menu_implement.c
字号:
/***********************************************************
* 函数库说明:菜单驱动函数库 *
* 版本: v1.00 *
* 作者: 王卓然 *
* 创建日期: 2007年9月02日 *
* -------------------------------------------------------- *
* [支 持 库] *
* 支持库名称: *
* 需要版本: *
* 声明库说明: *
* -------------------------------------------------------- *
* [版本更新] *
* 修改: *
* 修改日期: *
* 版本: *
* -------------------------------------------------------- *
* [版本历史] *
* -------------------------------------------------------- *
* [使用说明] *
***********************************************************/
/********************
* 头 文 件 配 置 区 *
********************/
# include "RD_MacroAndConst.h"
# include "Menu_Config.h"
# include "Menu_Implement.h"
# include "LIB_Config.h"
# include "PF_Config.h"
/********************
* 系 统 宏 定 义 *
********************/
/*------------------*
* 常 数 宏 定 义 *
*------------------*/
/*------------------*
* 动 作 宏 定 义 *
*------------------*/
/********************
* 用户变量类型定义 *
********************/
/********************
* 结构体定义区 *
********************/
/********************
* 模块函数声明区 *
********************/
static void Show_Menu(const MENU_ITEM *pStart,uint8 cHandPOS);
static void Show_Welcome(void);
/********************
* 全局函数声明区 *
********************/
BOOL PROC_Menu(void);
void Menu_Process_INIT(void);
/********************
* 模块变量声明区 *
********************/
static const MENU_ITEM *s_pMenuRoot = &g_Menus[0];
static const MENU_ITEM *s_pCurrentMenuItem = NULL;
static const MENU_ITEM *s_pDISPMenuItem = NULL;
static uint8 s_cIdleTimeCounter = 0;
/********************
* 全局变量声明区 *
********************/
/***********************************************************
* 函数说明:目录处理模块初始化函数 *
* 输入: 无 *
* 输出: 无 *
* 调用函数:无 *
***********************************************************/
void Menu_Process_INIT(void)
{
s_pCurrentMenuItem = s_pMenuRoot;
s_pDISPMenuItem = s_pMenuRoot;
s_cIdleTimeCounter = 10;
}
/***********************************************************
* 函数说明:欢迎信息显示函数 *
* 输入: 无 *
* 输出: 无 *
* 调用函数:无 *
***********************************************************/
static void Show_Welcome(void)
{
Flash("[",' ',1,1);
Flash("]",' ',16,1);
RunString("National Undergradute Electronic Design Contest 2008 Dare to Create & Enjoy! ",1,2,15);
Flash("PRESS ANY KEY...",' ',1,2);
}
/***********************************************************
* 函数说明:目录处理函数 *
* 输入: 无 *
* 输出: 无 *
* 调用函数:无 *
***********************************************************/
BOOL PROC_Menu(void)
{
if (!(g_wSystemTimer & 0x03ff))
{
s_cIdleTimeCounter++;
}
if (s_cIdleTimeCounter >= 10)
{
s_cIdleTimeCounter = 10;
Show_Welcome();
if (Get_Key_Code())
{
CLS
s_cIdleTimeCounter = 0;
}
return TRUE;
}
if ((s_pDISPMenuItem == NULL) || (s_pCurrentMenuItem == NULL))
{
//容错处理
if (s_pDISPMenuItem != NULL)
{
s_pCurrentMenuItem = s_pDISPMenuItem;
}
else if (s_pCurrentMenuItem != NULL)
{
s_pDISPMenuItem = s_pCurrentMenuItem;
}
else
{
//错误处理函数
Show_Menu(NULL,1);
return TRUE;
}
}
if (s_pDISPMenuItem == s_pCurrentMenuItem)
{
Show_Menu(s_pDISPMenuItem,1);
}
else
{
Show_Menu(s_pDISPMenuItem,2);
}
if (Get_Key_Code())
{
//检测普通按键
s_cIdleTimeCounter = 0;
CLS
switch (g_cReturnKeyNum)
{
case KEY_UP:
if (s_pDISPMenuItem == s_pCurrentMenuItem)
{
if (s_pCurrentMenuItem->pPreviouse != NULL)
{
s_pCurrentMenuItem = s_pCurrentMenuItem->pPreviouse;
s_pDISPMenuItem = s_pCurrentMenuItem;
}
}
else
{
s_pCurrentMenuItem = s_pDISPMenuItem;
}
break;
case KEY_DOWN:
if (s_pDISPMenuItem == s_pCurrentMenuItem)
{
if (s_pCurrentMenuItem->pNext != NULL)
{
s_pCurrentMenuItem = s_pCurrentMenuItem->pNext;
}
}
else
{
s_pDISPMenuItem = s_pCurrentMenuItem;
if (s_pCurrentMenuItem->pNext != NULL)
{
s_pCurrentMenuItem = s_pCurrentMenuItem->pNext;
}
}
break;
case KEY_RIGHT:
case KEY_5:
case KEY_ENTER:
if (s_pCurrentMenuItem->pChild != NULL)
{
s_pCurrentMenuItem = s_pCurrentMenuItem->pChild;
s_pDISPMenuItem = s_pCurrentMenuItem;
}
else if (s_pCurrentMenuItem->fnTask != NULL)
{
(s_pCurrentMenuItem->fnTask)(); //调用函数
}
else
{
CLS;
LOCATE(1,2);
PRINT("PRESS ANY KEY...");
while(!Get_Key_Code())
{
Flash("ERROR: NULL ITEM!",' ',1,1);
}
CLS
}
break;
case KEY_LEFT:
if (s_pCurrentMenuItem->pParent != NULL)
{
s_pCurrentMenuItem = s_pCurrentMenuItem->pParent;
s_pDISPMenuItem = s_pCurrentMenuItem;
}
break;
default:
break;
}
//检测长按键
switch (g_cReturnLongPressKeyNum)
{
case KEY_LEFT: //长按LEFT键返回根目录
s_pCurrentMenuItem = s_pMenuRoot;
s_pDISPMenuItem = s_pCurrentMenuItem;
break;
default:
break;
}
}
return TRUE;
}
/***********************************************************
* 函数说明:目录打印函数 *
* 输入: 要显示的起始目录条目、光标位置 *
* 输出: 无 *
* 调用函数:LOCATE() PRINT() *
***********************************************************/
static void Show_Menu(const MENU_ITEM *pStart,uint8 cHandPOS)
{
if (pStart == NULL)
{
CLS;
LOCATE(1,2);
PRINT("PRESS ANY KEY...");
while(!Get_Key_Code())
{
Flash("ERROR: NO MENU!",' ',1,1);
}
return ;
}
LOCATE(4,1);
PRINT(pStart->String);
if (pStart->pNext != NULL)
{
LOCATE(4,2);
PRINT(pStart->pNext->String);
LOCATE(2,((cHandPOS-1) & 0x01)+1);
PRINT(">");
}
else
{
LOCATE(2,1);
PRINT(">");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -