搜索
bottom↓
回复: 176

液晶多级菜单实现加强版

  [复制链接]

出25入84汤圆

发表于 2014-10-12 15:55:59 | 显示全部楼层 |阅读模式
最近有位兄台写了篇 单片机C语言下LCD多级菜单的一种实现方法
大致如下

typedef struct
{
 uchar  KeyStateIndex ;   / / 当前状态索引号
 uchar  KeyDnState ;   / / 按下“向下”键时转向的状态索引号
 uchar  KeyUpState ;   / / 按下“向上”键时转向的状态索引号
 uchar  KeyCrState ;   / / 按下“回车”键时转向的状态索引号
 uchar  KeyBackState ;   / / 按下“退回”键时转向的状态索引号
 void   (*CurrentOperate)( ) ;   / / 当前状态应该执行的功能操作
}  KbdTabSt ruct ;
# define SIZE - OF KEYBD - MENU 55   / / 菜单总长度
KbdTabSt ruct code KeyTab[ SIZE - OF - KEYBD - MENU ] =
{
 {0 ,0 ,0 ,1 ,0 , MainJob1 } ,
 {1 ,7 ,2 ,8 ,0 , Dsp Point} ,   / / 第一层
 {2 ,1 ,3 ,8 ,0 , DspCurve},   / / 第一层
 {3 ,2 ,4 ,36 ,0 ,Dsp Kout} ,   / / 第一层
 {4 ,3 ,5 ,50 ,0 , DisCloseDown } ,   / / 第一层


 {5 ,4 ,6 ,8 ,0 ,  ModifyPoint} ,   / / 第一层
 {6 ,5 ,7 ,52 ,0 , SetCloseDown } ,   / / 第一层
 {7 ,6 ,1 ,0 ,0 , Cancel} ,   / / 第一层
 …
 …
 {52 ,53 ,53 ,0 ,1 ,  OkSetCloseDown1} ,
 {53 ,52 ,52 ,0 ,1 , OkSetCloseDown2} ,
 {54 ,0 ,0 ,0 ,0 , Disable} ,
  …
  …
} ;
 void Get Keylnput (void)
{
 switch ( status &0xf0)
  {
  case 0xe0 :/ / 回车键,找出新的菜单状态编号
   …
        KeyFuncIndex = KeyTab[ KeyFuncIndex ] . KeyCrState ;
   …
   break ;
  case 0xb0 :/ / 向下键,找出新的菜单状态编号
   …
    KeyFuncIndex = KeyTab [ KeyFuncIndex ] . KeyDn2State ;
   …
  break ;
   case 0xd0 :/ / 向上键,找出新的菜单状态编号


   …
    KeyFuncIndex = KeyTab [ KeyFuncIndex ] . KeyUp2State ;
   …
   break ;
  case 0x70 :/ / 回退键,找出新的菜单状态编号
   …
    KeyFuncIndex = KeyTab [ KeyFuncIndex ] . KeyBack2State ;
   …
   break ;
  case 0 ;
    return ;   / / 错误的处理
    break ;
   }
  KeyFuncPt r = KeyTab[ KeyFuncIndex ] . CurrentOperate ;
  ( * KeyFuncPt r) () ;   / / 执行当前按键的操作
}

但是如果采用触摸屏,并且有多个界面需要切换,那么这种结构就大打折扣。
我要设计的界面是基于这个结构体的:
typedef struct _window_d{
    void (*draw)();//每个界面的画界面函数
    TKEY (*key_map)(unsigned int x, unsigned int y);//每个界面的所有按键(触摸按键)
    void (*key_process)(TKEY_EVENT *event);//每个界面的按键处理函数
}TBasicWindow;

下面是按键识别:
#define  UP     0   //按键弹起
#define  DOWN   1   //按键按下

typedef enum _key_enum_{
    KEY_NULL,
    MAIN_REVIEW,//第一个界面三个按键
    MAIN_PRINT,
    MAIN_SAVE,

    PATIENT_OK,//第二个界面三个按键
    PATIENT_BACK,
    PATIENT_NAME_ZONE,
    ..........
}TKEY;

typedef struct _key_{
    TKEY key;
    unsigned int TouchStatus;
}TKEY_EVENT;

