打印
[AVR单片机]

一个简单却实用的菜单程序

[复制链接]
5437|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laslison|  楼主 | 2009-11-30 22:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果编写简单的程序的话这个菜单函数就可以不用看了,但是当你编写到复杂的程序的时候就可能就会为人机界面和各个函数直接的连接而烦恼了,这个菜单函数就是用来解决这个问题,虽然没有UCGUI厉害,但是我觉得代码在2000行一下的话用起来还是不错的选择的.虽说简单但是用到了结构体大部分的知识了,希望c语言不太好的朋友自己补习一下好了.

主要程序:
CODE:

#define Null 0


/***********************
* 函数声明 *
***********************/
void ShowMenu(void);
void Menu_Change(unsigned char KeyNum);

/***********************
* 按键功能键宏定义 *
***********************/
#define UP     '3'
#define Down '7'
#define Esc   'B'
#define Enter 'F'
#define Reset '0'


/**********************
* 目录结构体定义 *
**********************/
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");
}
//------------------------------------------------------------------------------

相关帖子

沙发
laslison|  楼主 | 2009-11-30 22:56 | 只看该作者
CODE:

/***********************
* 结构体区 *
***********************/
//----------------------以下为例子,请根据实际情况修改---------------------------
struct MenuItem TimeMenu[4];
struct MenuItem FlashMenu[5];
struct MenuItem VoiceMenu[5];
struct MenuItem RobotMenu[5];
struct MenuItem MainMenu[5];

struct MenuItem TimeMenu[4]=
{ //MenuCount   DisplayString   Subs   ChildrenMenus ParentMenus
{4,   "1.Time Set",   TimeSet,   Null,   MainMenu},
{4,   "2.Date Set",   DateSet,   Null,   MainMenu},
{4,   "3.AlertSet",   AlertSet,   Null,   MainMenu},
{4,     "4.Back",     NullSubs,   MainMenu,   MainMenu},
};

struct MenuItem FlashMenu[5]=
{ //MenuCount   DisplayString   Subs   ChildrenMenus ParentMenus
{5,   "1.Flash Record",   NullSubs,   Null,   MainMenu},
{5,   "2.Play",     NullSubs,   Null,   MainMenu},
{5,   "3.Pause",     NullSubs,   Null,   MainMenu},
{5,     "4.Flash Delete",   NullSubs,   Null,   MainMenu},
{5,   "5.Back",   NullSubs,   MainMenu,   MainMenu},
};

struct MenuItem VoiceMenu[5]=
{ //MenuCount   DisplayString   Subs   ChildrenMenus ParentMenus
{5,   "1.Voice Record" , NullSubs,   Null,   MainMenu},
{5,   "2.Play",     NullSubs,   Null,   MainMenu},
{5,   "3.Pause",       NullSubs,   Null,   MainMenu},
{5,     "4.Voice Delete",   NullSubs,   Null,   MainMenu},
  {5,   "5.Back",   NullSubs,   MainMenu,   MainMenu},
};

struct MenuItem RobotMenu[5]=
{ //MenuCount   DisplayString   Subs   ChildrenMenus ParentMenus
{5,   "1.Turn Left",   NullSubs,   Null,   MainMenu},
{5,   "2.Turn Right",   NullSubs,   Null,   MainMenu},
{5,   "3.Go Ahead",   NullSubs,   Null,   MainMenu},
{5,     "4.Go Back",   NullSubs,   Null,   MainMenu},
{5,   "5.Back",   NullSubs,   MainMenu,   MainMenu},
};


struct MenuItem MainMenu[5]=
{ //MenuCount   DisplayString   Subs   ChildrenMenus ParentMenus
{5,   "1.Time Set" ,   NullSubs,   TimeMenu,   Null},
{5,   "2.Voice Center",   NullSubs,   VoiceMenu,   Null},
{5,   "3.Robot Control",   NullSubs,   RobotMenu,   Null},
{5,     "4.Flash Option",   NullSubs,   FlashMenu,   Null},
  {5,   "5.Back",   NullSubs,   MainMenu,   MainMenu},
};
//------------------------------------------------------------------------------

