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

📄 menutop.c

📁 Atmega64单片机程序(完整工程)
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
 * MenuTop.C - 顶层菜单 条项菜单核心函数 图标层函数等
 ******************************************************************************/

#include "SYS_Config.h" 
#include "GUI_Config.h" 
#include "GUI.H" 
#include "LcdDrive.h" 
#include "Menu.H" 

#define BarRemainDot  3
//数字显示位置
#define BarNumPosY    56
//Bar的显示开始/结束位置
#define BarBeginPosY  0

#define BarEndPosX    LCD_XSIZE
#define BarEndPosY    6*8

extern INT8U ItemBackup_i;
extern INT8U ItemBackup[];

void Bar(INT8U Item_,INT8U ItemNum_,INT8U BarPosX,INT8U BarNumPosX);

void DispBuildTime(void);
//编译时间
/*
*****************************************************************************
* InitMenuVal - 初始化菜单系统
* DESCRIPTION: -
* 该函数必须在进入菜单前被调用   初始化全局变量
*****************************************************************************
*/
void InitMenuVal(void)
{
    WhereBackup_i=0 ;
    ItemBackup_i=0 ;
    Layer=0 ;
    FatherIndex[Layer++]=MenuTopIndex ;
    //push index  待机界面作为起点
}
/*
*****************************************************************************
* DispMenuTop - 待机界面层5个函数
* DESCRIPTION: -
* DispMenuTop   DispMenuTopUp  DispMenuTopDown  DispMenuTopLeft DispMenuTopRight
*****************************************************************************
*/

//待机界面
void DispMenuTop(void)
{
    GUI_Clear();
    GUI_DispStringAtBar("菜单",0,1,LCD_XSIZE,GUI_TA_HCENTER);
    //显示按键对应的文字提示,0-->"功能表"
    GUI_DispStringAt(*(Tip[language].Text),1,LCD_YSIZE-14);
	//显示按键对应的文字提示,0-->"捷径"
	GUI_DispStringAt(*(Tip[language].Text+5),LCD_XSIZE-24,LCD_YSIZE-14);
}
//待机界面下Up键的处理
void DispMenuTopUp(void)
{
    //-------------------
    KeyPressCount=0 ;
    //-------------------
    GUI_Clear();
    //-------------------
    //这里是顶层菜单,因此在进入子菜单前需要初始化变量
    InitMenuVal();
    //--------------------------
    //状态跳转,进入子菜单
    //jump to Menu index
    Jump2Menu(MenuIndex,FlashMode_AutoInit);
    return ;
}
//待机界面下Down键的处理
void DispMenuTopDown(void)
{
	if((KeyPressCount++)==0x01)
	{
	    KeyPressCount=0 ;
	    GUI_Clear();
		Jump2Menu(MenuSetupIndex,FlashMode_AutoInit);
        return ;
	}
    //return to MenuTop index
    Jump2Menu(MenuTopIndex,FlashMode_NoAction);
    return ;
}
//待机界面下Left键的处理
void DispMenuTopLeft(void)
{
    KeyPressCount=0 ;
    /**  这里可以做这个按键的功能定义,因为这是在待机界面下
         比如,做某个子菜单的快捷链接--按下该按键就直接跳转到某个子菜单
    */
    //-------------------
    //这里是顶层菜单,因此在进入子菜单前需要初始化变量
    //    InitMenuVal();
    //--------------------------
    //状态跳转,进入子菜单
    Jump2Menu(MenuTopIndex,FlashMode_NoAction);
    return ;
}
//待机界面下Right键的处理
void DispMenuTopRight(void)
{
    KeyPressCount=0 ;

    //功能函数执行完毕后重新回到待机界面
    Jump2Menu(MenuTopIndex,FlashMode_NoAction);
    return ;
}


//菜单备份函数,备份当前菜单的各个参数
void PUSH(void)
{
    WhereBackup[WhereBackup_i++]=Where ;//备份Where--->高亮显示的位置
    ItemBackup[ItemBackup_i++]=Item ;   //备份Item--->当前项的位置
    FatherIndex[Layer++]=KeyFuncIndex ; //备份KeyFuncIndex--->状态机的状态
}