void GetKey(TKEY_EVENT *event)
{
   unsigned int Y = 0;
   unsigned int X = 0;
   unsigned short c[3]={0};
   unsigned int TouchStatus = DOWN;
   get_coord(c);
   
   if(c[0] && !send)
   {
        X = c[1];
        Y = c[2];
        TouchStatus = DOWN;
   }
   
   if(!c[0])
   {
        X = c[1];
        Y =  c[2];
        TouchStatus = UP;
   }
   event->key = CurrentWin->key_map(X, Y);
   event->TouchStatus = TouchStatus;
}

写完上面的框架就是每个界面的函数了,我拿一个界面来说,其它都是这个框架:
TBasicWindow MainWin = {
        draw: MainDraw,
        key_map: MainKeyMap,
    key_process: MainKeyProcess,
};

void MainDraw(){
...
}
TKEY MainKeyMap(unsigned int x, unsigned int y)
{
    if((x > 95*0&& x <= 95*0) && (y > 685 && y < 790))   return MAIN_REVIEW;
    if((x > 95*1&& x <= 95*1) && (y > 685 && y < 790))   return MAIN_PRINT;
    if((x > 95*2&& x <= 95*2) && (y > 685 && y < 790))   return MAIN_SAVE;
}
void MainKeyProcess(TKEY_EVENT *event)
{
    static TKEY PressKey = KEY_NULL;//记录第一次按下的按键
   
    switch(event->key){
        case MAIN_REVIEW:
             if(event->TouchStatus){//按键按下
                PressKey = MAIN_REVIEW;//记录第一次按下触摸屏的按键
                MainKeyDisplay(PressKey, DOWN);//按键按下
             }
             else{//按键弹起
                MainKeyDisplay(PressKey, UP);//弹起先前一次按下的按键,不一定是MAIN_PATIENT
                if(PressKey != MAIN_REVIEW) break;//两次按键不一致则不执行
                //begin (按下和弹起都是PATIENT,则执行PATIENT的按键处理)
                CurrentWin = &ManagementWin;
                CurrentWin->draw();
                //end
             }
             break;
        ...
}

其它的界面都是这样写的,然后主函数只要这样就行了:
TBasicWindow *CurrentWin = &MainWin;
void main(void)
{
        TKEY_EVENT event;
        while(1){
                GetKey(&event);
                       CurrentWin->key_process(&event);
        }
}

最后贴两张界面照片

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-10-12 15:58:59 | 显示全部楼层
和之前那个有什么区别优势呢?

出0入0汤圆

发表于 2014-10-12 16:16:19 | 显示全部楼层
收藏着。。

出0入0汤圆

发表于 2014-10-12 16:18:03 | 显示全部楼层
不太明白

出0入0汤圆

发表于 2014-10-12 16:33:10 | 显示全部楼层
不太明白

出0入0汤圆

发表于 2014-10-12 17:19:43 | 显示全部楼层
能不能贴个demo出来  其实我也有一种架构做的菜单响应速度可占用资源极少

出0入0汤圆

发表于 2014-10-12 18:50:57 | 显示全部楼层
mark!

出0入0汤圆

发表于 2014-10-12 18:58:50 | 显示全部楼层
这个B超机的界面啊,楼主是从事医疗电子的

出25入84汤圆

 楼主| 发表于 2014-10-12 20:13:56 | 显示全部楼层
blade_li 发表于 2014-10-12 18:58
这个B超机的界面啊,楼主是从事医疗电子的

貌似是同行

出0入0汤圆

发表于 2014-10-12 22:24:12 | 显示全部楼层
B超机....做医疗的?....

出25入84汤圆

 楼主| 发表于 2014-10-12 22:32:11 | 显示全部楼层
lize 发表于 2014-10-12 22:24
B超机....做医疗的?....

         √

出0入0汤圆

发表于 2014-10-12 22:58:49 来自手机 | 显示全部楼层
B超机.            

出0入0汤圆

发表于 2014-10-13 14:51:12 | 显示全部楼层
好帖 比较经典的菜单结构。
感觉涉及到菜单中的数据设置,写起来很烦人。

出0入0汤圆

发表于 2014-10-13 15:04:20 | 显示全部楼层
本帖最后由 zhuyi 于 2014-10-13 15:09 编辑

对于显示和按键功能实现,有点疑问:按键功能程序和显示程序是各自单独做一个函数来实现还是在按键功能程序里面也同时刷新显示比较好呢?

(1):
{
        KeyEvent();
        ....
        .....
        DispEvent():
        ....
}

(2):

        KeyEvent():
        ....
}

keyEvent()
{
        DispEvent();
        ...
}

(1),(2)这两种哪种更通用更合理, 不知有显示界面的系统是哪种方式,还有游戏也是,有谁能说说吗

