25

主题

4

好友

98

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
490843
帖子
272
精华
0
经验
98 点
金钱
92 ¥
注册时间
2012-4-21
发表于 2014-3-1 14:05 | 显示全部楼层
本人有个LCD人机交互的项目,想请教各位关于LCD多层菜单设计的问题?????

我的LCD布局是这样:(用的是19264,最大能显示4行  点阵模式为8*16)

                ________ 标题1________
               功率:              "参数1"  dbm
                                     "参数2"  mW
              退出                             返回

说明:参数1、2通过串口接收数据。

菜单说明:1、按“确定键”,“参数1、参数2”反显输出。
                 2、按”向下键“,”退出“反显输出。
                 3、再按”向下键“,”返回“反显输出。
                 4、再按下”确认键“,LCD界面正常输出

我的做法是:
1、按照LCD界面布局正常输出。
2、当按下”确定键“时,先执行第1步,然后再”参数1、参数2“反显输出。
3、当按”向下键“时,先执行第1不,然后再”退出“反显输出。

总结:
          在每次有按键按下时,先正常显示LCD界面。然后再反显选择的项。
缺点:
          代码量很大,当通过上下按键调整参数1、参数2时,不好控制LCD界面

22

主题

2

好友

145

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
178602
帖子
452
精华
0
经验
145 点
金钱
109 ¥
注册时间
2010-3-5
发表于 2014-3-1 18:57 | 显示全部楼层
定义一个值操作或项操作的标志就得,就比原来不操作值时多几行代码

25

主题

4

好友

98

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
490843
帖子
272
精华
0
经验
98 点
金钱
92 ¥
注册时间
2012-4-21
 楼主| 发表于 2014-3-1 19:48 | 显示全部楼层
hoverxx 发表于 2014-3-1 18:57
定义一个值操作或项操作的标志就得,就比原来不操作值时多几行代码

不大明白...详解!!!!

22

主题

2

好友

145

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
178602
帖子
452
精华
0
经验
145 点
金钱
109 ¥
注册时间
2010-3-5
发表于 2014-3-1 20:20 | 显示全部楼层
314613767 发表于 2014-3-1 19:48
不大明白...详解!!!!

标志是值操作则上下键对值进行加减,为项操作则菜单项上下操作

25

主题

4

好友

98

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
490843
帖子
272
精华
0
经验
98 点
金钱
92 ¥
注册时间
2012-4-21
 楼主| 发表于 2014-3-1 20:33 | 显示全部楼层
hoverxx 发表于 2014-3-1 20:20
标志是值操作则上下键对值进行加减,为项操作则菜单项上下操作

你可能没明白我的问题:
我的LCD菜单为三层菜单:
1级:正常显示 LCD 界面
2级:3项   1、”参数1、参数2“
                2、”退出“
                3、”返回“
3级:调整”参数1、参数2“

我想了解  2级的三项怎么却换选择     (当前选择的内容反显)????

我的做法是   每切换一次选择前 先执行1级菜单(取消原来反显的内容),然后再反显当前的选择的内容
例如:当前  1、反显”退出“,
                 2、执行1级菜单显示(取消了”退出“反显)
                 3、反显”返回“。

22

主题

2

好友

145

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
178602
帖子
452
精华
0
经验
145 点
金钱
109 ¥
注册时间
2010-3-5
发表于 2014-3-1 20:48 | 显示全部楼层
314613767 发表于 2014-3-1 20:33
你可能没明白我的问题:
我的LCD菜单为三层菜单:
1级:正常显示 LCD 界面

你是不是不用struct结构做菜单的,在显示时只要对当前选中项反显,123级菜单都 是自动反显的

25

主题

4

好友

98

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
490843
帖子
272
精华
0
经验
98 点
金钱
92 ¥
注册时间
2012-4-21
 楼主| 发表于 2014-3-1 21:01 | 显示全部楼层
hoverxx 发表于 2014-3-1 20:48
你是不是不用struct结构做菜单的,在显示时只要对当前选中项反显,123级菜单都 是自动反显的

没有,在切换时要怎么取消原来反显的内容????

22

主题

2

好友

145

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
178602
帖子
452
精华
0
经验
145 点
金钱
109 ¥
注册时间
2010-3-5
发表于 2014-3-1 21:05 | 显示全部楼层
314613767 发表于 2014-3-1 21:01
没有,在切换时要怎么取消原来反显的内容????

用结构体来构建菜单吧
struct menu_item {
  struct menu_item *child;
uint8_t menu_cnt;
void (*sub)();
.......
}
大概这样

25

主题

4

好友

98

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
490843
帖子
272
精华
0
经验
98 点
金钱
92 ¥
注册时间
2012-4-21
 楼主| 发表于 2014-3-1 21:13 | 显示全部楼层
