液晶多级菜单实现加强版
最近有位兄台写了篇 单片机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;
下面是按键识别:
#defineUP 0 //按键弹起
#defineDOWN 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={0};
unsigned int TouchStatus = DOWN;
get_coord(c);
if(c && !send)
{
X = c;
Y = c;
TouchStatus = DOWN;
}
if(!c)
{
X = c;
Y =c;
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);
}
}
最后贴两张界面照片
和之前那个有什么区别优势呢? 收藏着。。 不太明白 不太明白 能不能贴个demo出来其实我也有一种架构做的菜单响应速度可占用资源极少 mark!{:victory:} 这个B超机的界面啊,楼主是从事医疗电子的 blade_li 发表于 2014-10-12 18:58
这个B超机的界面啊,楼主是从事医疗电子的
貌似是同行 B超机....做医疗的?.... lize 发表于 2014-10-12 22:24
B超机....做医疗的?....
√ B超机. 好帖 比较经典的菜单结构。
感觉涉及到菜单中的数据设置,写起来很烦人。 本帖最后由 zhuyi 于 2014-10-13 15:09 编辑
对于显示和按键功能实现,有点疑问:按键功能程序和显示程序是各自单独做一个函数来实现还是在按键功能程序里面也同时刷新显示比较好呢?
(1):
{
KeyEvent();
....
.....
DispEvent():
....
}
(2):
{
KeyEvent():
....
}
keyEvent()
{
DispEvent();
...
}
(1),(2)这两种哪种更通用更合理, 不知有显示界面的系统是哪种方式,还有游戏也是,有谁能说说吗 做影像的好.............像我们修检验的木有钱{:cry:} 谢谢分享 {:victory:}{:victory:}{:victory:} 谢谢分享。
一直都是用的第一种的方法写的菜单,很方便,能写N多层也能很方便的在各个菜单界面跳转。
正好准备用触摸屏了,楼主给个第二种菜单结构的demo吧。谢谢! 感谢分享,收藏。 多谢楼主分享。 mark,这种结构设计菜单很方便,以前在51里就这样弄,不过比较消耗flash空间 谢谢分享,mark~~ 跟之前那个貌似一样啊,有什么改进吗?说来听听 mark慢慢研究 zhuyi 发表于 2014-10-13 15:04
对于显示和按键功能实现,有点疑问:按键功能程序和显示程序是各自单独做一个函数来实现还是在按键功能程序 ...
我用的是2 都是在keyprocess函数中实现按键状态和按键功能的,可能某些gui是采用1吧 没有深入研究gui架构 lize 发表于 2014-10-13 23:22
做影像的好.............像我们修检验的木有钱
都是码农 mark。 chun2495 发表于 2014-10-16 11:49
我用的是2 都是在keyprocess函数中实现按键状态和按键功能的,可能某些gui是采用1吧 没有深入研究gui架构 ...
所以这是我纠结的地方, 1的话如你所说,应该是gui采用的,方便单独开个任务来刷, 但大部分时候比较繁琐,但2吧有时用着很快捷方便,就是好像不是正统标准的做法 高大上地样子 zhuyi 发表于 2014-10-16 18:25
所以这是我纠结的地方, 1的话如你所说,应该是gui采用的,方便单独开个任务来刷, 但大部分时候比较繁琐 ...
是的,但是这样写很灵活,比如按键的弹起、按下、按下不弹起等等都可以自己写,可以深入底层操作,更利于问题出现后的查找。 rootxie 发表于 2014-10-14 09:16
跟之前那个貌似一样啊,有什么改进吗?说来听听
很简单 你用触摸屏的话 用第一个就很难实现 思想不错! 很简陋的消息驱动架构~ 感谢分享,收藏。 感谢分享,收藏。 学习一下 chun2495 发表于 2014-10-17 11:20
很简单 你用触摸屏的话 用第一个就很难实现
第一个也好实现啊,通过传参数,参数有类型 按键类型 触摸类型 另外还有事件类型同时附上值即可 收藏着。。 正在用第二种 学习了,不错 这个不错,学习收藏了。 收藏学习了 不错!{:lol:} 学习.... 灰常nice。。。。。。 如何用ucgui来设计菜单呢? 收集谢谢分享 感谢分享,收藏。 收集谢谢分享 谢谢分享 很强大 感谢分享,收藏。 收藏!! get_coord(c);
这个函数的作用是什么? 收藏了 很实用 收藏!!!!! 楼主液晶几寸的啊 小乖 发表于 2014-11-24 13:11
楼主液晶几寸的啊
7寸 chun2495 发表于 2014-11-24 18:18
7寸
用的什么MCU 医疗器械? 这个很有必要、以前用了一个比较简单的! 这个看着好复杂 收藏先,待日后学习 suda2008wuli 发表于 2014-11-24 21:00
医疗器械?
嗯 与狼共舞 发表于 2014-11-25 08:57
这个看着好复杂
其实就是面向对象 把界面的共有属性(绘制、按键、按键处理 draw: MainDraw,
key_map: MainKeyMap,
key_process: MainKeyProcess,)抽象处理,然后操作 小乖 发表于 2014-11-24 18:51
用的什么MCU
niosII 软核 没有用stm32 fayuanye 发表于 2014-11-18 16:56
get_coord(c);
这个函数的作用是什么?
这是个IIC电容屏或者电阻屏的取点函数,扫描方式一直得到触摸坐标 Hearthbeats 发表于 2014-10-20 19:17
如何用ucgui来设计菜单呢?
我没用专业gui,自己做的简单gui,包括字库、绘图、等 chun2495 发表于 2014-11-25 17:33
我没用专业gui,自己做的简单gui,包括字库、绘图、等
自己做的速度快 收藏先,待日后学习 chun2495 发表于 2014-11-25 17:29
其实就是面向对象 把界面的共有属性(绘制、按键、按键处理 draw: MainDraw,
key_map: Ma ...
哦,有时间研究一下,谢谢楼主的解答 国内能不能搞个好点的GUI出来 感觉有用,思路new swap2013 发表于 2014-11-29 18:32
国内能不能搞个好点的GUI出来
x-gui还不错 看着不错,明天试试,谢了 谢谢分享!这个非常有用。 很实用,谢谢楼主了 先学习留着用吧 这种方法需要几个按键啊 tangbo_designer 发表于 2015-1-8 14:07
这种方法需要几个按键啊
触摸屏 没有实体按键 触摸屏菜单,学习了,一直都在用第一种菜单界面,楼主的触摸屏菜单,看起来不错。 标记,学习 谢谢分享.. chun2495 发表于 2014-10-12 20:13
貌似是同行
貌似是同行+1 以前做过按键的多级菜单液晶屏,这次楼主的触摸屏的多级菜单学习了新思路 不错,收起! 谢谢楼主分享 收藏着 说不定什么时候用的 收藏着 说不定什么时候用到!!! 论坛里找了这么久,还是觉得楼主的这种菜单最实用(作为初级的像我这样的啊),结构清晰,增减方便,也是一种状态机的思想,在不同的页面切换,个人觉得很 不错! 留着学习。 liuxiaohui17 发表于 2015-1-19 11:27
论坛里找了这么久,还是觉得楼主的这种菜单最实用(作为初级的像我这样的啊),结构清晰,增减方便,也是一 ...
兄台过奖了。 感谢分享,收藏收藏,学习学习 谢谢分享。最近一个项目使用来试试效果如何。 感谢分享,过两天试一试。 谢谢分享 准备弄这个!mark!感谢楼主分享!!! 很想知道界面是用什么软件设计的 收藏起来啊看看 make ,这个必须收。。。
页:
[1]
2