出0入0汤圆

发表于 2014-10-13 23:22:09 | 显示全部楼层
做影像的好.............像我们修检验的木有钱

出0入0汤圆

发表于 2014-10-14 07:41:05 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2014-10-14 08:14:42 | 显示全部楼层

出0入0汤圆

发表于 2014-10-14 08:43:18 | 显示全部楼层
谢谢分享。
一直都是用的第一种的方法写的菜单,很方便,能写N多层也能很方便的在各个菜单界面跳转。
正好准备用触摸屏了,楼主给个第二种菜单结构的demo吧。谢谢!

出0入102汤圆

发表于 2014-10-14 08:50:08 | 显示全部楼层
感谢分享,收藏。

出0入0汤圆

发表于 2014-10-14 08:51:05 | 显示全部楼层
多谢楼主分享。

出0入0汤圆

发表于 2014-10-14 08:53:01 | 显示全部楼层
mark,这种结构设计菜单很方便,以前在51里就这样弄,不过比较消耗flash空间

出0入0汤圆

发表于 2014-10-14 09:09:06 | 显示全部楼层
谢谢分享,mark~~

出0入0汤圆

发表于 2014-10-14 09:16:14 | 显示全部楼层
跟之前那个貌似一样啊,有什么改进吗?说来听听

出0入0汤圆

发表于 2014-10-14 09:29:33 | 显示全部楼层
mark慢慢研究

出25入84汤圆

 楼主| 发表于 2014-10-16 11:49:57 | 显示全部楼层
zhuyi 发表于 2014-10-13 15:04
对于显示和按键功能实现,有点疑问:按键功能程序和显示程序是各自单独做一个函数来实现还是在按键功能程序 ...

我用的是2 都是在keyprocess函数中实现按键状态和按键功能的,可能某些gui是采用1吧 没有深入研究gui架构

出25入84汤圆

 楼主| 发表于 2014-10-16 11:51:29 | 显示全部楼层
lize 发表于 2014-10-13 23:22
做影像的好.............像我们修检验的木有钱

都是码农

出0入4汤圆

发表于 2014-10-16 18:18:37 来自手机 | 显示全部楼层
mark。           

出0入0汤圆

发表于 2014-10-16 18:25:16 | 显示全部楼层
chun2495 发表于 2014-10-16 11:49
我用的是2 都是在keyprocess函数中实现按键状态和按键功能的,可能某些gui是采用1吧 没有深入研究gui架构 ...

所以这是我纠结的地方, 1的话如你所说,应该是gui采用的,方便单独开个任务来刷, 但大部分时候比较繁琐,但2吧有时用着很快捷方便,就是好像不是正统标准的做法

出0入0汤圆

发表于 2014-10-16 18:31:26 | 显示全部楼层
高大上地样子

出25入84汤圆

 楼主| 发表于 2014-10-17 11:19:29 | 显示全部楼层
zhuyi 发表于 2014-10-16 18:25
所以这是我纠结的地方, 1的话如你所说,应该是gui采用的,方便单独开个任务来刷, 但大部分时候比较繁琐 ...

是的,但是这样写很灵活,比如按键的弹起、按下、按下不弹起等等都可以自己写,可以深入底层操作,更利于问题出现后的查找。

出25入84汤圆

 楼主| 发表于 2014-10-17 11:20:36 | 显示全部楼层
rootxie 发表于 2014-10-14 09:16
跟之前那个貌似一样啊,有什么改进吗?说来听听

很简单 你用触摸屏的话 用第一个就很难实现

出0入0汤圆

发表于 2014-10-17 11:25:09 | 显示全部楼层
思想不错!

出0入0汤圆

发表于 2014-10-17 11:50:58 | 显示全部楼层
很简陋的消息驱动架构~

出0入0汤圆

发表于 2014-10-17 11:52:59 | 显示全部楼层
感谢分享,收藏。

出0入0汤圆

发表于 2014-10-17 11:58:15 | 显示全部楼层
感谢分享,收藏。

出0入0汤圆

发表于 2014-10-17 12:31:04 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2014-10-17 12:39:41 | 显示全部楼层
chun2495 发表于 2014-10-17 11:20
很简单 你用触摸屏的话 用第一个就很难实现

第一个也好实现啊,通过传参数,参数有类型 按键类型 触摸类型 另外还有事件类型  同时附上值即可

出0入0汤圆

发表于 2014-10-17 12:40:33 | 显示全部楼层
收藏着。。

