MyException - 我的异常网
当前位置:我的异常网» 单片机 » 2KB内存储器单片机上实现彩屏GUI控件库

2KB内存储器单片机上实现彩屏GUI控件库

www.MyException.Cn  网友分享于:2013-09-29  浏览:3次
2KB内存单片机上实现彩屏GUI控件库

一. 综述

嵌入式系统发展日新月异,安卓和ios已然战胜了当年雄霸天下的塞班,界面是我们特别看重的因素之一。不过你考虑过自己做一套系统,写一个界面库么?在单片机上自制系统,可以很好的锻炼编程能力和架构设计能力。

这些界面库都是在底层画点画线的驱动程序上实现的,基于我的XMOVE动作感应系统。基本具有硬件无关性。支持彩屏320*240的分辨率,由于考虑不同分辨率的开发过分复杂(想想看你需要计算每个点布局在哪个位置,这对安卓等系统都是大问题),因此我并没有太过完善的考虑过其他分辨率。

我已经写过一篇关于菜单切换和任务实现的文章,本文将介绍我在低内存嵌入式系统上实现的界面GUI库。当年开发这套界面花费了大量的时间,不过搭载这些界面库和系统的硬件数量不超过3台,真是应了那句话:封闭的道路是难以求得长远的发展的。不过,嵌入式的环境下,定制化和特别化也非常正常。玩么,有什么不可以?!

虽然功能依旧有限,不能像目前主流嵌入式系统的"美观":如渐变等,但这是2KB,8MHz的单片机!根本不能实现快速移动,否则会很卡很卡....各种图片和特效都是我在大四寒假里花了大量时间反复优化的,现在看看,当年的很多工作,如果不拿出来,真的要彻底走入历史的垃圾筐了。小伤感。

它有如下特点:

  • 丰富的控件元素,应对绝大多数场景

  • 伪多线程显示(单片机是没有多线程一说的,因此在视觉上同时更新不同控件是需要一定底层支持的)

  • 动态界面(简单滑动和渐隐效果)

  • 对黑白和彩屏系统都可提供支持

如果是开发嵌入式界面的同仁,我相信我的文章会给您以一定的启发。

下面的视频演示了动态的效果:

XMOVE手持终端演示视频

二. 基本结构

可以用如下的结构图表示整个控件库:

通过控件组合,可以实现相当复杂的界面显示,如下图所示:

三. 基本函数实现

考虑到底层驱动并不具有普遍性,我没有给出底层驱动的接口实现。

下面的函数给出了一部分GUI基本功能库的功能函数。

  1. /* 
  2. 函数:BoxGUI(unsigned char *title)  
  3. 功能:在LCD上产生覆盖屏幕的桌面 
  4. 参数:无 
  5. */ 
  6. void BoxGUI(unsigned char *title)    //图形化界面窗口函数 
  7.  
  8.  
  9. /* 
  10. 函数:TaskBoxGUI_P(u16 x1,u16 y1,u16 x2,u16 y2,u8 *title) 
  11. 功能:在LCD上产生可变大小的任务底框 
  12. 参数:(x1,y1)左上角坐标,(X2,Y2)右下角坐标,title为窗口标题 
  13. */ 
  14. void TaskBoxGUI_P(u16 x1,u16 y1,u16 x2,u16 y2,u8 *title,u8 MoveEN)    //图形化界面窗口函数 
  15.  
  16.  
  17. /* 
  18. 函数:ShowMountGUI(u16 x,u16 y,float Mount,u8 Range,u16 Color,u8 Font) 
  19. 功能:在LCD上显示可变位置的浮点值 
  20. 参数:(x,y)数字左上角坐标值,mount要显示的浮点数,range对该数显示的长度,从左开始 
  21. Color显示颜色,Font字体类型,参见LCD使用说明 
  22. */ 
  23.  
  24. void ShowMountGUI(u16 x,u16 y,float Mount,u8 Range,u16 Color,u8 Font) 
  25.  
  26. /* 
  27. 函数:void TaskBoxGUI(unsigned char *title)   
  28. 功能:在LCD上显示固定大小和位置的任务底框 
  29. 参数:tilte:显示的标题 
  30. 返回值:无 
  31. */ 
  32. void TaskBoxGUI(unsigned char *title)   
  33.  
  34. /* 
  35. 函数:unsigned char myListGUI(u8 x,u8 y,u8 ** list, u8 mount) 
  36. 功能:在LCD上显示固定大小,可变位置的列表型菜单界面 
  37. 参数:(x,y)要显示坐标,**list存储列表的指针数组,mount,要显示的列表数量, 
  38. 注意不能超过数组大小 
  39. 返回值:0:表示用户强行退出,1-mount:返回当前用户的选择项(注意:从1开始) 
  40. */ 
  41. unsigned char myListGUI(u8 x,u8 y,u8 ** list,u8 *title, u8 MaxMount,u8 LRMaxMount,u8 UDMaxMount,u8 OneLRLength,u8 OneUDLength) 

