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

📄 menu.c

📁 真正实现完美应用的以LCD12864为显示终端的四行多级菜单源码(完整版)
💻 C
字号:
/*********************************************************************************************************
*                                              Menu Function
*                                               QiZhao,2007
*                                           All Rights Reserved
* File      : menu.c
* By        : QiZhao
* Contact   : zq1987731@163.com
*
* Version   : V1.3 α
* Corrector : QiZhao
* Date      : 2008.2.1 (Last modified)
*
* Remarks   : REFRESH_MENU_DIS ();    MAIN_MENU ();
*
*********************************************************************************************************/

    #include "menu.h"

/*********************************************************************************************************
*
*                                          Menu Display Refresh
*
*********************************************************************************************************/

    extern void REFRESH_MENU_DIS (void)
    {
        uchar LineMete = Level[MENU_LIST[Select_Index].Key_Lv][2];
        CLEAR_DIS ();
        SELECT_LINE (Select_Line);
        do
        {
            DIS_LCD (1,2,MENU_LIST[First_Index    ].KeyWord,MENU_LIST[First_Index    ].Word_Size);
            if (--LineMete == 0) break;
            DIS_LCD (2,2,MENU_LIST[First_Index + 1].KeyWord,MENU_LIST[First_Index + 1].Word_Size);
            if (--LineMete == 0) break;
            DIS_LCD (3,2,MENU_LIST[First_Index + 2].KeyWord,MENU_LIST[First_Index + 2].Word_Size);
            if (--LineMete == 0) break;
            DIS_LCD (4,2,MENU_LIST[First_Index + 3].KeyWord,MENU_LIST[First_Index + 3].Word_Size);
        }while (0);
    }

/*********************************************************************************************************
*
*              Determine whether the current Index is the first functional form function
*   Return: TRUE or FALSE
*
*********************************************************************************************************/

    static bit MenuLevelStart (void)
    {
        uchar i = MENULEVEL;
        do
        {
            i--;
            if (Select_Index == Level[i][0])
                return TRUE;
        }while (i);
        return FALSE;
    }

/*********************************************************************************************************
*
*               Index judge whether the current form is a function of the final function
*   Return: TRUE or FALSE
*
*********************************************************************************************************/

    static bit MenuLevelEnd (void)
    {
        uchar i = MENULEVEL;
        do
        {
            i--;
            if (Select_Index == Level[i][1])
                return TRUE;
        }while (i);
        return FALSE;
    }

/*********************************************************************************************************
*
*                                            Error Handling
*
*********************************************************************************************************/

    static void NoThisFunction (void)
    {
        unsigned int i,j;

        CLEAR_DIS ();
        DIS_LCD (2,1,"此项功能开发中",14);

        i = 65535;
        j = 10;
        do
        {
            do
            {
                i--;
            }while (i);
            j--;
        }while (j);

        MENU_CANCEL ();
    }

/*********************************************************************************************************
*
*                                            Key Function
*
*********************************************************************************************************/

    extern void MAIN_MENU (void)
    {
        uchar keytemp;

        do
        {
            keytemp = KEY_SCAN ();
        }while (!keytemp);

        switch (keytemp)
        {
            case '1': MENU_UP ();        break;
            case '2': MENU_DOWN ();      break;
            case '3': MENU_ENTER ();     break;
            case '4': MENU_CANCEL ();    break;
            default: break;
        }
    }

/*********************************************************************************************************
*
*                                        Menu Move Up A Line
*
*********************************************************************************************************/

    static void MENU_UP (void)
    {
        if (MenuLevelStart ())
        {
            if (Level[MENU_LIST[Select_Index].Key_Lv][2] >= 4 )
            {
                First_Index = Level[MENU_LIST[Select_Index].Key_Lv][1] - 3;
                Select_Index = Level[MENU_LIST[Select_Index].Key_Lv][1];
                Select_Line = 4;
                REFRESH_MENU_DIS ();
            }
            else
            {
                Select_Index = Level[MENU_LIST[Select_Index].Key_Lv][1];
                Select_Line  = Level[MENU_LIST[Select_Index].Key_Lv][2];
                REFRESH_MENU_DIS();
            }
        }
        else
        {
            if (Select_Line == 1)
            {
                First_Index--;
                Select_Index--;
                Select_Line = 1;
                REFRESH_MENU_DIS ();
            }
            else
            {
                Select_Line--;
                Select_Index--;
                REFRESH_MENU_DIS ();
            }
        }
    }

