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

📄 menu_implement.c

📁 LCD1602键盘显示模块实例
💻 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 + -