使用特权

评论回复
板凳
laslison|  楼主 | 2009-11-30 22:57 | 只看该作者
CODE:


/***********************
* 全局变量声明区 *
***********************/
struct MenuItem (*MenuPoint) = MainMenu; //结构体指针,指向结构体后由内部函数指针指向功能函数
unsigned char DisplayStart = 0; //显示时的第一个菜单项
unsigned char UserChoose = 0;   //用户所选菜单项
unsigned char DisplayPoint = 0; //显示指针
unsigned MaxItems;       //同级最大菜单数
unsigned char ShowCount=2; //同屏显示菜单数


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

}

void Menu_Change(unsigned char KeyNum)
{
if(KeyNum)
{
  switch(KeyNum)
  {     
      case UP:
    UserChoose --;
    if (UserChoose ==255)
    {
      UserChoose = 0;//上翻截至,如果要回滚赋值MaxItems-1
    }
    break;
    case Esc:
    if (MenuPoint[UserChoose].ParentMenus != Null)
    {
      MenuPoint = MenuPoint[UserChoose].ParentMenus;
    UserChoose = 0;
    DisplayStart = 0;
    }
    break;
    case Down:
    UserChoose ++;
    if (UserChoose == MaxItems)
    {
      UserChoose = MaxItems-1;//下翻截至,如要回滚赋值为0
    }
    break;
    case 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 Reset:
      MenuPoint = MainMenu;
    UserChoose = 0;
    DisplayStart = 0;
    break;
    default:break;
  }
  if (UserChoose%ShowCount==0)       //一屏只能显示ShowCount行
  DisplayStart = UserChoose;
  else if(UserChoose==1||UserChoose== 3)
    DisplayStart = UserChoose-1;   //实现滚屏的关键   
  LCD_write_command(0x01);     //液晶清屏,根据不同液晶函数自行修改
  delay_nms(5);       //液晶为慢速器件
  ShowMenu();
}
}

使用特权

评论回复
地板
huamunv| | 2009-12-1 13:23 | 只看该作者
:),收下了!

使用特权

评论回复
5
fasionlei| | 2009-12-1 13:57 | 只看该作者
不错

使用特权

评论回复
6
太阳很能| | 2010-4-5 21:47 | 只看该作者
谢谢

使用特权

评论回复
7
xiaoxin1986| | 2010-4-5 21:54 | 只看该作者
谢谢LZ分享

使用特权

评论回复
8
odqqdo| | 2010-5-31 21:25 | 只看该作者
谢谢
有空了看看

使用特权

评论回复
9
ytfdhb| | 2010-6-7 19:16 | 只看该作者
学习中……

使用特权

评论回复
10
wuzhaolie| | 2010-6-7 22:25 | 只看该作者
不错的东西,收下了

使用特权

评论回复
11
wangwo| | 2010-6-7 22:28 | 只看该作者
程序挺规范的:)

使用特权

评论回复
12
lpydidi| | 2010-6-7 22:50 | 只看该作者
看着好复杂啊

使用特权

评论回复
13
mochou| | 2010-6-7 23:21 | 只看该作者
公司一哥们也是这样编程的,俺看得稀里糊涂的。哎,苦练内功才行啊。

使用特权

评论回复
14
btyang| | 2010-7-14 08:37 | 只看该作者
LZ太好了,感谢

使用特权

评论回复
15
wangwo| | 2010-7-14 16:53 | 只看该作者
菜单函数什么?

使用特权

评论回复
16
guita| | 2010-7-14 17:13 | 只看该作者
太复杂了,没机会用

使用特权

评论回复
17
weibestww| | 2011-4-10 23:06 | 只看该作者
先研究研究!

使用特权

评论回复
18
电子三极管| | 2011-4-14 20:39 | 只看该作者
垃圾中的战斗机

使用特权

评论回复
19
nanyue101| | 2011-4-19 13:36 | 只看该作者
不错哦 采用了

使用特权

评论回复
20
yyql008| | 2011-4-20 16:11 | 只看该作者
MARK一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

791

帖子

1

粉丝