当前位置:文档之家› 单片机菜单结构编程

单片机菜单结构编程

菜单结构:
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{
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_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++;
}
}
}

相关主题
文本预览
相关文档 最新文档