//菜单还原函数
void POP(void)
{
    Layer--;//先弹出一层,因为使用的是++,因此当前Layer指向下一个数组位置
    KeyFuncIndex=FatherIndex[Layer-1]; //恢复KeyFuncIndex
    Where=WhereBackup[--WhereBackup_i];//恢复高亮显示位置Where
    Item=ItemBackup[--ItemBackup_i];   //恢复项位置Item
    Flash=FlashMode_ReFlash ;          //子项返回,请求刷新
}

/*
*****************************************************************************
* BarDisp - Bar型菜单显示
* @Para s:BAR显示的文字内容
* @Para X:X轴坐标
* @Para Y:Y轴坐标
* @Para HighLight:1--->高亮显示当前项  0--->普通显示当前项
//HightLight = 1--->HightLight Disp
//HightLight = 0--->Normal Disp
*****************************************************************************
*/
//void BarDisp(INT8U _CONST_ *s,INT8U X,INT8U Y,INT8U HighLight)
void BarDisp(INT8U *s,INT8U X,INT8U Y,INT8U HighLight)
{
    Y++;//主要是在第一行不显示,美观些
    if(LessCPUUseage==TRUE)
	{ 
        if(HighLight==1)
        {
            //高亮显示
            GUI_DispStringAtBar(s,X+8,Y,LCD_XSIZE,GUI_TA_LEFT);
            GUI_SetEnFont(En_6x12);
            GUI_DispCharAt('>',X,Y);
        }
        else 
        {
            //通常显示
            //显示Bar的Text
            GUI_DispStringAtBar(s,X+8,Y,LCD_XSIZE,GUI_TA_LEFT);
            GUI_SetEnFont(En_6x12);
            GUI_DispCharAt(' ',X,Y);
        }
	}
    else 
    {
	    if(HighLight==1)
        {
            //高亮显示
            GUI_SetTextMode(GUI_TEXTMODE_REVERSE);//更改字体颜色来突出显示
       	 	GUI_DispStringAtBar(s,X,Y,LCD_XSIZE,GUI_TA_LEFT);
        	GUI_SetTextMode(GUI_TEXTMODE_NORMAL);
        	//恢复原有字体颜色和背景颜色
    	}
    	else 
    	{
         	//通常显示
        	//显示Bar的Text
			GUI_SetTextMode(GUI_TEXTMODE_NORMAL);
        	GUI_DispStringAtBar(s,X,Y,LCD_XSIZE,GUI_TA_LEFT);
    	}
	}
}


