打印

菜单

[复制链接]
1526|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shanweichao|  楼主 | 2010-8-22 17:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 shanweichao 于 2010-8-23 16:29 编辑

/*==================================
**   结构体定义   **
**        **
===================================*/
struct Menu
{
char *name;    //节点名字
int MenuCount;    //当前层节点数
struct Menu *Children; //下一级
struct Menu *ParentMenu;//上一级
void (*str)();   //节点函数
};
struct Menu MainMenu[];
volatile struct Menu *MainPointer=MainMenu;  //初始化就指向主菜单

struct Menu First_Menu[];
struct Menu First_1_Menu[];
struct Menu First_2_Menu[];
struct Menu First_3_Menu[];
struct Menu First_4_Menu[];
struct Menu Second_Menu[];   
struct Menu Second_1_Menu[];
struct Menu Second_2_Menu[];
struct Menu Second_3_Menu[];
struct Menu Second_4_Menu[];
//下面这段可以忽略,还没有用到,只是构建好
struct Menu Third_Menu[];
/*
这部分为Third_Menu[]的子菜单空间就删掉了,
*/
struct Menu Fourth_Menu[];
/*
这部分为Fourth_Menu[]的子菜单节约时间就删掉了,

*/
struct Menu Fifth_Menu[];
/*
同上
*/
struct Menu Sixth_Menu[];
/*
同上

*/
struct Menu Seventh_Menu[];
/*
同上
*/
struct Menu Eighth_Menu[];
/*
同上
*/

/*====================================
**   主菜单      **
**         **
=====================================*/
struct Menu MainMenu[]={
  /*1*/   {"温度显示标注",    3, First_Menu, NULL, Systemp_Temperature},  //右移进入First_Menu(进入下一级) 确定进入Systemp_Temperature (需要执行的函数)
  /*2*/   {"确定进入图片显示",3, Second_Menu, NULL, Alert_Show},
  /*3*/   {"标定值查询",     3, Third_Menu, NULL, EE_MaxMinShow},
  /*4*/   {"ADC_平均值",     3, Fourth_Menu, NULL, ADC_Average},
  /*5*/   {"报警设置",     8, Fifth_Menu, NULL, Alert_Set},  
  /*6*/   {"----设置",     8, Sixth_Menu, NULL, Null},
  /*7*/   {"----设置",     8, Seventh_Menu, NULL, Null},
      {"----设置",     8, Eighth_Menu, NULL, Null},
      };
/*==================================
**  【温度标注】的子菜单   **
**  【温度标注】往下一级   **
===================================*/
struct Menu First_Menu[]={
      {"0_Checkout_Ent", 3, First_1_Menu, MainMenu,      Temperature_0_Checkout},
      {"100_Checkou_Ent",3, First_2_Menu, MainMenu, Temperature_100_Checkout},
      {"Coefficient_Ent",3, First_3_Menu, MainMenu, EE_MaxMinShow},
      {"Flash_Min",    3, First_4_Menu, MainMenu, Null},
      };
struct Menu First_1_Menu[]={
      {"First_11_Menu", 3, NULL, First_Menu, NULL},
      {"First_12_Menu", 3, NULL, First_Menu, NULL},
      {"First_13_Menu", 3, NULL, First_Menu, NULL},
};
struct Menu First_2_Menu[]={ "First_2_Menu", 3,NULL, First_Menu, NULL,      
};
struct Menu First_3_Menu[]={ "First_3_Menu", 3,NULL, First_Menu, NULL,
};
struct Menu First_4_Menu[]={ "First_4_Menu", 3,NULL, First_Menu, NULL,      
};
      
/*====================================
**  【报警值查询】的子菜单      **
**  【报警值查询】往下一级    **
======================================*/   
struct Menu Second_Menu[]={
      {"==Welcome==", 3, Second_1_Menu, MainMenu, NULL},
      {"==暂未使用==",3, Second_2_Menu, MainMenu, NULL},
      {"请【退出】", 3, Second_3_Menu, MainMenu, NULL},
      {"",   3, Second_4_Menu, MainMenu, Null},
      };
      
