多级菜单演示

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();
        
   }    

}    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值