本帖最后由 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[]】,也就是现在只能操作到主菜单的下一级,不能再往下到达二级,三级。。。
思考了好久也找不到问题,希望师傅指点,谢谢。 |