|
发表于 2011-4-14 19:39:25
|
显示全部楼层
我做了修改的
使用时周期性调用 MenuUpdata()
可以返回时 返回上层进入时的位置
结构体 位于FLASH
可以显示 小数 整数 负数.....
子函数更好的调用
.......
/*************************************************************/
menu.h
#ifndef _MENU_H
#define _MENU_H
/***********************
* 函数声明 *
***********************/
void ShowMenu(void);
void MenuUpadta(void);
/**********************
* 目录结构体定义 *
**********************/
struct MenuItem
{
unsigned char MaxCount;
unsigned char * __flash Title; //菜单标题
void (*Subs)(void); //节点函数
__flash struct MenuItem * __flash ChildMenus; //子节点
} ;
void task2(void);
/***********************
* 全局变量声明区 *
***********************/
__flash extern struct MenuItem TimeMenu[3];
__flash extern struct MenuItem MainMenu[4];
extern struct MenuItem __flash* MenuPoint ;//结构体指针,指向结构体后由内部函数指针指向功能函数
extern struct MenuItem __flash* LastMenuPoint;
extern unsigned char UserChoose; //用户所选菜单项
extern unsigned char LastUserChoose; // 用来保存返回时的UserChoose
extern unsigned MaxItems; //同级最大菜单数
extern const unsigned char ShowCount; //同屏显示菜单数
extern unsigned char IsBottom;
//unsigned char DisplayStart1;
#endif
/************************end of the file******************************************/
/************************** menu.c ********************************************/
#include"common.h"
#include "key.h"
#include "1602.h"
#include "mymenu.h"
/***********************
* 结构体区 *
***********************/
//----------------------以下为例子,请根据实际情况修改---------------------------
__flash struct MenuItem MainMenu[4]=
{ // DisplayString Subs ChildrenMenus
{ 4, "1.Time Set", 0, TimeMenu, },
{ 4 ,"2.Date Set", task2, Null, },
{ 4 ,"3.AlertSet", 0, Null, },
{ 4 ,"4.Back", 0, Null, },
};
__flash struct MenuItem TimeMenu[3]=
{ // MaxCount DisplayString Subs ChildMenus
{ 3, "1.", 0, Null, },
{ 3, "2.", 0, Null, },
{ 3,"3.", 0, Null, },
};
/***********************
* 全局变量区 *
***********************/
struct MenuItem __flash *MenuPoint = MainMenu; //结构体指针,指向结构体后由内部函数指针指向功能函数
struct MenuItem __flash* LastMenuPoint=MainMenu;
unsigned char UserChoose = 0; //用户所选菜单项
unsigned char LastUserChoose = 0; // 用来保存返回时的UserChoose
unsigned MaxItems; //同级最大菜单数
const unsigned char ShowCount=2; //同屏显示菜单数
unsigned char IsBottom=0;
unsigned char DisplayStart1=0;
unsigned char size=0;
void task2(void)
{
//static unsigned int i=0;
LcmPutUint16(0,0,size);
//i++;
}
/***********************
*显示函数区 *
***********************/
void ShowMenu(void)
{
unsigned char n;
unsigned char DisplayPoint = 0; //显示指针
MaxItems = MenuPoint[0].MaxCount;
DisplayPoint = DisplayStart1;
for(n=0;DisplayPoint<MaxItems&&n<ShowCount;n++)
{if(DisplayPoint==UserChoose)
LcmPutChar(0,n,0);
LcmPutString(1,n,MenuPoint[DisplayPoint++].Title);
}
/*
static unsigned int i=0;
LcmPutUint16(0,0,i);
i++;
*/
}
void MenuUpadta(void)
{
// 菜单函数的执行
if(IsBottom)
{
(*MenuPoint[UserChoose].Subs)();
if(KeyNum==ESC)
{
IsBottom=0;
CLC();
}
return;
}
if(KeyNum)
{
switch(KeyNum)
{
case UP:
UserChoose --;
if (UserChoose ==255)
{
UserChoose = 0;//上翻截至,如果要回滚赋值MaxItems-1
}
break;
case ESC:
{
MenuPoint = LastMenuPoint;
UserChoose = LastUserChoose;
}
break;
case DOWN:
UserChoose ++;
if (UserChoose == MaxItems)
{
UserChoose = MaxItems-1;//下翻截至,如要回滚赋值为0
}
break;
case ENTER:
if (MenuPoint[UserChoose].Subs != Null)
{
IsBottom=1;
}
else if (MenuPoint[UserChoose].ChildMenus != Null)
{
LastMenuPoint=MenuPoint;
MenuPoint = MenuPoint[UserChoose].ChildMenus;
LastUserChoose = UserChoose;
UserChoose = 0;
}
break;
default:break;
}
/************************* SET DisplayStart **********************/
if (UserChoose%ShowCount==0) //一屏只能显示ShowCount行
DisplayStart1 = UserChoose;
else if(UserChoose%ShowCount==1)
DisplayStart1 = UserChoose-1; //实现滚屏的关键
CLC(); //液晶清屏,根据不同液晶函数自行修改
}
ShowMenu();
} |
|