struct Menu Second_1_Menu[]={
       "Second_11_Menu", 3, NULL, Second_Menu, NULL,
       "Second_12_Menu", 3, NULL, Second_Menu, NULL,
       "Second_13_Menu", 3, NULL, Second_Menu, NULL,
};
struct Menu Second_2_Menu[]={ "Second_2_Menu", 3, NULL, Second_Menu, NULL,
};
struct Menu Second_3_Menu[]={ "Second_3_Menu", 3, NULL, Second_Menu, NULL,            
};
struct Menu Second_4_Menu[]={ "Second_4_Menu", 3, NULL, Second_Menu, NULL,      
};
/*==================================
**  【标定值查询】的子菜单   **
**  【表的政查询】往下一级   **
===================================*/
struct Menu Third_Menu[]={ "标定值查询子菜单", 4, NULL, MainMenu, ADC_Average,
};
/*====================================
**   被菜单调用子函数  **
======================================*/
void NullSub(void)   //空 Hollow
{
LCD_String(1,1,"请键入【右移】");
Delay_ms(500);
}
/** 0 度标定 **/
void Temperature_100_Checkout(void)
{              
Write_CheckoutValue(EE_Max,VOLTAGE1);  //把  100℃  的值写入flash //ADC_Sum[0]是读回的AD电压值
LCD_String(1,1,"100 ℃ Chec_OK");
Delay_ms(500);
}
/** 100 度标定 **/
void Temperature_0_Checkout(void)
{   
Write_CheckoutValue(EE_Min,VOLTAGE1);  //把  0℃  的值写入flash
LCD_String(1,1,"0 ℃ Check_OK");
Delay_ms(500);
}
/** PT100标定大小值显示 **/
void EE_MaxMinShow()
{
LCD_String(1,1,"0 ℃_= ");
Display_value(1, 4, 4, EE_MinVar);
LCD_String(2,1,"100 ℃_= ");
Display_value(2, 5, 4, EE_MaxVar);
LCD_String(3,1,"温度系数:");
EE_Checkouttemp=EE_CheckoutVar*100;
Display_value(3,6,3,EE_Checkouttemp);
Delay_s(2);
}
/**芯片内部温度**/
void Systemp_Temperature()
{
LCD_String(1,1,"芯片温度");
Interior_Temperature=ADC_VOL[3]*3300/4096;
Display_value(2, 1, 2,(1430-Interior_Temperature)/4.3+25);
LCD_String(2,3,"℃");
Delay_s(3);
}
/** 报警显示 **/
void Alert_Show ()
{

}
/** 报警设置 **/
void Alert_Set ()
{
LCD_String(1,1,"暂时为空函数_Ent");
}
/**ADC_平均值**/
void ADC_Average()
{
if(VOLTAGE1)
  { j++;
       ADC_Sum[j]=ADC_VOL[1]*3300/4096;
    if(j>=8)j=0;
      }
   AD_ValueMin=Min(&ADC_Sum[0],7);
   AD_ValueMax=Max(&ADC_Sum[0],7);
//   ADC_Sum[0]=((ADC_Sum[1]+ADC_Sum[2]+ADC_Sum[3]+ADC_Sum[4]+ADC_Sum[5]+ADC_Sum[6]+ADC_Sum[7]-AD_ValueMin-AD_ValueMax)/5);   
   LCD_String(1,5,"MAX_VAL");
   LCD_String(2,5,"MIN_VAL");
   LCD_String(3,1,"MAX-MIN=");
   Display_value(1,1,4,AD_ValueMax);
   Display_value(2,1,4,AD_ValueMin);
   Display_value(3,5,4,AD_ValueMax-AD_ValueMin);
}
/*====================================
**   菜单显示控制函数  **
**         **
======================================*/
void Show_Menu()
{
  unsigned char n=0;
MaxMenuNumber=MainPointer[UserChoose].MenuCount;   //获取菜单最大项数值
DisplayPointer=DisplayStart;
   for(n=0;DisplayPointer<MaxMenuNumber&&n<ScreenMaxRow;n++) //在这里&&的优先级最低
     {
   if((DisplayPointer+1)==UserChoose)        //在用户选择的地方绘制一个光标
       ConvertChar(UserChoose,1,16);
  // LCD_String(UserChoose,8,"->");      
    LCD_String(n+1,1,MainPointer[DisplayPointer++].name); //由于有MaxRow的限制所以现在只会显示4 ROW
     }
}
/*====================================
**   按键控制函数   **
**         **
======================================*/
void Key_Scan(vu16 Read_Input)
{
vu16 Read_Value=0,sub_menu=0;
   
  switch(Read_Input)
  {  
  case (UP):/*上键*/
     Obj_Clear(1,UserChoose);
     Renovate_Screen();
     UserChoose++;
      if (UserChoose == 5)
       {UserChoose = 0;
              }
              
       break;
                          
  case (DOWN): /*下键*/
       Renovate_Screen();
      UserChoose--;  
      Obj_Clear(0,UserChoose);
      
       if(UserChoose == 0)
        {UserChoose = 5;   
        }
        break;
      
  case (Enter) :  /*确定*/
       Renovate_Screen();
       if(MainPointer[UserChoose-1].str != NullSub)
          {
         (*MainPointer[UserChoose-1].str)();
          }
       else
        {
          LCD_String(1,1,"NULL_function");
            Delay_ms(400);  
        }
          Renovate_Screen();
             break;
  
  case(ESC):/*退出*/
            if(MainPointer[UserChoose-1].ParentMenu != Null)   //如果用户所选菜单项所在页面的父节点不为0
       {
        Renovate_Screen();
        LCD_String(4,6,"退出");
        Delay_ms(400);  
        MainPointer = MainPointer[UserChoose-1].ParentMenu; //就将该父节点值赋给 结构体指针(MenuPoint)

      }
      else{
         LCD_String(1,1,"【返回无效】");
        Delay_ms(400);
           Renovate_Screen();
        }
        break;  
  
  case (RIGHT):/*右键*///OK
    {
      if (MainPointer[UserChoose-1].Children != Null)  //如果用户所选菜单项的下一级不为空
       {
         Renovate_Screen();
         MainPointer=MainMenu[UserChoose-1].Children;     //--就-->执行下一级菜单显示
       }
           else{
        LCD_String(1,1,"【下一级为空】");
        Delay_ms(400);
        Renovate_Screen();
                };  
        Renovate_Screen();
       break;  
      }
  default :break;                        
  }
Show_Menu();



现在出现的问题是指针(MainPointer)可以指向主菜单的下一级【First_Menu[]】但是指针不能到达【First_Menu[]】的下一级->【First_1_Menu[]】,也就是现在只能操作到主菜单的下一级,不能再往下到达二级,三级。。。
思考了好久也找不到问题,希望师傅指点,谢谢。

相关帖子

沙发
shanweichao|  楼主 | 2010-8-23 16:28 | 只看该作者
希望此贴能被尽快发现,,,,,,,啊 啊啊  啊啊啊 啊啊啊啊啊啊啊啊啊啊

使用特权

评论回复
板凳
shanweichao|  楼主 | 2010-8-27 08:21 | 只看该作者
问题找到--------MainPointer=MainMenu[UserChoose-1].Children

使用特权

评论回复
地板
shanweichao|  楼主 | 2010-8-27 08:22 | 只看该作者
这句话有问题。。。还是得靠自己

使用特权

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

本版积分规则

5

主题

71

帖子

1

粉丝