📄 menuindanpianji.c
字号:
我的硬件:LPC2131+NOKIA5510
其实这个程序是跟硬件无关的....
一共有两个最重要的文件,其它文件在这两个文件里也有说明.....
菜单的数据结构就是树...
--------------------------------------------------------------------------------
/***********************************Copyright (c)**********************************
**
** XPSTUDIO,曹香鹏.
** http://xpstudio2003.blog.163.com
**
**文件说明:
此文件为菜单的实现文件.
1.文件引用说明
"config.h" ---系统配置文件
"MenuFunc.H" ---菜单中要执行的函数文件
"MENUDISP.H" ---菜单图形编码
"GUI.H" ---液晶接口
2.对向输出接口
Menu_Next(void);
Menu_Prev(void);
Menu_Enter(void);
Menu_Esc(void);
Menu_Init(void);
3.菜单数据结构:
树.
4.修改添加菜单依照下面菜单结构.
见菜单结构中的说明
***********************************************************************************/
#include "config.h"
#include "MenuFunc.H"
#include "MENUDISP.H"
#include "GUI.H"
//===============================================================
//第一部分(1/3)
//菜单树结构及菜单定义
typedef struct MENU
{
INT8U MenuCount;
INT8U const * MenuDiscrip; //菜单项描述(引用自MENUDISP.H)
struct MENU * pChldrnMenu; //子菜单
struct MENU * pPrntMenu; //父菜单
void (*pSub)(); //节点函数(引用自MenuFunc.H文件)
}MENU;
//1.首先定义各菜单.
#define SYSINFO_NUM 3
#define MAINMENU_NUM 8
MENU SysInfo[SYSINFO_NUM];
MENU MainMenu[MAINMENU_NUM];
//2.再实现菜单之间的关联.
MENU SysInfo[SYSINFO_NUM]=
{
{SYSINFO_NUM, Str0, 0, MainMenu, SysVersion}, //系统版本
{SYSINFO_NUM, Str1, 0, MainMenu, SysAuthor}, //系统作者
{SYSINFO_NUM, Str4, 0, MainMenu, 0}, //选项二
};
MENU MainMenu[MAINMENU_NUM]=
{
{ MAINMENU_NUM, Str3, 0, 0, 0}, //选项一
{ MAINMENU_NUM, Str2, SysInfo, 0, 0}, //系统信息显示
{ MAINMENU_NUM, Str4, 0, 0, 0}, //选项二
{ MAINMENU_NUM, Str5, 0, 0, 0}, //选项三
{ MAINMENU_NUM, Str6, 0, 0, 0}, //选项四
{ MAINMENU_NUM, Str7, 0, 0, 0}, //选项五
{ MAINMENU_NUM, Str8, 0, 0, 0}, //选项六
{ MAINMENU_NUM, Str9, 0, 0, 0}, //选项七
};
//===============================================================
//第二部分(2/3)
//菜单图形显示操作
//菜单显示参数配置
#define LCD_MENU_BEGIN 13 //菜单开始位置(pix)
#define LCD_HZ_WIDTH 12 //汉字占用宽度(pix) >=12
#define LCD_LINE_MAX 4 //菜单所用行数(line)
#define MENU_ITEM_HZ_NUM 4 //每菜单项占用汉字数, >=4
//菜单操作全局变量
static MENU *pMenuCurr; //当前菜单指针
static INT8U MenuSlct; //当前菜单选中项
static INT8U MenuMIN; //
static INT8U MenuMAX; //
static INT8U LineSlct; //屏幕选中行.
//显示一行菜单项
//显示在line行,显示内容为str内.
void ShowMenuItem(INT8U line, INT8U const * str)
{
INT8U const * pStr;
INT8U x;
INT8U i;
INT8U HZnum; //菜单项汉字个数
HZnum = str[0];
pStr = str+1;
x= LCD_MENU_BEGIN;
for(i=0; i<HZnum; i++)
{
GUI_ShowHZ12(line, x, Hzk[(pStr[i])]);
x = x + LCD_HZ_WIDTH;
}
for(; i<MENU_ITEM_HZ_NUM; i++)
{
GUI_ShowHZ12(line, x, Space);
x = x + LCD_HZ_WIDTH;
}
}
//显示菜单界面
//当操作了菜单后,界面就会更改,些函数只更改出现变化的部分.
void ShowMenu(MENU *pMenu, INT8U Sel)
{
INT8U MnMinTmp;
INT8U MnMaxTmp;
INT8U LnSlctTmp;
INT8U line;
INT8U i;
//-------------------------------------------
//防止出错
if(pMenu == 0)return ;
if( (pMenu->MenuCount -1) < Sel)
{
Sel = 0;
}
//-------------------------------------------
//确定显示范围
//情况1.选项少于行数
if((pMenu->MenuCount) <= LCD_LINE_MAX)
{
MnMinTmp = 0;
MnMaxTmp = (pMenu->MenuCount)-1;
}
//情况2.选项多于行数
else if(Sel < LCD_LINE_MAX )
{
MnMinTmp = 0;
MnMaxTmp = LCD_LINE_MAX-1;
}
else if( ( (pMenu->MenuCount) - Sel ) > LCD_LINE_MAX )
{
MnMinTmp = Sel;
MnMaxTmp = Sel+LCD_LINE_MAX;
}
else
{
MnMinTmp = (pMenu->MenuCount)-LCD_LINE_MAX;
MnMaxTmp = (pMenu->MenuCount)-1;
}
//-------------------------------------------
//确定选中哪一行
LnSlctTmp = Sel-MnMinTmp;
if(LnSlctTmp!=LineSlct)
{
LineSlct=LnSlctTmp;
for(i=0; i<LnSlctTmp; i++)
{
GUI_ShowHZ12(i, 0, Space);
}
GUI_ShowHZ12(i++, 0, PicArrowSel);
for(; i<LCD_LINE_MAX; i++)
{
GUI_ShowHZ12(i, 0, Space);
}
}
//-------------------------------------------
//显示菜单项
if( (MnMinTmp!=MenuMIN ) || (MnMaxTmp!=MenuMAX ) )
{
MenuMIN=MnMinTmp;
MenuMAX=MnMaxTmp;
pMenu += MnMinTmp;
for(line=0; MnMinTmp<=MnMaxTmp; MnMinTmp++,line++)
{
ShowMenuItem(line, pMenu->MenuDiscrip);
pMenu++;
}
for(; line<LCD_LINE_MAX; line++)
{
ShowMenuItem(line, SpaceMenu);
}
}
//-------------------------------------------
}
//===============================================================
//第三部分(3/3)
//菜单输出函数接口.
//菜单初始化函数.初始化菜单操作全局变量
void Menu_Init(void)
{
pMenuCurr = 0;
MenuSlct = 0;
MenuMIN = 0;
MenuMAX = 0;
LineSlct = 0xFF;
}
void Menu_Next(void)
{
if( pMenuCurr == 0)return; //空菜单,返回
MenuSlct++;
if(MenuSlct >= (pMenuCurr->MenuCount) )
{
MenuSlct = 0;
}
ShowMenu(pMenuCurr, MenuSlct);
}
void Menu_Prev(void)
{
if( pMenuCurr == 0)return; //空菜单,返回
if(MenuSlct>0)
{
MenuSlct--;
}
else
{
MenuSlct = (pMenuCurr->MenuCount)-1;
}
ShowMenu(pMenuCurr, MenuSlct);
}
void Menu_Enter(void)
{
if( pMenuCurr == 0)
{
pMenuCurr = MainMenu;
ShowMenu(pMenuCurr, MenuSlct);
return;
}
//如果子目录存在
if( ((pMenuCurr+MenuSlct)->pChldrnMenu)!=0 )
{
pMenuCurr = (pMenuCurr+MenuSlct)->pChldrnMenu;
MenuSlct = 0;
MenuMIN = 0;
MenuMAX = 0;
LineSlct = 0xFF;
ShowMenu(pMenuCurr, MenuSlct);
}
//如果是可执行函数
else if( ((pMenuCurr+MenuSlct)->pSub) !=0)
{
((pMenuCurr+MenuSlct)->pSub)();
}
}
void Menu_Esc(void)
{
if( pMenuCurr == 0)return; //空菜单,返回
//如果上一级菜单存在
if( ((pMenuCurr+MenuSlct)->pPrntMenu)!=0 )
{
pMenuCurr = (pMenuCurr+MenuSlct)->pPrntMenu;
MenuSlct = 0;
MenuMIN = 0;
MenuMAX = 0;
LineSlct = 0xFF;
ShowMenu(pMenuCurr, MenuSlct);
}
}
//MENU.C文件结束
//===============================================================
--------------------------------------------------------------------------------
第二个文件
/***********************************Copyright (c)**********************************
**
** XPSTUDIO,曹香鹏.
** http://xpstudio2003.blog.163.com
**
**文件说明:
此文件为MENU.C的配套文件,单独使用无意义.
可以依照格式添加.
1.在 INT8U const Hzk[]追加汉字码.
2.在 文件最后追加汉字串编码
即可在文件MENU.C中引用.
***********************************************************************************/
//右箭头.
INT8U const PicArrowSel[24]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFC,0xF8,0xF0,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x01,0x00,0x00,
};
//汉字空格
INT8U const Space[24]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
INT8U const Hzk[][24]={
//版
{0x00,0xFE,0x48,0xCF,0x08,0xFE,0x2A,0x4A,0x89,0x79,0x09,0x00,0x06,0x01,0x00,0x07,0x02,0x05,0x02,0x01,0x01,0x02,0x04,0x00},
//本
{0x04,0x84,0x44,0x24,0x14,0xFF,0x14,0x24,0x44,0x86,0x04,0x00,0x01,0x00,0x01,0x01,0x01,0x07,0x01,0x01,0x01,0x00,0x01,0x00},
//作
{0x10,0x08,0xFC,0x13,0x08,0x04,0xFF,0x24,0x24,0x24,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x01,0x01,0x01,0x01,0x00},
//者
{0x10,0x12,0x92,0xD2,0x7F,0x52,0x5A,0x56,0xD2,0x19,0x10,0x00,0x01,0x01,0x00,0x07,0x05,0x05,0x05,0x05,0x07,0x00,0x00,0x00},
//系
{0x00,0x02,0x4A,0xCA,0x6E,0xDA,0x49,0xC9,0x65,0x41,0x00,0x00,0x04,0x02,0x01,0x04,0x04,0x07,0x00,0x00,0x01,0x02,0x04,0x00},
//统
{0x48,0x6C,0x5B,0x4C,0x00,0x32,0xEA,0x27,0xE2,0x32,0x22,0x00,0x02,0x02,0x01,0x05,0x04,0x02,0x01,0x00,0x07,0x04,0x07,0x00},
//信
{0x20,0xF8,0x07,0x02,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0x02,0x00,0x00,0x07,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x07,0x00,0x00},
//息
{0x00,0x00,0xFE,0xAA,0xAB,0xAA,0xAA,0xAA,0xFE,0x00,0x00,0x00,0x04,0x03,0x00,0x07,0x04,0x05,0x06,0x04,0x06,0x01,0x02,0x00},
//选
{0x11,0xF6,0x00,0x18,0x16,0xF4,0x1F,0xF4,0x14,0x14,0x90,0x00,0x06,0x01,0x02,0x06,0x05,0x04,0x04,0x05,0x05,0x05,0x05,0x00},
//项
{0x02,0x02,0xFE,0x82,0x01,0xFD,0x05,0xF7,0x05,0xFD,0x01,0x00,0x01,0x01,0x00,0x00,0x04,0x04,0x02,0x01,0x01,0x02,0x04,0x00},
//一
{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
//二
{0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00},
//三
{0x00,0x02,0x22,0x22,0x22,0x22,0x22,0x22,0x23,0x02,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00},
//四
{0x00,0xFF,0x81,0x41,0x3F,0x01,0x01,0xFF,0x81,0x81,0xFF,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x07,0x00},
//五
{0x00,0x11,0x11,0x91,0x7F,0x11,0x11,0x11,0xF1,0x01,0x00,0x00,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x00},
//六
{0x08,0x08,0x88,0x68,0x09,0x0E,0x28,0x48,0x88,0x08,0x08,0x00,0x04,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00},
//七
{0x20,0x20,0x20,0x20,0xFF,0x10,0x10,0x10,0x08,0x08,0x88,0x00,0x00,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x07,0x00},
//在此外添加汉字图形编码
//add your character pic
};
/*空菜单*/
INT8U const SpaceMenu[]={0};
/*版本*/
INT8U const Str0[]={2,0,1};
/*作者*/
INT8U const Str1[]={2,2,3};
/*系统信息*/
INT8U const Str2[]={4,4,5,6,7};
/*选项一*/
INT8U const Str3[]={3,8,9,10};
/*选项二*/
INT8U const Str4[]={3,8,9,11};
/*选项三*/
INT8U const Str5[]={3,8,9,12};
/*选项四*/
INT8U const Str6[]={3,8,9,13};
/*选项五*/
INT8U const Str7[]={3,8,9,14};
/*选项六*/
INT8U const Str8[]={3,8,9,15};
/*选项七*/
INT8U const Str9[]={3,8,9,16};
//在此处追加汉字串编码....
//add your character string code
//MENUDISP.H文件结束
//===============================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -