搜索
bottom↓
回复: 0

求助,请问各位大侠,用LCD12864做菜单如何显示变量?

[复制链接]

出0入0汤圆

发表于 2011-10-30 23:11:22 | 显示全部楼层 |阅读模式
使用傻孩子的菜单模式,可以实现显示固定的字符,但是到最底层就不知道该如何显示变量了。用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 idata callMenu[4];
struct MenuItem idata errorMenu[3];
struct MenuItem idata funcMenu[4];
struct MenuItem idata MainMenu[3];



struct MenuItem idata callMenu[4]=
{  //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[3]=
{  //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[4]=
{  //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 MenuItem  idata MainMenu[3]=
{  //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[0].MenuCount;//定义最大同级菜单
         DisplayPoint = DisplayStart;
         for(n=0;DisplayPoint<MaxItems&&n<ShowCount;n++)
                 {if(DisplayPoint==UserChoose)
                          disp_string(0,n,"->");
                     disp_string(2,n,MenuPoint[DisplayPoint++].DisplayString);
                 
                 }

}

void Menu_Change(void)
{
                if(keyvalue)
                {
                  
           switch(keyvalue)
                   {                    
                                                   case 12:                  //UP
                                                         P0=tab[i++];
                                                         UserChoose --;
                                                         if (UserChoose ==255)
                                                         {
                                                                   UserChoose = 0;//上翻截至,如果要回滚赋值MaxItems-1
                                                         }
                                                         break;
                                                case 11:                   //ESC
                                                         if (MenuPoint[UserChoose].ParentMenus != Null)
                                                         {
                                                                   MenuPoint = MenuPoint[UserChoose].ParentMenus;
                                                                UserChoose = 0;
                                                                DisplayStart = 0;
                                                        }
                                                        break;
                                                case 13:                   //DOWN
                                                         UserChoose ++;
                                                         if (UserChoose == MaxItems)
                                                         {
                                                           UserChoose = MaxItems-1;//下翻截至,如要回滚赋值为0
                                                         }
                                                         break;
                                                case 14:                   //ENTER
                                                         if (MenuPoint[UserChoose].Subs != NullSubs)
                                                         {
                                                           (*MenuPoint[UserChoose].Subs)();
                                                         }
                                                         else if (MenuPoint[UserChoose].ChildrenMenus != Null)
                                                         {
                                                           MenuPoint = MenuPoint[UserChoose].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();
                }
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 11:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表