注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
莫恩的个人空间 https://home.eeworld.com.cn/space-uid-42214.html [收藏] [复制] [分享] [RSS]
日志

刚刚编写的菜单,在51上通过

已有 2170 次阅读2008-5-23 16:45

只做了3级菜单,

菜单结构:
struct menustruct                       //定义菜单结构
{
  uchar *menu_name;                     //菜单名字
  uchar menu_items;                     //菜单的项目数
  struct menustruct *child_menu;        //子菜单
  uchar (*menu_function) (viod);        //功能函数
};

typedef struct menustruct menu_struct;

如:
#define MAIN_MENU_ITEMS 6                    //主菜单条目数
menu_struct code main_menu[]=                 //主菜单结构
{
        {"menu_1",MAIN_MENU_ITEMS,menu_1,NULL},
        {"menu_2",MAIN_MENU_ITEMS,menu_2,NULL},
        {"menu_3",MAIN_MENU_ITEMS,menu_3,NULL},
        {"menu_4",MAIN_MENU_ITEMS,menu_4,NULL},
        {"menu_5",MAIN_MENU_ITEMS,menu_5,NULL},
        {"menu_6",MAIN_MENU_ITEMS,menu_6,NULL}
};

菜单保存的结构:
typedef struct                          //菜单保存结构
{
  menu_struct *menu_save_item;          //菜单保存前所显示项目
  uchar menu_save_display;              //菜单保存前显示条目
  uchar menu_save_where;                //菜单保存前显示位置
}menu_save;

menu_save menu_save_store[]=            //支持保存4级菜单
{
  {main_menu,0,0},
  {main_menu,0,0},
  {main_menu,0,0},
  {main_menu,0,0},
};

extern uchar idata menu_denpth=0;      //菜单深度值
extern uchar idata menu_updata_flag=1; //菜单更新标志

菜单显示程序:
//菜单显示程序,
void menu_display ()
{
  uint num=504;
  
  uchar *menu_dis_p;             //菜单字符显示地址指针
  uchar menu_dis_item,menu_dis_where,menu_max_item; //要显示的条目,位置,本菜单的条目数
  uchar num_temp,circle_temp,circle_temp_b;
  
  menu_struct *menu_struct_p;    //菜单显示

  if (menu_updata_flag){
  menu_struct_p=(menu_save_store+menu_denpth)->menu_save_item;  //得到要显示的当级菜单
  menu_dis_item=(menu_save_store+menu_denpth)->menu_save_display;
  menu_dis_where=(menu_save_store+menu_denpth)->menu_save_where;
  
  menu_max_item=menu_struct_p->menu_items;
  
  while (num--)    //清屏
    lcd_write (0x00);
  
  num_temp=menu_dis_item-menu_dis_where;       //计算出起始显示条目
        
  if (menu_max_item>lcd_max_display)          //确定屏幕显示条目数
    circle_temp_b=lcd_max_display;
  else
    circle_temp_b=menu_max_item;
  
  for (circle_temp=0;circle_temp<circle_temp_b;circle_temp++)  //开始整屏显示
   {
    lcd_post (0,circle_temp);                 //写好显示位置
    menu_dis_p=(menu_struct_p+num_temp)->menu_name;
    if (num_temp==menu_dis_item)              
     {
      while (*menu_dis_p)
        lcd_display_b (*menu_dis_p++);        //反显选中条目
     }
    else                                      
     {
      while (*menu_dis_p)                    
        lcd_display (*menu_dis_p++);          //正常显示菜单
     }
        num_temp++;
   }
   menu_updata_flag--;
  }
}

菜单按键处理,改变菜单深度:
void menu_key (uchar menu_key_value)
{
   uchar menu_dis_item,menu_dis_where,menu_max_item; //要显示的条目,位置,本菜单的条目数
   menu_struct *menu_struct_p;

   menu_struct_p=(menu_save_store+menu_denpth)->menu_save_item;  //得到当级菜单
   menu_dis_item=(menu_save_store+menu_denpth)->menu_save_display;
   menu_dis_where=(menu_save_store+menu_denpth)->menu_save_where;

   menu_max_item=menu_struct_p->menu_items;
   menu_max_item--;

   if (menu_key_value==up_key)                                    
     {
       if (menu_dis_item>0)
         {
           menu_dis_item--;
           if (menu_dis_where>0)
             menu_dis_where--;
                   (menu_save_store+menu_denpth)->menu_save_display=menu_dis_item;
                   (menu_save_store+menu_denpth)->menu_save_where=menu_dis_where;
                   menu_updata_flag++;
         }
     }
   else if (menu_key_value==down_key)
     {
       if (menu_dis_item<menu_max_item)
         {
           menu_dis_item++;
           if ((menu_dis_where<(lcd_max_display-1)))    //lcd_max_display=6
             menu_dis_where++;
                   (menu_save_store+menu_denpth)->menu_save_display=menu_dis_item;
                   (menu_save_store+menu_denpth)->menu_save_where=menu_dis_where;
                   menu_updata_flag++;
         }
     }
   else if (menu_key_value==esc_key)        
     {
           if (menu_denpth>0)
        {
          menu_denpth--;                     //菜单级数减一
                  menu_updata_flag++;
                }
         }
   else if (menu_key_value==enter_key)
     {
           if (((menu_struct_p+menu_dis_item)->child_menu)!=NULL)   //有子菜单
        {
                  menu_denpth++;                    //菜单级数加一
                  (menu_save_store+menu_denpth)->menu_save_item=(menu_struct_p+menu_dis_item)->child_menu;//保存此级菜单开始位置
                  (menu_save_store+menu_denpth)->menu_save_display=0;   //初始化菜单显示项目
                  (menu_save_store+menu_denpth)->menu_save_where=0;     //初始化菜单显示位置
                  menu_updata_flag++;
                }
         }
}

需要源程序的给我留言啊!
发表评论 评论 (11 个评论)
回复 funydiy 2008-7-7 10:07
你好,我现在也想写个菜单的小程序,看到你的很好,想学习下你的代码,是否可以发份我学习学习呢?!谢谢! 我的邮箱:9931rt@163.com
回复 fengyeuzou 2008-8-7 10:58
我也要一份谢谢! fengyeuzou@126.com
回复 tkgg1086 2008-12-23 13:16
我也要一份谢谢! javaka@163.com
回复 tkgg1086 2008-12-23 13:16
我也要一份谢谢! javaka@163.com
回复 leonid 2009-3-12 01:28
正要学习菜单编写呢,求赐一份代码以供学习参考 ,yuyong_007@126.com
回复 leonid 2009-3-12 01:28
正要学习菜单编写呢,求赐一份代码以供学习参考 ,yuhong_007@126.com
回复 fuxiao511 2009-3-17 21:39
貌似强大
回复 ☆墨剑☆ 2009-3-23 22:54
正在学51 有机会看他
回复 tsb00 2009-3-28 22:47
:victory: 用的是什么液晶啊?和51怎么连接的?
回复 gx780 2009-4-7 08:49
大哥发我一份... 谢了 gx780@qq.com
回复 爱丽丝123 2010-8-21 09:27
现在还能看得到吗? 我也想要一份! 多谢!328255204@qq.com

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章