/*********************************************************************************************************
*
*                                        Menu Move Down A Line
*
*********************************************************************************************************/

    static void MENU_DOWN (void)
    {
        if (MenuLevelEnd ())
        {
            First_Index = Level[MENU_LIST[Select_Index].Key_Lv][0];
            Select_Index = Level[MENU_LIST[Select_Index].Key_Lv][0];
            Select_Line = 1;
            REFRESH_MENU_DIS ();
        }
        else
        {
            if (Select_Line != 4)
            {
                Select_Index++;
                Select_Line++;
                SELECT_LINE (Select_Line);
                REFRESH_MENU_DIS ();
            }
            else
            {
                First_Index++;
                Select_Index++;
                REFRESH_MENU_DIS ();
            }
        }
    }

/*********************************************************************************************************
*
*                                        Menu Cancel Option
*
*********************************************************************************************************/

    static void MENU_CANCEL (void)
    {
        if (Select_Index != M_Size - 1)
            Select_Index = MENU_LIST[Select_Index].Cancel_Index;
        else
            Select_Index = Last_Index;
        if (Level[MENU_LIST[Select_Index].Key_Lv][2] >= 4)
        {
            if(Select_Index > Level[MENU_LIST[Select_Index].Key_Lv][1] - 3)
            {
                First_Index = Level[MENU_LIST[Select_Index].Key_Lv][1] - 3;
                Select_Line = 4 - (Level[MENU_LIST[Select_Index].Key_Lv][1]-Select_Index);
                REFRESH_MENU_DIS ();
            }
            else
            {
                First_Index = Select_Index;
                Select_Line = 1;
                REFRESH_MENU_DIS ();
            }
        }
        else
        {
            First_Index = Level[MENU_LIST[Select_Index].Key_Lv][0];
            Select_Line = Select_Index - Level[MENU_LIST[Select_Index].Key_Lv][0] + 1;
            REFRESH_MENU_DIS ();
        }
    }

/*********************************************************************************************************
*
*                                        Menu Enter Function
*
*********************************************************************************************************/

    static void MENU_ENTER (void)
    {
        Last_Index = Select_Index;
        Select_Index = MENU_LIST[Select_Index].Enter_Index;
        if (Select_Index != M_Size - 1)
        {
            First_Index = Level[MENU_LIST[Select_Index].Key_Lv][0];
            Select_Line = 1;
            REFRESH_MENU_DIS ();
        }

        else
        {
            switch (Last_Index)
            {
              //case  0:                    break;
              //case  1:                    break;
                case  2:    FUN_1_1();      break;
                case  3:    FUN_1_2();      break;
                case  4:    FUN_1_3();      break;
              //case  5:                    break;
                case  6:    FUN_2_1();      break;
                case  7:    FUN_2_2();      break;
                case  8:    FUN_2_3();      break;
                case  9:    FUN_2_4();      break;
                case 10:    FUN_3_1();      break;
                case 11:    FUN_3_2();      break;
                case 12:    FUN_3_3();      break;
                case 13:    FUN_3_4();      break;
                case 14:    FUN_3_5();      break;
              //case 15:                    break;
                case 16:    FUN_2_5();      break;
                case 17:    FUN_2_6();      break;
                case 18:    FUN_2_7();      break;
                case 19:    FUN_2_8();      break;
              //case 20:                    break;
                case 21:    FUN_3_6();      break;
                case 22:    FUN_3_7();      break;
                case 23:    FUN_3_8();      break;
                case 24:    FUN_3_9();      break;
                case 25:    FUN_4_1();      break;
                case 26:    FUN_4_2();      break;
                case 27:    FUN_4_3();      break;
                case 28:    FUN_4_4();      break;
                case 29:    FUN_4_5();      break;
              //case 30:                    break;
                default: NoThisFunction();  break;
            }
        }
    }

/*********************************************************************************************************
*
*                                        Actual functionality
*
*********************************************************************************************************/

    static FUN_1_1()
    {

    }

	static FUN_1_2()
	{

    }

	static FUN_1_3()
    {

    }

	static FUN_2_1()
	{

    }

	static FUN_2_2()
	{

    }

	static FUN_2_3()
	{

    }

	static FUN_2_4()
	{

    }

	static FUN_2_5()
	{

    }

	static FUN_2_6()
	{

    }

	static FUN_2_7()
	{

    }

	static FUN_2_8()
	{

    }

    static FUN_3_1()
    {

    }

    static FUN_3_2()
    {

    }

    static FUN_3_3()
    {

    }

    static FUN_3_4()
    {

    }

    static FUN_3_5()
    {

    }

    static FUN_3_6()
    {

    }

    static FUN_3_7()
    {

    }

    static FUN_3_8()
    {

    }

    static FUN_3_9()
    {

    }

    static FUN_4_1()
    {

    }

    static FUN_4_2()
    {

    }

    static FUN_4_3()
    {

    }

    static FUN_4_4()
    {

    }

    static FUN_4_5()
    {

    }

⌨️ 快捷键说明

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