三. 实际效果展示

1. 对话框功能:

复制代码

/*
函数:unsigned char MessageGui(unsigned char *title,unsigned char *message,unsigned char Type)
功能:在LCD上显示固定大小的是非型选择界面
参数:*title要显示的标题,message:要显示的信息,Type:显示风格 0:仅有确定项,用于提示,1:有是否两个选项,2:不经确认的提示项
返回值:1:用户选择是,0,用户选择否,若Type==0或2,返回值为1
*/
unsigned char MessageGui(unsigned char *title,unsigned char *message,unsigned char Type)

复制代码

2. 列表控件

用户可通过旋转该终端选取不同项(需陀螺仪支持)

复制代码

/*
函数:unsigned char ListGUI(unsigned char** list,unsigned char *title,unsigned char mount)
功能:在LCD上显示固定大小和固定位置(在LCD中央)的列表型菜单界面
参数:参见myListGUI()的函数声明
返回值:参见myListGUI()的函数声明
*/
unsigned char ListGUI(unsigned char** list,unsigned char *title,unsigned char mount)

复制代码

3. 动态曲线控件

该曲线使用了我自己开发的伪多线程技术,多条曲线可以动态显示.本图显示了三轴加速度曲线实时显示

/*
函数:void CurveDraw(u16 x,u16 y,u16 Wide,u16 Long,u16 unit,u16 Color,u8 *title,float mount,u16 flag)
功能:LCD显示曲线控件的图形函数
参数:(x,y)要显示的控件左上角坐标,Wide表示控件宽度(上下计算,像素),LONG:长度(左右计算,像素),Unit:最大可显示的值,COLOR:要显示的颜色
title:显示的标题,float:显示浮点值,flag:显示的位置标记位,当flag==0的时候,控件全部刷新
返回值:1:显示成功 0.显示失败
*/
u8 CurveDraw(u16 x,u16 y,u16 Wide,u16 Long,u16 unit,u16 Color,u8 *title,float mount,u16 flag)

4. 虚拟全键盘控件

我的系统仅仅提供了6个实体按键,为了解决复杂键盘输入的问题,使用了虚拟全键盘控件。可以通过旋转改变界面中红框的位置~当红框移到虚拟按键上时,点选确定即可上屏.

/*
函数:u8 VirtualFullKeyBoardInput(u16 x,u16 y,u8* KeyX,u8* KeyY,u8 *Key)
功能:虚拟全键盘的输入子函数
参数:(x,y)控件左上角坐标,KeyX,KeyY表示当前在数字键盘上的X,Y坐标位置,范围分别为0-10,0-4,Key为返回的选择项,具体参见FullKeyBoardData[]数组声明
返回值:0:用户跳出或选择特殊功能键,1:用户选择了普通的字符,其用法参见具体代码
*/

u8 VirtualFullKeyBoardInput(u16 x,u16 y,u8* KeyX,u8* KeyY,u8 *Key)

5. 图表控件