/*FIXME!!!
如何修改BarMenuInit和如何处理Item Where的初始化来达到如此一个目的?
当前系统语言设定是英语,而英语这个项在第2项位置,因此如何能做到当菜单进入语言选择时,反显位置就在英语那里?
1。修改BarMenuInit代码,处理第一次进入时的处理方式,也许就可以仅仅使用从子菜单退出时的处理方法*/
//Bar型菜单初始化  公共部分
void BarMenuInit(void)
{
    INT8U Menu_i ;//计数变量 在菜单函数中用到
    INT8U Menu_j ;//计数变量
    
    //比较"显示屏可以显示的项的数目(DispMax)"跟"需要显示的数目(ItemNum)"
    //找出小者,以小者为显示上限
    //例如显示屏可以显示3项,需要显示的项有2项,那么显示2项,有3项,显示3项,有4项的话,显示3项
    if(ItemNum>DispMax)
    {
        DispMin=DispMax ;
    }
    else 
    {
        DispMin=ItemNum ;
    }
    //--------------------
    //    if (Flash) {//从父菜单进入 初始化
    if(Flash==FlashMode_AutoInit)
    {
        //常规进入 做备份
        PUSH();
        //在修改Item Where之前备份这些参数数据!!
        Item=0 ;
        Where=0 ;
    }
    else if(Flash==FlashMode_ManualInit)
    {
        //非常规进入  在之前已经备份了,这里做边界检查
        if(Where>DispMin-1)
        {
            //检查是否出界
            //Where = DispMin-1;//A.最底部的显示位置
            Where=0 ;
            //B.最顶部的显示位置
        }
        if(Item>ItemNum-1)
        {
            //检查是否出界
            //Item = ItemNum-1;//A.最后的一个项
            Item=0 ;
            //B.最开始的一个项
        }
    }
    //既然Item Where均是未定的,那么我们使用从子菜单退出的方法来找到应该再Where=0位置显示的Item项

    //方法2
    if(Item>=Where)
    {
        //未跨越零点
        Menu_j=Item-Where ;
    }
    else 
    {
        //跨越零点
        Menu_j=ItemNum-(Where-Item);
    }
    //此时Menu_J的值就是顶部(Where=0)显示的Item值
    //显示全部的子菜单项
    for(Menu_i=0;Menu_i<DispMin;Menu_i++)
    {
        if(Menu_j==Item)
        {
            //反显第Item项,位置是Where
            BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);
        }
        else 
        {
            //其它项 正常显示
            BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,0);
        }
        if(Menu_j==(ItemNum-1))
        {
            //到了最后一项,回环到最开始的一项
            Menu_j=0 ;
        }
        else 
        {
            //下一项
            Menu_j++;
        }
    }
    Bar(Item,ItemNum,MenuBarPosX,MenuBarNumPosX);       // jjx          //维护滚动条
}


//Bar项菜单向左按键的行为
/*
可能的几种情况:
A.原有Bar的顶部,按键是向上,那么就需要刷新全部的显示
A1.若是需要显示的Bar多于单屏可以显示的Bar,那么重新显示全部
A2.若是需要显示的Bar不多于单屏可以显示的Bar,取消顶部高亮显示,高亮显示最后一项Bar
B.原有Bar不是在顶部,按键向上,那么取消原有Bar的高亮,高亮显示上一个Bar项
当然还需要维护:高亮显示的位置where/高亮显示Bar项的Item
*/

//维护Bar显示
void BarMenuLeft(void)
{
    INT8U Menu_i ; //计数变量 在菜单函数中用到
    INT8U Menu_j ;//计数变量
    INT8U ItemBack ;
	
    ItemBack=Item ;//备份原有的Item,取消原有反显时需要使用
    
    if(Item==0)    //维护Item,得到需要反显的Item
    {
        Item=ItemNum-1 ;
    }
    else 
    {
        Item--;
    }
    //维护显示
    if(Where)
    {
        //当前位置不为0,就是说不是在顶部,两次反显
        if (LessCPUUseage==TRUE)
		{ 
            GUI_SetEnFont(En_6x12);
            GUI_DispCharAt(' ',BarXOffset,(Where--)*BarYSize+BarYOffset);
            GUI_DispCharAt('>',BarXOffset,Where*BarYSize+BarYOffset);
        }
		else 
		{
                        //原来位置取消反显   项是ItemBack  位置Where
            BarDisp(*(DispItem+ItemBack),BarXOffset,(Where--)*BarYSize+BarYOffset,0);
                        //上移后的位置反显   项是Item      位置Where-1 (Where--实现)
            BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);
                        //高亮显示
		}
        
        #ifdef RockBack 
    }
    else 
    {
        //当前位置为0,     顶部  上移  需要刷新全部子菜单项显示   //1.回滚方式,到了顶部后回滚到底部
        #ifdef DynamicBar 
        if((ItemNum>DispMax)||(BarDataMode==DynamicData))
        {
            //需要显示的Bar多于单屏可以显示的Bar,那么重新显示//08/29
            #else 
            if(ItemNum>DispMax)
            {
                //需要显示的Bar多于单屏可以显示的Bar,那么重新显示
                #endif 
                #else 
            }
            else if(ItemBack!=0)
            {
                if(ItemNum>DispMax)

⌨️ 快捷键说明

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