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

📄 menufunc.c

📁 Atmega64单片机程序(完整工程)
💻 C
字号:
/*这份代码经源码格式软件格式化过
     yang_hx@neusoft.com      */
/******************************************************************************
 * MenuFunc.C - "功能"菜单 条项动态生成代码
 ******************************************************************************/
#include "SYS_Config.h" 
#include "GUI_Config.h" 
#include "GUI.H" 
#include "Menu.H" 
#include "KeyScan.H" 


//功能
//Bar型菜单
void DispMenuFuncInit()
{
    //--------------------
    GUI_Clear();
    //--------------------
    BarMenu=&MenuFunc[language];
    ItemNum=(*BarMenu).TextNum ;
    DispItem=(*BarMenu).Text ;
    
    //显示按键对应的文字提示,1-->"选择"
    GUI_DispStringAt(*(Tip[language].Text+1),1,LCD_YSIZE-14);
    //显示按键对应的文字提示,0-->"退出"
	GUI_DispStringAt(*(Tip[language].Text+4),LCD_XSIZE-24,LCD_YSIZE-14);
    
	//用户定义的初始化代码请放在这里
    BarMenuInit();
    //调用公共初始化的代码
}

void DispMenuFuncUp()
{
    
    switch(Item)
    {
        case 0 :
        {
            #ifdef DynamicBar 
                Jump2Menu(MenuDataIndex,FlashMode_AutoInit);
            #else 
                Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
            #endif 
            
            break ;
        }
        case 1 :
        {
            Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
            break ;
        }
        default :
        {
            Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
            break ;
        }
    }
    
}
void DispMenuFuncDown()
{
    POP();
}

void DispMenuFuncLeft()
{
    BarMenuLeft();
}
void DispMenuFuncRight()
{
    BarMenuRight();
}

#ifdef DynamicBar 

//------------------------------------------------
#define DataItemSize 8 
INT8U DataItem[DispMax][DataItemSize]=
{
    {"DataX"},
    {"DataX"},
    {"DataX"},
};


INT8U*_CONST_ DataItem_p[]=
{
    DataItem[0],
    DataItem[1],
    DataItem[2]
};


INT8U DynamicItem ;
INT8U MaxDynamicItem=0 ;