显示柱状图,随着菜单项的数量和大小,动态的修改柱状图的位置,以获得最佳显示效果.

/*
函数:u8 HistogramGUI(u8** List,u16* Num,u8 num,u8* title)
功能:显示柱状图控件
参数:List,存储不同享标题的数组,Num存储不同项的数值的数组,num要显示的项的数量,title控件标题
返回值:0:两数字不同,1:数据相同,
*/
u8 HistogramGUI(u8** List,u16* Num,u8 num,u8* title)

6. 滑动条控件

可用于用户通过移动滑动手柄位置修改值.

/*
函数:u8 SliderGUI(u16 x,u16 y,u16 Length,u8* title,u16 RangeLow,u16 RangeHigh,u8 step,u16* Data)
功能:滑动模式的数值选择控件
参数:(x,y)控件左上角坐标,length,显示的控件长度(从左到右),RangeLow:数值最低可选值,RangeHigh:数值最高可选值,step:数据选择步进,data:存储数据的指针
返回值:0:控件错误或用户取消选择,1:用户成功使用控件,数据存在data中
*/
u8 SliderGUI(u16 x,u16 y,u16 Length,u8* title,u16 RangeLow,u16 RangeHigh,u8 step,u16* Data)

7. 时间表显示控件

/*
函数:void clock_GUI(u16 x,u16 y,u16 r,u8 *rdata,u8 TotalFreshEN)
功能:LCD显示时间的时钟控件
参数:(x,y)要显示的控件左上角坐标,rdata表示存储时间的全局变量指针,r表示圆面半径,注意不要超过LCD允许范围
返回值:无
*/
void clock_GUI(u16 x,u16 y,u16 r,u8 *rdata,u8 TotalFreshEN)

8. 长整型数字输入控件

9. 主菜单显示控件

     系统目前支持多种菜单样式,下面的图给出了其中两种:

/*
函数:void DrawIconAndTitle(u16 x,u16 y,u8 Index, u8 PictSize,u8 Type,u8 TitleOrPict)
功能:主菜单界面的子函数,用于产生单项
参数:(x,y)要显示的控件左上角坐标,Index表示在子菜单列表中的具体位置,PictSize为要显示的图片大小,TYPE为反白选项0不反白,1反白,TitleOrPict控制来写字或画图,这样可以更快
返回值:无
*/
void DrawIconAndTitle(u16 x,u16 y,u8 Index, u8 PictSize,u8 Type,u8 TitleOrPict)

 和以下菜单样式:

其他控件由于已经在其他相关文章中出现,因此省略.

四.总结

本文展示的界面控件仅仅是其中很小的一部分.其他还包括了密码输入控件,中文输入法控件等,限于空间所限没有一一显示.这是当年热火加蛋疼的大四,在没有代码提示和简陋IDE下一行一行的写出来的代码库.这套界面库的代码量约为3000行.

1楼wuxianglonghaohao昨天 11:08
请问博主,这套GUI是完全自己书写的,还是有所参考

文章评论

如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员的鄙视链
程序员的鄙视链
10个调试和排错的小建议
10个调试和排错的小建议
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
老程序员的下场
老程序员的下场
Java程序员必看电影
Java程序员必看电影
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
编程语言是女人
编程语言是女人
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
鲜为人知的编程真相
鲜为人知的编程真相
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
如何成为一名黑客
如何成为一名黑客
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
为什么程序员都是夜猫子
为什么程序员都是夜猫子
那些争议最大的编程观点
那些争议最大的编程观点
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
我的丈夫是个程序员
我的丈夫是个程序员
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员都该阅读的书
程序员都该阅读的书
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员应该关注的一些事儿
程序员应该关注的一些事儿
中美印日四国程序员比较
中美印日四国程序员比较
每天工作4小时的程序员
每天工作4小时的程序员
我是如何打败拖延症的
我是如何打败拖延症的
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
总结2014中国互联网十大段子
总结2014中国互联网十大段子
 程序员的样子
程序员的样子
程序员必看的十大电影
程序员必看的十大电影
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有