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

📄 menutop.c

📁 CPU.H CPU相关定义 Main.C 主函数 Ks0108.C LCD驱动 ASCII.c 8x8 8x16 英文字模 KeyScan.C 键盘扫描 MenuPara.C 菜单
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
 * MenuTop.C - 顶层菜单 条项菜单核心函数 图标层函数等
 *
 *
 * DESCRIPTION: -
 *
 * modification history
 * --------------------
 * 01a, 04/sep/2007, 梁炎昌 written
 * --------------------
 ******************************************************************************/

#include "CPU.H"
#include "Ks0108.H"
#include "Menu.H"


//void Bar(U8 Item_,U8 ItemNum_);
void DispBuildTime(void);//编译时间

/*
*****************************************************************************
* InitMenuVal - 初始化菜单系统
* DESCRIPTION: -
* 该函数必须在进入菜单前被调用   初始化全局变量
* @Para void:
* Return :
*
*****************************************************************************
*/
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("Desktop",0,0,126,GUI_TA_HCENTER);
    //显示按键对应的文字提示,0-->"菜单"
    GUI_DispStringAtBar(*(Tip[language].Text),0,Enter_PosY,126,GUI_TA_HCENTER);
}
//待机界面下Up键的处理
void DispMenuTopUp(void)
{
//-------------------
    KeyPressCount = 0;
//-------------------
    GUI_Clear();
//-------------------
//这里是顶层菜单,因此在进入子菜单前需要初始化变量
    InitMenuVal();
//--------------------------
//状态跳转,进入子菜单
    //jump to Menu index
    Jump2Menu(MenuIndex,FlashMode_AutoInit);
    return;
}
//待机界面下Down键的处理
void DispMenuTopDown(void)
{

    if((KeyPressCount++)==0x0F){
        GUI_Clear();
        DispBuildTime();
        GUI_Delay(6500);
        KeyPressCount = 0;
        // we need reflash screen
        Jump2Menu(MenuTopIndex,FlashMode_ReFlash);
        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;
//----------------------
//    ClearLCD();
//    DispRate(0);  //功能函数的"快捷方式"  到测量显示
//功能函数执行完毕后重新回到待机界面
//    Jump2Menu(MenuTopIndex);
    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型菜单显示
* DESCRIPTION: -
*
* @Para s:BAR显示的文字内容
* @Para X:X轴坐标
* @Para Y:Y轴坐标
* @Para HighLight:1--->高亮显示当前项  0--->普通显示当前项
//HightLight = 1--->HightLight Disp
//HightLight = 0--->Normal Disp
* Return :
*
*****************************************************************************
*/
//void BarDisp(U8 _CONST_ *s,U8 X,U8 Y,U8 HighLight)
void BarDisp(U8 *s,U8 X,U8 Y,U8 HighLight)
{

#ifdef LessCPUUseage
    if (HighLight == 1) { //高亮显示
        GUI_DispStringAtBar(s,X+8,Y,120,GUI_TA_LEFT);
        GUI_SetEnFont(En_8x16);
        GUI_DispCharAt('>',X,Y);
    } else {  //通常显示
        //显示Bar的Text
        GUI_DispStringAtBar(s,X+8,Y,120,GUI_TA_LEFT);
        GUI_SetEnFont(En_8x16);
        GUI_DispCharAt(' ',X,Y);
    }
#else
    if (HighLight == 1) { //高亮显示
//------------------------------------
        GUI_SetTextMode(GUI_TEXTMODE_REVERSE);//更改字体颜色来突出显示
        GUI_DispStringAtBar(s,X,Y,120,GUI_TA_LEFT);
        GUI_SetTextMode(GUI_TEXTMODE_NORMAL);        //恢复原有字体颜色和背景颜色
//------------------------------------
    } else {  //通常显示
        //显示Bar的Text
        GUI_DispStringAtBar(s,X,Y,120,GUI_TA_LEFT);
    }
#endif
}
/*
FIXME!!!
如何修改BarMenuInit和如何处理Item Where的初始化来达到如此一个目的?
当前系统语言设定是英语,而英语这个项在第2项位置,因此如何能做到当菜单进入语言选择时,反显位置就在英语那里?
1。修改BarMenuInit代码,处理第一次进入时的处理方式,也许就可以仅仅使用从子菜单退出时的处理方法
*/
//Bar型菜单初始化  公共部分
void BarMenuInit(void)
{
U8 Menu_i;          //计数变量 在菜单函数中用到
U8 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);                  //维护滚动条
}


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

//维护Bar显示
void BarMenuLeft(void)
{
    U8 Menu_i;          //计数变量 在菜单函数中用到
    U8 Menu_j;          //计数变量
    U8 ItemBack;
    ItemBack = Item;//备份原有的Item,取消原有反显时需要使用
    //维护Item,得到需要反显的Item
    if (Item == 0) {
        Item = ItemNum-1;
    } else {
        Item--;
    }
    //维护显示
    if (Where) {//当前位置不为0,就是说不是在顶部,两次反显

#ifdef LessCPUUseage
        GUI_SetEnFont(En_8x16);

⌨️ 快捷键说明

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