/*
实现动态数据显示的最简单的方式设定一定大小的缓冲,而后填充数据,但这样把可以显示的项限制了。这个方法对于维护来说是最为简单的
2006/08/27
如何利用有限缓冲来实现动态数据的条项层显示?
比如仅仅缓冲液晶可以显示的条项数目,然后发现上/下越界了,就刷新缓冲?
但这样就要重新另外写类似BarMenuLeft等函数来维护显示
*/
/*
这里使用一个仅仅跟LCD显示条项数目一致的缓冲区来缓冲动态生成的条项
当实际条项数目MaxDynamicItem<=DispMax时 函数BarMenuLeft BarMenuRight工作正常
而当MaxDynamicItem>DispMax时,我们设ItemNum = DispMax,在原本的代码中,这意味着LCD刚刚能显示所有的项
于是一旦到了顶部上翻时就反显底部,到了底部下翻时就反显顶部 但是事实上的项的数目不是ItemNum!而是MaxDynamicItem
我们期望的行为是顶部上翻时,修改底部的项为新的项的数据,屏幕整个刷新(底部下翻类似)
做法是设ItemNum = DispMax 并让上下翻的行为跟 ItemNum > DispMax时的行为一致,跟踪位置动态修改显示内容
*/
void DispMenuDataInit(void)
{
    INT8U Menu_j ;
    //计数变量
    INT8U*ChangeDispItem ;
    //项显示内容指针
    //----------------------
    GUI_Clear();
    //--------------------
    GUI_Delay(100);
    //    do{
    //        MaxDynamicItem = InputNum(4,4,9);//要求输入一个动态菜单的值,我们根据这个值生成菜单
    MaxDynamicItem=8 ;
    //        if(MaxDynamicItem == 0xFF){//退出
    //            Jump2Menu(SelfMenuIndex,FlashMode_AutoInit);
    // //           ReFlash = true;
    //            return;
    //        }
    //    }while(MaxDynamicItem ==0x00);//大于0才有效
    
    //    GUI_Clear();
    DynamicItem=0 ;
    
    if(MaxDynamicItem>DispMax)
    {
        //需要显示的项数比液晶可以显示的多
        ItemNum=DispMax ;
        //08/29
        BarDataMode=DynamicData ;
        //通知BarMenuLeft和BarMenuRight函数现在的数据是动态数据
        //当ItemNum == DispMax时,默认的显示方式是到头了直接跳到尾部的(到尾部了直接跳到头部的)
        //但是既然这是动态内容的话,而且实际上的项是MaxDynamicItem不少于DispMax,应当翻滚显示的,通过修正BarDataMode这个标志
        //通知BarMenuLeft和BarMenuRight
    }
    else 
    {
        ItemNum=MaxDynamicItem ;
    }
    
    
    for(Menu_j=0;Menu_j<ItemNum;Menu_j++)
    {
        //初始化动态内容
        ChangeDispItem=(INT8U*)&DataItem[Menu_j];
        *(ChangeDispItem+4)=Menu_j+'0' ;
        //        *(DataItem_p[Menu_j]+4)       = Menu_j+'0';
    }
    
    
    DispItem=(INT8U**)DataItem_p ;
    
    //显示按键对应的文字提示,2-->"OK"
    GUI_DispStringAtBar(*(Tip[language].Text+1),0,Enter_PosY,LCD_XSIZE,GUI_TA_HCENTER);
    BarMenuInit();
    Bar(DynamicItem,MaxDynamicItem,MenuBarPosX,MenuBarNumPosX);
    //维护滚动条
}

void DispMenuDataUp()
{
    //没有动作,停留在本层菜单
    Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
}
void DispMenuDataDown()
{
    //08/29
    BarDataMode=FixedData ;
    POP();
}

void DispMenuDataLeft()
{
    INT8U*ChangeDispItem ;
    //项显示内容指针
    INT8U ItemBackup ;
    if(DynamicItem==0)
    {
        //
        DynamicItem=MaxDynamicItem-1 ;
    }
    else 
    {
        DynamicItem--;
    }
    
    if(Where==0)
    {
        //顶部上移,需要修改数据
        if(Item==0)
        {
            //获得Item
            ItemBackup=ItemNum-1 ;
        }
        else 
        {
            ItemBackup=Item-1 ;
        }
        ChangeDispItem=(INT8U*)&DataItem[ItemBackup];
        *(ChangeDispItem+4)=DynamicItem+'0' ;
    }
    BarMenuLeft();
	
    Bar(DynamicItem,MaxDynamicItem,MenuBarPosX,MenuBarNumPosX);
    //维护滚动条
}
void DispMenuDataRight()
{
    INT8U *ChangeDispItem ;
    //项显示内容指针
    INT8U ItemBackup ;
    if(DynamicItem==MaxDynamicItem-1)
    {
        //维护实际的Item值
        DynamicItem=0 ;
    }
    else 
    {
        DynamicItem++;
    }
    
    if(Where==(DispMin-1))
    {
        //底部下移,需要修改数据
        if(Item==(ItemNum-1))
        {
            //获得Item
            ItemBackup=0 ;
        }
        else 
        {
            ItemBackup=Item+1 ;
        }
        ChangeDispItem=(INT8U*)&DataItem[ItemBackup];
        //获得修改位置
        *(ChangeDispItem+4)=DynamicItem+'0' ;
    }
    BarMenuRight();
    Bar(DynamicItem,MaxDynamicItem,MenuBarPosX,MenuBarNumPosX);
    //维护滚动条
}
#endif 

⌨️ 快捷键说明

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