出0入0汤圆

发表于 2014-10-17 12:57:07 | 显示全部楼层
正在用第二种

出0入0汤圆

发表于 2014-10-17 15:08:52 | 显示全部楼层
学习了,不错

出0入0汤圆

发表于 2014-10-20 06:59:34 | 显示全部楼层
这个不错,学习收藏了。

出0入0汤圆

发表于 2014-10-20 07:15:47 | 显示全部楼层
收藏学习了

出0入0汤圆

发表于 2014-10-20 07:21:25 | 显示全部楼层
不错!

出0入0汤圆

发表于 2014-10-20 08:32:19 | 显示全部楼层
学习....

出0入0汤圆

发表于 2014-10-20 15:58:59 | 显示全部楼层
灰常nice。。。。。。

出0入0汤圆

发表于 2014-10-20 19:17:21 来自手机 | 显示全部楼层
如何用ucgui来设计菜单呢?

出0入0汤圆

发表于 2014-10-23 16:31:07 | 显示全部楼层
收集  谢谢分享   

出0入0汤圆

发表于 2014-11-9 21:04:44 | 显示全部楼层
感谢分享,收藏。

出0入0汤圆

发表于 2014-11-18 08:15:18 | 显示全部楼层
收集  谢谢分享

出0入0汤圆

发表于 2014-11-18 08:22:58 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2014-11-18 08:27:36 | 显示全部楼层
很强大         

出0入0汤圆

发表于 2014-11-18 08:47:10 | 显示全部楼层
感谢分享,收藏。

出0入0汤圆

发表于 2014-11-18 16:30:48 | 显示全部楼层
收藏!!

出0入0汤圆

发表于 2014-11-18 16:56:06 | 显示全部楼层
get_coord(c);
这个函数的作用是什么?

出0入0汤圆

发表于 2014-11-18 18:46:38 | 显示全部楼层
收藏了 很实用

出0入0汤圆

发表于 2014-11-18 19:10:39 | 显示全部楼层
收藏!!!!!

出0入0汤圆

发表于 2014-11-24 13:11:40 | 显示全部楼层
楼主液晶几寸的啊

出25入84汤圆

 楼主| 发表于 2014-11-24 18:18:22 | 显示全部楼层
小乖 发表于 2014-11-24 13:11
楼主液晶几寸的啊

7寸            

出0入0汤圆

发表于 2014-11-24 18:51:31 | 显示全部楼层

用的什么MCU

出0入0汤圆

发表于 2014-11-24 21:00:29 | 显示全部楼层
医疗器械?     

出0入0汤圆

发表于 2014-11-24 21:04:26 | 显示全部楼层
这个很有必要、以前用了一个比较简单的!

出0入0汤圆

发表于 2014-11-25 08:57:42 来自手机 | 显示全部楼层
这个看着好复杂

出0入0汤圆

发表于 2014-11-25 11:39:38 | 显示全部楼层
收藏先,待日后学习

出25入84汤圆

 楼主| 发表于 2014-11-25 17:27:46 | 显示全部楼层

嗯         

出25入84汤圆

 楼主| 发表于 2014-11-25 17:29:55 | 显示全部楼层

其实就是面向对象 把界面的共有属性(绘制、按键、按键处理        draw: MainDraw,
        key_map: MainKeyMap,
    key_process: MainKeyProcess,)抽象处理,然后操作

出25入84汤圆

 楼主| 发表于 2014-11-25 17:30:33 | 显示全部楼层

niosII 软核 没有用stm32

出25入84汤圆

 楼主| 发表于 2014-11-25 17:32:11 | 显示全部楼层
fayuanye 发表于 2014-11-18 16:56
get_coord(c);
这个函数的作用是什么?

这是个IIC电容屏或者电阻屏的取点函数,扫描方式一直得到触摸坐标

出25入84汤圆

 楼主| 发表于 2014-11-25 17:33:55 | 显示全部楼层
Hearthbeats 发表于 2014-10-20 19:17
如何用ucgui来设计菜单呢?

我没用专业gui,自己做的简单gui,包括字库、绘图、等

出0入0汤圆

发表于 2014-11-25 17:58:02 | 显示全部楼层
chun2495 发表于 2014-11-25 17:33
我没用专业gui,自己做的简单gui,包括字库、绘图、等

自己做的速度快

出0入0汤圆

发表于 2014-11-25 21:16:46 | 显示全部楼层
收藏先,待日后学习

出0入0汤圆

