中级会员
 
- 积分
- 369
- 金钱
- 369
- 注册时间
- 2015-1-27
- 在线时间
- 43 小时
|
发表于 2016-6-4 10:54:43
|
显示全部楼层
给楼主一个思路吧!用结构体,我看到群里面的好多人采用上下键,对应着数字,对应着某一个函数,这个方案好理解,但是一旦需要中间再加一个菜单,整体的结构等于再写一遍,比较复杂。我提供的方案就是任意添加函数功能,菜单深度可以通过宏定义改,手头项目多,不能整理。楼主仅供参考。
#ifndef _MENU_H
#define _MENU_H
#include "stm32f10x.h"
//=================================================
#ifndef NULL
#define NULL ((void*)0)
#endif
//逻辑状态
#ifndef FALSE
#define FALSE (0)
#endif
#ifndef TRUE
#define TRUE (0)
#endif
//==================================================
typedef struct MENU_ITEM_tag
{
unsigned char menu_count ; //当前菜单数目
unsigned char menu_enable; //当前菜单使能
char *display_string; //菜单标题
void (*subs)(); //菜单函数
struct MENU_ITEM_tag* children_menus; //子菜单
}MENU_ITEM_t;
//===================================================
//菜单结构体定义
MENU_ITEM_t *pmenu_point;
//====================================================
struct
{
MENU_ITEM_t *pparent_menu[4]; //指向父菜单的指针,最高为四级菜单
unsigned char parent_count;//菜单层次,第二项为零,则该项菜单灰掉
unsigned char menu_select[4];//上层次选择的菜单,进入下一级菜单前,记录本级菜单的显示位置
unsigned char menu_display_start[4];//上层选择的菜单
}parent_manage;
//===========================================================================
//函数声明
void dtmb_freq_set(void);
void dtmb_vol_set(void);
void cable_freq_set(void);
void cable_symbol_set(void);
void cable_vol_set(void);
void fm1_freq_set(void);
void fm1_vol_set(void);
void fm2_freq_set(void);
void fm2_vol_set(void);
void area_set(void);
void device_num_set(void);
void dtmb_freq_read(void);
void dtmb_vol_read(void);
void cable_freq_read(void);
void cable_symbol_read(void);
void cable_vol_read(void);
void fm1_freq_read(void);
void fm1_vol_read(void);
void fm2_freq_read(void);
void fm2_vol_read(void);
void area_read(void);
void device_num_read(void);
void status_check(void);
void version_check(void);
//===========================================================================
//函数声明
//===========================================================================
MENU_ITEM_t dtmb_para[3] =
{// menu_count DisplayString subs childrenmenu
{3,1, "2-1-1 频率设置", dtmb_freq_set, NULL},
{3,1, "2-1-2 音量设置", dtmb_vol_set, NULL},
{3,1, "<<返回", NULL, NULL}
};
//============================================================================
//cable 参数设置菜单
MENU_ITEM_t cable_para[4]=
{// menu_count DisplayString subs childrenmenu
{4,1, "2-2-1 频率设置", cable_freq_set, NULL},
{4,1, "2-2-2 符号设置", cable_symbol_set, NULL},
{4,1, "2-2-3 音量设置", cable_vol_set, NULL},
{4,1, "<<返回", NULL, NULL}
};
//============================================================================
MENU_ITEM_t fm_para[5] =
{// menu_count DisplayString subs childrenmenu
{5,1, "2-3-1 FM1频率", fm1_freq_set, NULL},
{5,1, "2-3-2 FM1音量", fm1_vol_set, NULL},
{5,1, "2-3-3 FM2频率", fm2_freq_set, NULL},
{5,1, "2-3-4 FM2音量", fm2_vol_set, NULL},
{5,1, "<<返回", NULL, NULL}
};
//============================================================================
MENU_ITEM_t area_para[3] =
{
{3,1, "2-4-1 地址设置", area_set, NULL},
{3,1, "2-4-2 编号设置", device_num_set, NULL},
{3,1, "<<返回", NULL, NULL}
};
//============================================================================
//设置参数菜单
MENU_ITEM_t para_set[5]=
{ // menu_count DisplayString subs childrenmenu
{5,1, "2-1 地数设置", NULL, dtmb_para },
{5,1, "2-2 有线设置", NULL, cable_para},
{5,1, "2-3 调频设置", NULL, fm_para },
{5,1, "2-4 地址设置", NULL, area_para },
{5,1, "<<返回", NULL, NULL},
};
//=============================================================================
//地数参数读取
MENU_ITEM_t read_dtmb_para[3] =
{
{3,1, "1-1-1 地数频率", dtmb_freq_read, NULL },
{3,1, "1-1-2 地数音量", dtmb_vol_read, NULL },
{3,1, "<< 返回", NULL, NULL },
};
//=============================================================================
MENU_ITEM_t read_cable_para[4] =
{
{4,1, "1-2-1 有线频率", cable_freq_read, NULL},
{4,1, "1-2-2 符号率", cable_symbol_read, NULL},
{4,1, "1-2-3 有线音量", cable_vol_read, NULL},
{4,1, "1-2-4 <<返回", NULL, NULL},
};
//=============================================================================
MENU_ITEM_t read_fm_para[5] =
{
{5,1, "1-3-1 FM1频率", fm1_freq_read , NULL},
{5,1, "1-3-2 FM1音量", fm1_vol_read, NULL},
{5,1, "1-3-3 FM2频率", fm2_freq_read, NULL},
{5,1, "1-3-4 FM2音量", fm2_vol_read, NULL},
{5,1, "1-3-5 <<返回", NULL, NULL}
};
//=============================================================================
MENU_ITEM_t read_area_para[3] =
{
{3,1, "1-4-1 地址读取", area_read, NULL},
{3,1, "1-4-2 编号读取", device_num_read, NULL},
{3,1, "<<返回", NULL, NULL}
};
//=============================================================================
//读取参数菜单
MENU_ITEM_t read_para[5] =
{
{5,1, "1-1 地数参数", NULL, read_dtmb_para },
{5,1, "1-2 有线参数", NULL, read_cable_para },
{5,1, "1-3 调频参数", NULL, read_fm_para },
{5,1, "1-4 地址读取", NULL, read_area_para },
{5,1, "<<返回", NULL, NULL }
};
//=============================================================================
//主菜单定义
MENU_ITEM_t main_menu[4] =
{ // menu_count DisplayString subs childrenmenu
{4,1, "1 读取参数", NULL, read_para },
{4,1, "2 设置参数", NULL, para_set },
{4,1, "3 状态查看", status_check, NULL},
{4,1, "4 <<返回", NULL, NULL}
};
|
|