完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
在资源较匮乏的嵌入式系统上,无法运行操作系统,此种情形下,通过按键控制LCD界面的切换时,若不采取一定的逻辑框架,在需求变动时,程序逻辑改动较大。页面逐渐增多时,前期若未设计好框架通过性,后期发动成本和难度呈指数级别上升,这时介绍一种较通用的界面切换框架,在需求改动时,只要更改数组中的部分变量值便可满达到要求。
以我之前做完的一个产品为例该产品有一块小屏幕,显示系统信息,以数字和图片的方式显示,外部按键有上、下、左、右、确定、返回六个。界面部分包括主界面和内部菜单,内部菜单最深为三级。开始只能确定部分内部菜单,剩下需要后期根据实际使用情况再确定。设计一种类似于查表的方式,确定相应按键按下后需要切换至的页面。 流程非常简单,代码逻辑也很简单,把主要工作都放在页面切换的数据结构体中了。核心代码如下: typedef void (*pfn_page)(); Int g_curPage = PAGE_MAIN; struct sPAGE_SWITCH { int iCurPageIndex;//当前显示页面 int iKeyIndex;//接收到的按键 pfn_page fnNewPage;//将要切换至的页面 }; const sPAGE_SWITCH s_page_info[] = {//以主页面为例 {PAGE_MAIN, KEY_UP, page_1}, {PAGE_MAIN, KEY_DOWN, page_2}, {PAGE_MAIN, KEY_LEFT, page_3}, {PAGE_MAIN, KEY_RIGHT, page_4}, {PAGE_MAIN, KEY_ESC, page_5}, {PAGE_MAIN, KEY_ENTER, page_6}, ... }; //页面切换函数,两个参数分别为当前页面与按键编号 void switch_page(int cur_page, int key_index) { for(int i = 0; i < array_num(s_page_info); i++) { if(cur_page == s_page_info.iCurPageIndex && key_index == s_page_info.iKeyIndex) { s_page_info.fnNewPage(); break; } } } //页面响应函数 void page_1() { ...一些显示页面信息的操作 g_curPage = PAGE_1; } 由当前页面,按键的编号,可以惟一确定将要切换至的页面。结构体数组中存储了所有页面在按下按键消息后,页面切换信息。如果系统有20个页面和6个按键,则结构体数组最多情况下会有20*6=120个成员。 页面切换函数在按键消息发生后被调用,函数从结构体数组中查找该切换到哪个页面,并执行相应的切换函数,自动完成页面切换。 本种方式实现的切换优势在增加、减少页面、修改页面切换顺序或机制后,不需要修改任何代码,只修改结构体数组的信息即可。可以很好应对需求变更,具有较好的通用性。 |
|
|
|
只有小组成员才能发言,加入小组>>
692 浏览 0 评论
1106 浏览 1 评论
2473 浏览 5 评论
2808 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2646 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
653浏览 9评论
649浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
781浏览 6评论
628浏览 5评论
668浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:44 , Processed in 0.990020 second(s), Total 78, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号