发表于 2014-11-27 13:52:16 | 显示全部楼层
chun2495 发表于 2014-11-25 17:29
其实就是面向对象 把界面的共有属性(绘制、按键、按键处理        draw: MainDraw,
        key_map: Ma ...

哦,有时间研究一下,谢谢楼主的解答

出0入0汤圆

发表于 2014-11-29 18:32:11 | 显示全部楼层
国内能不能搞个好点的GUI出来

出0入0汤圆

发表于 2014-11-30 15:01:21 | 显示全部楼层
感觉有用,思路new

出25入84汤圆

 楼主| 发表于 2014-11-30 22:05:15 | 显示全部楼层
swap2013 发表于 2014-11-29 18:32
国内能不能搞个好点的GUI出来

x-gui还不错

出0入0汤圆

发表于 2015-1-4 20:56:37 | 显示全部楼层
看着不错,明天试试,谢了

出0入0汤圆

发表于 2015-1-6 08:22:52 来自手机 | 显示全部楼层
谢谢分享!这个非常有用。

出50入0汤圆

发表于 2015-1-6 23:01:22 来自手机 | 显示全部楼层
很实用,谢谢楼主了

出5入4汤圆

发表于 2015-1-7 16:24:43 | 显示全部楼层
先学习  留着用吧

出0入0汤圆

发表于 2015-1-8 14:07:14 | 显示全部楼层
这种方法需要几个按键啊

出25入84汤圆

 楼主| 发表于 2015-1-9 09:09:52 | 显示全部楼层
tangbo_designer 发表于 2015-1-8 14:07
这种方法需要几个按键啊

触摸屏 没有实体按键

出0入0汤圆

发表于 2015-1-9 10:06:37 | 显示全部楼层
触摸屏菜单,学习了,一直都在用第一种菜单界面,楼主的触摸屏菜单,看起来不错。

出0入0汤圆

发表于 2015-1-9 10:09:54 | 显示全部楼层
标记,学习

出0入0汤圆

发表于 2015-1-12 19:11:46 | 显示全部楼层
谢谢分享..

出0入53汤圆

发表于 2015-1-13 08:31:35 | 显示全部楼层


貌似是同行+1     

出0入0汤圆

发表于 2015-1-13 09:04:13 | 显示全部楼层
以前做过按键的多级菜单液晶屏,这次楼主的触摸屏的多级菜单学习了新思路

出0入0汤圆

发表于 2015-1-13 10:27:54 | 显示全部楼层
不错,收起!

出0入0汤圆

发表于 2015-1-13 11:34:38 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2015-1-13 11:40:27 | 显示全部楼层
收藏着 说不定什么时候用的

出0入0汤圆

发表于 2015-1-13 11:40:46 | 显示全部楼层
收藏着 说不定什么时候用到!!!

出0入0汤圆

发表于 2015-1-19 11:27:44 | 显示全部楼层
论坛里找了这么久,还是觉得楼主的这种菜单最实用(作为初级的像我这样的啊),结构清晰,增减方便,也是一种状态机的思想,在不同的页面切换,个人觉得很 不错!

出0入0汤圆

发表于 2015-1-19 11:54:23 | 显示全部楼层
留着学习。

出25入84汤圆

 楼主| 发表于 2015-1-19 16:52:15 | 显示全部楼层
liuxiaohui17 发表于 2015-1-19 11:27
论坛里找了这么久,还是觉得楼主的这种菜单最实用(作为初级的像我这样的啊),结构清晰,增减方便,也是一 ...

兄台过奖了。

出0入0汤圆

发表于 2015-2-10 07:18:55 | 显示全部楼层
感谢分享,收藏收藏,学习学习

出0入0汤圆

发表于 2015-2-10 07:36:45 | 显示全部楼层
谢谢分享。最近一个项目使用来试试效果如何。

出0入4汤圆

发表于 2015-2-10 09:02:04 | 显示全部楼层
感谢分享,过两天试一试。

出0入0汤圆

发表于 2015-2-10 09:05:37 来自手机 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2015-2-10 09:24:59 | 显示全部楼层
准备弄这个!mark!感谢楼主分享!!!

出0入4汤圆

发表于 2015-2-11 10:16:54 | 显示全部楼层
很想知道界面是用什么软件设计的

出0入0汤圆

发表于 2015-2-24 17:09:40 | 显示全部楼层
收藏起来啊看看

出0入0汤圆

发表于 2015-2-26 10:23:43 | 显示全部楼层
make ,这个必须收。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 22:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表