|
使用傻孩子的菜单模式,可以实现显示固定的字符,但是到最底层就不知道该如何显示变量了。用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[4];
struct MenuItem code errorMenu[3];
struct MenuItem code funcMenu[4];
struct MenuItem code MainMenu[3];
struct MenuItem code 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();
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|