alice_002 发表于 2011-10-31 13:03:28

求助,请问各位大侠,LCD用傻孩子菜单的最底层如何显示变量?

使用傻孩子的菜单模式,可以实现显示固定的字符,但是到最底层就不知道该如何显示变量了。用ASCII码的形式是可以显示变量,但是不知道如何才能融入傻孩子的菜单结构之中。
比如设置时间参数的时候,如何显示数字变量,还有设置日期和星期等等呢个。求各位大侠帮忙贴个例子。非常感谢。
以下是我使用的结构菜单,
/***********************
* 函数声明 *
***********************/
void ShowMenu(void);
void Menu_Change(void);

/**********************
* 目录结构体定义 *
**********************/
struct MenuItem
{
unsigned char MenuCount;               //当前层节点数
unsigned char *DisplayString;         //菜单标题
void (*Subs)();                                 //节点函数
struct MenuItem *ChildrenMenus; //子节点
struct MenuItem *ParentMenus;         //父节点
};

/***********************
* 调用子函数区 *
***********************/
void NullSubs(void)
{
}
//----------------------以下为例子,请根据实际情况修改---------------------------
/*
void TimeSet(void)
{
put_s("TimeSet");
}

void DateSet(void)
{
put_s("DateSet");
}

void AlertSet (void)
{
put_s("AlertSet");
}
//------------------------------------------------------------------------------
*/



/***********************
* 结构体区 *
***********************/
//----------------------以下为例子,请根据实际情况修改---------------------------
struct MenuItem code callMenu;
struct MenuItem code errorMenu;
struct MenuItem code funcMenu;
struct MenuItem code MainMenu;



struct MenuItem code callMenu=
{//MenuCount            DisplayString                        Subs                            ChildrenMenus                ParentMenus
         {4,                        "1.call records ",                         NullSubs,                        Null,                              MainMenu},
         {4,                         "2.miss calls",                        NullSubs,                        Null,                              MainMenu},
         {4,                         "3.received calls",                  NullSubs,                        Null,                              MainMenu},
   {4,                         "4.Dialled numbers",                  NullSubs,                        Null,                              MainMenu},
};         

struct MenuItem idata errorMenu=
{//MenuCount               DisplayString                         Subs                              ChildrenMenus                ParentMenus
         {3,                        "1.error records",               NullSubs,                        Null,                              MainMenu},
         {3,                         "2.extension error",         NullSubs,                        Null,                              MainMenu},
         {3,                         "3.sub error",                        NullSubs,                        Null,                              MainMenu},
};         

struct MenuItem idata funcMenu=
{//MenuCount               DisplayString                         Subs                              ChildrenMenus                ParentMenus
         {4,                        "1.time set",               NullSubs,                        Null,                              MainMenu},
         {4,                         "2.date set",                           NullSubs,                        Null,                              MainMenu},
         {4,                         "3.password set",             NullSubs,                        Null,                              MainMenu},
         {4,                           "4.name set",                     NullSubs,                        Null,                              MainMenu},

};         

struct MenuItemidata MainMenu=
{//MenuCount               DisplayString                         Subs                              ChildrenMenus                ParentMenus
         {3,                        "1.call records ",               NullSubs,                        callMenu,                        Null},
         {3,                         "2.error records",               NullSubs,                        errorMenu,                        Null},
         {3,                         "3.function set",               NullSubs,                        funcMenu,                        Null},

};
         
//------------------------------------------------------------------------------


/***********************
* 全局变量声明区 *
***********************/
struct MenuItem (*MenuPoint) = MainMenu; //结构体指针,指向结构体后由内部函数指针指向功能函数
unsigned char DisplayStart = 0; //显示时的第一个菜单项
unsigned char UserChoose = 0;          //用户所选菜单项
unsigned char DisplayPoint = 0; //显示指针
unsigned char MaxItems;                                     //同级最大菜单数
unsigned char ShowCount=2;                //同屏显示菜单数
unsigned char keyvalue;
unsigned char i;
uchar code tab[]={//共阴极0~f数码管编码
0x3f,0x06,0x5b,0x4f,   //0~3
0x66,0x6d,0x7d,0x07,    //4~7
0x7f,0x6d,0x77,0x7c,    //8~b
0x39,0x5e,0x79,0x71    //c~f
};      //共阴极

/***********************
*显示函数区 *
***********************/
void ShowMenu(void)
{
         unsigned char n;
         MaxItems = MenuPoint.MenuCount;//定义最大同级菜单
         DisplayPoint = DisplayStart;
         for(n=0;DisplayPoint<MaxItems&&n<ShowCount;n++)
               {if(DisplayPoint==UserChoose)
                        disp_string(0,n,"->");
                     disp_string(2,n,MenuPoint.DisplayString);
                  
               }

}

void Menu_Change(void)
{
                if(keyvalue)
                {
                  
         switch(keyvalue)
                   {                     
                                                   case 12:                  //UP
                                                         P0=tab;
                                                         UserChoose --;
                                                         if (UserChoose ==255)
                                                         {
                                                                   UserChoose = 0;//上翻截至,如果要回滚赋值MaxItems-1
                                                         }
                                                         break;
                                                case 11:                   //ESC
                                                         if (MenuPoint.ParentMenus != Null)
                                                         {
                                                                   MenuPoint = MenuPoint.ParentMenus;
                                                                UserChoose = 0;
                                                                DisplayStart = 0;
                                                      }
                                                      break;
                                                case 13:                   //DOWN
                                                         UserChoose ++;
                                                         if (UserChoose == MaxItems)
                                                         {
                                                         UserChoose = MaxItems-1;//下翻截至,如要回滚赋值为0
                                                         }
                                                         break;
                                                case 14:                   //ENTER
                                                         if (MenuPoint.Subs != NullSubs)
                                                         {
                                                         (*MenuPoint.Subs)();
                                                         }
                                                         else if (MenuPoint.ChildrenMenus != Null)
                                                         {
                                                         MenuPoint = MenuPoint.ChildrenMenus;
                                                         UserChoose = 0;
                                                         DisplayStart = 0;
                                                         }
                                                         break;
                                           case 21:
                                                         MenuPoint = MainMenu;
                                                      UserChoose = 0;
                                                      DisplayStart = 0;
                                                      break;
                                           default:break;
                        }
                        keyvalue=0;
                        if (UserChoose%ShowCount==0)         //一屏只能显示ShowCount行
                        DisplayStart = UserChoose;
                        else if(UserChoose==1||UserChoose== 3)
                           DisplayStart = UserChoose-1;                   //实现滚屏的关键                                 
                                    write_com(0x01);                           //液晶清屏,根据不同液晶函数自行修改
                        delayms(5);                                                   //液晶为慢速器件
                        ShowMenu();
                }
}

alice_002 发表于 2011-11-1 09:03:14

都沉下去了,自己顶一下。

jym20030037 发表于 2017-11-16 22:49:00

楼主 能发一份 傻孩子菜单的代码吗,谢谢先
页: [1]
查看完整版本: 求助,请问各位大侠,LCD用傻孩子菜单的最底层如何显示变量?