查看: 535|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-24 12:03:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电路很简单,大家随便看下吧。

点击此处打开ourdev_232656.pdf(文件大小:21K)

1

2

3

4

只做了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++;
                }
         }
}







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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