struct Menultem* Menupoint=MainMenu;
short selectItem;
struct Menultem
{
short Menucount;//当前菜单项目总数
u8 *DisplayString;//当前项目要显示的字符
void(*Subs)();//选择某一菜单后执行的功能函数
struct Menultem *ChildrenMenus;//当前项目的子菜单
struct Menultem *parentMenus;
};
以上是一个结构体,下面的菜单按照结构体格式
一级菜单:
struct Menultem MainMenu[1]={
{1,(u8 *)"menu",NULL,NULL,NULL}
};
举例eg:
struct Menultem MainMenu[1]={
{1,(u8 *)"menu",NULL,NULL,NULL}
};
1:当前菜单项目总数
(u8 *)"menu":当前项目要显示的字符
NULL:选择某一菜单后执行的功能函数
NULL:当前项目的子菜单(NULL在stdio.h定义)(上级菜单)
NULL:当前项目父菜单(下级菜单)
二级菜单:
struct Menultem SetMenu1[3]={
{3,(u8 *)"open >>",NULL,NULL,MainMenu},
{3,(u8 *)"close >>",NULL,NULL,MainMenu},
{3,(u8 *)"help >>",NULL,NULL,MainMenu}
};
三级菜单:
struct Menultem SetMenu2[7]={
{7,(u8 *)"text1",NULL,NULL,SetMenu1},
{7,(u8 *)"text2",NULL,NULL,SetMenu1},
{7,(u8 *)"text3",NULL,NULL,SetMenu1},
{7,(u8 *)"text4",NULL,NULL,SetMenu1},
{7,(u8 *)"text5",NULL,NULL,SetMenu1},
{7,(u8 *)"text6",NULL,NULL,SetMenu1},
{7,(u8 *)"text7",NULL,NULL,SetMenu1},
};
void displays(struct Menultem * Menupoint,short selectItem)
{
int j;
u16 x=30;
u16 y=30;
LCD_Fill(0,y+selectItem*24-24,tftlcd_data.width,y+selectItem*24,BLUE);
for(j=0;j<Menupoint->Menucount;j++)
{
LCD_ShowString(x,y,400,24,24,Menupoint[j].DisplayString);
y+=30;
}
FRONT_COLOR=BLACK;
LCD_DrawRectangle(x-5,y-10,x+60,y+20);
LCD_ShowString(x,y,200,16,16,Menupoint[selectItem-1].DisplayString);
y+=30;
for ( j= selectItem; j < Menupoint->Menucount; j++)
{
LCD_ShowString(x,y,200,16,16,Menupoint[j].DisplayString);
y+=30;
}
}
void menu()
{
LCD_Display_Dir(0); //0:竖屏 1:横屏 默认竖屏
MainMenu[0].ChildrenMenus=SetMenu1;
SetMenu1[0].ChildrenMenus=SetMenu2;
if(K_DOWN==0)
{
if(selectItem==1)
{
LCD_Clear(WHITE);
selectItem=Menupoint->Menucount;
}
else selectItem--;
displays(Menupoint,selectItem);
while(K_DOWN==0);
}
else
{
}
if(K_UP==1)
{
if(selectItem==Menupoint->Menucount)
{
LCD_Clear(WHITE);
selectItem=1;
}
else selectItem++;
displays(Menupoint,selectItem);
while(K_UP==1);
}
if(K_RIGHT==0)
{
if(Menupoint[selectItem-1].ChildrenMenus!=NULL)
{
LCD_Clear(WHITE);
Menupoint=Menupoint[selectItem-1].ChildrenMenus;
selectItem=1;
displays(Menupoint,selectItem);
}
while(K_RIGHT==0);
}
if(K_LEFT==0)
{
if(Menupoint[selectItem-1].parentMenus!=NULL)
{
LCD_Clear(WHITE);
Menupoint=Menupoint[selectItem-1].parentMenus;
selectItem=1;
displays(Menupoint,selectItem);
}
while(K_LEFT);
}
delay_ms(10);
}
主函数:
int main()
{
SysTick_Init(168); //嘀嗒定时器初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
LED_Init(); //LED灯初始化
USARTx_Init(USART1); //串口初始化
KEY_Init();
TFTLCD_Init();
while(1)
{
menu();
}
}