hoverxx 发表于 2014-3-1 21:05
用结构体来构建菜单吧
struct menu_item {
  struct menu_item *child;

我知道了你的想法。就比如:我的2级菜单有三个选项,当切换的时候就调用当前的兄弟菜单,就相当说整个屏都刷新了。

22

主题

2

好友

145

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
178602
帖子
452
精华
0
经验
145 点
金钱
109 ¥
注册时间
2010-3-5
发表于 2014-3-1 21:16 | 显示全部楼层
314613767 发表于 2014-3-1 21:13
我知道了你的想法。就比如:我的2级菜单有三个选项,当切换的时候就调用当前的兄弟菜单,就相当说整个屏都 ...

差不多吧

22

主题

2

好友

145

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
178602
帖子
452
精华
0
经验
145 点
金钱
109 ¥
注册时间
2010-3-5
发表于 2014-3-1 21:16 | 显示全部楼层
314613767 发表于 2014-3-1 21:13
我知道了你的想法。就比如:我的2级菜单有三个选项,当切换的时候就调用当前的兄弟菜单,就相当说整个屏都 ...

struct menu_item
{
        u8 menu_num;//当前层节点数
        u8 *menu_string;//当前节点显示文字
        struct menu_item *menu_children;        //子节点
        void(*menu_sub)();        //节点函数
};

struct menu_item main_menu[5];
struct menu_item set_menu[4];
struct menu_item display_set_menu[2];
struct menu_item time_set_menu[3];
struct menu_item alarm_set_menu[5];

struct menu_item main_menu[5]=//一级菜单
{
        {5,"1.Line_1   ",NULL,_switch_line_1},
        {5,"2.Line_2   ",NULL,_switch_line_2},
        {5,"3.Radio    ",NULL,_switch_radio},
        {5,"4.Set      ",set_menu,NULL_sub},
        {5,"5.Exit     ",main_menu,_set_menu},         //退出菜单
};
struct menu_item set_menu[4]=//二级菜单
{
        {4,"1.Set Disp ",display_set_menu,NULL_sub},
        {4,"2.Set Time ",time_set_menu,NULL_sub},
        {4,"3.Set Alarm",alarm_set_menu,NULL_sub},
        {4,"4.Back     ",main_menu,NULL_sub},
};
struct menu_item display_set_menu[2]=//三级菜单
{
        {2,"1.FFT Time ",NULL,_set_display_fft_time},
        {2,"2.Back     ",set_menu,NULL_sub},
};
struct menu_item time_set_menu[3]=//三级菜单
{
        {3,"1.Set Date ",NULL,_set_date},
        {3,"2.Set Time ",NULL,_set_time},
        {3,"3.Back     ",set_menu,NULL_sub},
};
struct menu_item alarm_set_menu[5]=//三级菜单
{
        {5,"1.Alarm 1  ",NULL,_set_alarm_1},
        {5,"2.Alarm 2  ",NULL,_set_alarm_2},
        {5,"3.Alarm 3  ",NULL,_set_alarm_3},
        {5,"4.Auto Off ",NULL,_set_auto_off},
        {5,"5.Back     ",set_menu,NULL_sub},
};

struct menu_item (*menu_point) = main_menu;//结构体指针

void NULL_sub(void)
{}
/*****************************************************************************************
******************************************************************************************/
void disp_menu(void)
{
        u8 i,m,fan_bai=0;
        max_menu_item_num=menu_point[0].menu_num;         //同层最大菜单数
        if(max_menu_item_num<max_show_menu_item_num)   //当前层菜单数小于可显示最大菜单数
        {
                m=max_menu_item_num;
        }
        else                                                                                   //当前层菜单数大于等于可显示最大菜单数
        {
                m=max_show_menu_item_num;
        }
        for(i=0;i<m;i++)
        {
                if(i==choose_menu_item)
                        fan_bai=1;
                else fan_bai=0;
                putstring0508(0,i*8,menu_point[first_menu_item+i].menu_string,fan_bai);
        }

}这个是我以前的菜单的

25

主题

4

好友

98

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
490843
帖子
272
精华
0
经验
98 点
金钱
92 ¥
注册时间
2012-4-21
 楼主| 发表于 2014-3-1 21:29 | 显示全部楼层
hoverxx 发表于 2014-3-1 21:16
struct menu_item
{
        u8 menu_num;//当前层节点数

你这个是每行只有一个节点, 像我一行有 两个节点 每个节点的LCD点阵位置不同

22

主题

2

好友

145

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
178602
帖子
452
精华
0
经验
145 点
金钱
109 ¥
注册时间
2010-3-5
发表于 2014-3-1 21:34 | 显示全部楼层
314613767 发表于 2014-3-1 21:29
你这个是每行只有一个节点, 像我一行有 两个节点 每个节点的LCD点阵位置不同

那你在显示那儿区分开就是了

25

主题

4

好友

98

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
490843
帖子
272
精华
0
经验
98 点
金钱
92 ¥
注册时间
2012-4-21
 楼主| 发表于 2014-3-1 22:03 | 显示全部楼层
hoverxx 发表于 2014-3-1 21:34
那你在显示那儿区分开就是了

我先琢磨下你的那个程序,有什么不懂的地方还请兄弟多多指教一下!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc.

返回顶部