lzh电子论坛

欢迎来到lzh电子论坛:
如果您对电子技术感兴趣就加入我们吧!在这里互相交流互相学习!主要讨论的方向有:单片机,ARM,PCB板设计,FPGA,汇编,C/C++等方面。
-----lzh电子论坛
lzhbbs.top-me.com
lzh电子论坛

电子的道路是孤独的,要懂得左手温暖右手,要懂得把debug当作快乐去欣赏,去享受,那样你才会成功...

欢迎访问lzh电子论坛。可通过【谷歌,SOSO,搜狗】搜索“lzh电子论坛”直接进入论坛。点击了解论坛详细制度


    学习笔记--菜单程序的编写

    分享
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 25

    学习笔记--菜单程序的编写

    帖子 由 Admin 于 2013-06-10, 1:27 pm

    人机界面对一个作品来说是非常重要的,这样就学要编写对应的菜单程序。我习惯用结构体的方式来编写菜单,看起来清晰明了。下面说一下相应的步骤:

    对菜单的操作需要四个按键:

    KEY1 确定键

    KEY2 上

    KEY3 下

    KEY4 返回

    后面写着的是这四个按键的最基本功能,在程序中可以用这四个按键实现其他的功能,比如用KEY2还可以实现复用功能就是对数字的加,KEY3的复用功能可以定义为数字的减。

    有了这四个按键后需要一个按键的扫描程序给个简单的例子:

    typedef unsigned char u8;
    u8 gKeyNum = 0;
    #define KEY1_NUM 1
    #define KEY2_NUM 2
    #define KEY3_NUM 3
    #define KEY4_NUM 4

    #define UP 2
    #define DOWN 3
    #define SURE 1
    #define BACK 4

    void GetKeyNum()
    {
    这个函数判断哪个按键按下,同时给gKeyNum赋值
    }


    得到了键值后就开始菜单的主要部分了:
    先定义一个结构体:

    typedef struct
    {
    uint8 index; //当前指向
    uint8 downindex; //下一个
    uint8 upindex; //上一个
    uint8 sureindex; //确认
    uint8 backindex; //返回
    void (*option)();//对于函数
    }menu;


    再根据自己的菜单级数来定义一个结构体数组:

    menu code menutab[] =
    {
    //当前,下,上,确认,返回,指向函数
    {0,0,0,1,0,*displaykj}, //开机界面
    {1,2,2,3,0,*display11}, //系统设置
    {2,1,1,6,0,*display12}, //测距
    {3,4,5,8,1,*display111}, //单位设定
    {4,5,3,9,1,*display112}, //小数点后位数设定
    {5,3,4,10,1,*display113}, //报警线设定
    {6,7,7,11,2,*display121}, //普通测量
    {7,6,6,11,2,*display122}, //优化测量
    {8,8,8,3,3,*display1111}, //单位设定界面
    {9,9,9,4,4,*display1121}, //小数点后面位数设定界面
    {10,10,10,5,5,*display1131}, //报警线设定界面
    {11,11,11,11,6,*display1211} //测量界面

    };

    然后就是结合按键来使用:

    void GetMenu()
    {
    uint8 tmp;
    GetKeyNum();
    switch(gKeyNumber)
    {
    case UP: gMenuIndex = menutab[gMenuIndex].upindex;break;
    case DOWN: gMenuIndex = menutab[gMenuIndex].downindex;break;
    case SURE: gMenuIndex = menutab[gMenuIndex].sureindex;break;
    case BACK: gMenuIndex = menutab[gMenuIndex].backindex;break;
    default: break;
    }
    (*menutab[gMenuIndex].option)();
    }

    下面就写结构体里面对应的函数;
    .
    .
    .
    ..
    .
    .
    .
    ..

    .
    试试吧




    _________________
    电子的道路是孤独的,要懂得左手温暖右手,要懂得把debug当作快乐去欣赏,去享受,那样你才会成功...

      目前的日期/时间是2018-06-18, 12:12 pm