XMOVE3.0手持终端——软件介绍(二):在2KB内存的单片机上实现的彩屏GUI控件库

一. 综述

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

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

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

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

  它有如下特点:

  •   丰富的控件元素,应对绝大多数场景
  • 伪多线程显示(单片机是没有多线程一说的,因此在视觉上同时更新不同控件是需要一定底层支持的)
  • 动态界面(简单滑动和渐隐效果)
  • 对黑白和彩屏系统都可提供支持

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

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

  XMOVE手持终端演示视频

 

 

 硬件综述: 自制的彩屏手持动作感应终端

  软件综述:手持终端功能介绍

  软件介绍(一):精简型嵌入式系统的菜单实现和任务切换  

  软件介绍(二):在2KB内存单片机上实现的彩屏GUI控件库

  软件介绍(三):在2KB内存单片机上实现的俄罗斯方块

  软件介绍(四):在2KB内存单片机上实现的超精简五子棋算法

  软件介绍(五):在2KB内存的单片机上实现的T9中文输入法

 

二. 基本结构

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

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

  

三. 基本函数实现

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

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

/*
函数:BoxGUI(unsigned char *title)
功能:在LCD上产生覆盖屏幕的桌面
参数:无
*/
void BoxGUI(unsigned char *title)    //图形化界面窗口函数

/*
函数:TaskBoxGUI_P(u16 x1,u16 y1,u16 x2,u16 y2,u8 *title)
功能:在LCD上产生可变大小的任务底框
参数:(x1,y1)左上角坐标,(X2,Y2)右下角坐标,title为窗口标题
*/
void TaskBoxGUI_P(u16 x1,u16 y1,u16 x2,u16 y2,u8 *title,u8 MoveEN)    //图形化界面窗口函数

/*
函数:ShowMountGUI(u16 x,u16 y,float Mount,u8 Range,u16 Color,u8 Font)
功能:在LCD上显示可变位置的浮点值
参数:(x,y)数字左上角坐标值,mount要显示的浮点数,range对该数显示的长度,从左开始
Color显示颜色,Font字体类型,参见LCD使用说明
*/

void ShowMountGUI(u16 x,u16 y,float Mount,u8 Range,u16 Color,u8 Font)

/*
函数:void TaskBoxGUI(unsigned char *title)
功能:在LCD上显示固定大小和位置的任务底框
参数:tilte:显示的标题
返回值:无
*/
void TaskBoxGUI(unsigned char *title)   

/*
函数:unsigned char myListGUI(u8 x,u8 y,u8 ** list, u8 mount)
功能:在LCD上显示固定大小,可变位置的列表型菜单界面
参数:(x,y)要显示坐标,**list存储列表的指针数组,mount,要显示的列表数量,
注意不能超过数组大小
返回值:0:表示用户强行退出,1-mount:返回当前用户的选择项(注意:从1开始)
*/
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行.

  

  有任何问题,欢迎随时交流。

时间: 2025-01-30 01:17:57

XMOVE3.0手持终端——软件介绍(二):在2KB内存的单片机上实现的彩屏GUI控件库的相关文章

XMOVE3.0手持终端——软件介绍(五):在2KB内存的单片机上实现的T9中文输入法

编者注: X-MOVE是作者在业余时间于2010年6月份启动的以运动传感开发,算法和应用的平台,目前已经发展了三个版本,第四版的开发接近尾声.发布在博客园仅为交流技术,不存在商业目的,作者保留一切权利.   一. 综述      所谓T9,指的是在手机上广为流传的九宫格输入法.中文输入法大家每天都在使用,那么多大的空间才能承载一个输入法呢?搜狗安装包已经20M了,手机版本的也有2M.但我会告诉你,实现中文输入法仅需要14KB的存储空间和不到100byte的内存.虽然没有联想,并只支持拼音,但已经

XMOVE3.0手持终端——软件介绍(四):在2KB内存的单片机上实现的超精简五子棋对战算法(原创)

一. 综述 这是我两年前完成的一个小项目,它基于我开发的XMOVE动作感应系统平台.五子棋算法网上随便一搜到处都是,不过值得自豪的是,我在2KB内存的单片机上不仅跑上了我自制的嵌入式OS,还能同时跑五子棋.这是界面截图:  以下是它的功能和特性: 内存占用极低,约600byte 执行一次迭代过程,算法在初级水平(同学,这是单片机,不是电脑!) 在8MHz的MSP430上算法执行时间不超过0.3s 支持人机对战,双人对战和无线对战(通过NRF24L01实现) 代码精简 嵌入式彩屏GUI实现 支持陀

XMOVE3.0手持终端——软件介绍(三):在2KB内存的单片机上实现的的俄罗斯方块 (原创)

一. 综述 这也是我两年前完成的小项目,它基于我开发的XMOVE动作感应系统平台.    与XMOVE手持终端相关的介绍文章列表如下: 硬件综述: 自制的彩屏手持动作感应终端 软件综述:手持终端功能介绍 软件介绍(一):精简型嵌入式系统的菜单实现和任务切换 软件介绍(二):在2KB内存单片机上实现的彩屏GUI控件库 软件介绍(三):在2KB内存单片机上实现的俄罗斯方块 软件介绍(四):在2KB内存单片机上实现的超精简五子棋算法 软件介绍(五):在2KB内存的单片机上实现的T9中文输入法 相对于五

XMOVE3.0手持终端——软件介绍(一):精简型嵌入式管理系统的菜单实现和任务切换

编者注: X-MOVE是作者在业余时间于2010年6月份启动的以运动传感开发,算法和应用的平台,目前已经发展了三个版本,第四版的开发接近尾声.发布在博客园仅为交流技术,不存在商业目的,作者保留一切权利.        一. 综述和废话 本系统是我的XMOVE动作感应系统框架的嵌入式实现部分. 一提到OS一般都会被人喷.OS是何等庞大的东西,区区小辈凭什么敢把自己的几百行代码称之为OS?叫做框架都不行!  有句话叫简单就是美.方便移植,使用简单的c语言框架,在单片机上再合适不过了. 想象一下,一个

XMOVE3.0手持终端——综述:软硬件全部自行开发的彩屏体感控制器

编者注: X-MOVE是作者在业余时间于2010年6月份启动的以运动传感开发,算法和应用的平台,目前已经发展了三个版本,第四版的开发接近尾声.发布在博客园仅为交流技术,不存在商业目的,作者保留一切权利.   一. 综述 乔布斯曾经说过:做软件的人应该也制造属于自己的硬件. 不觉得每天给电脑,手机开发程序很不爽么? 为什么总是要"给别人打工",用别人的SDK? 小时候特别羡慕有文曲星的同学,也特别梦想自己做一个. 在大四这个理想也成为了现实. 我启动了我自己的体感项目XMOVE的2.0版

link环境下制作一款《订餐软件》,想显示一个界面显示订餐时段,请问用什么控件?

问题描述 link环境下制作一款<订餐软件>,想显示一个界面显示订餐时段,请问用什么控件? link环境下制作一款<订餐软件>,想显示一个界面显示订餐时段,请问用什么控件? 解决方案 可以使用datagridview或者甘特图控件都是可以的.

jeasyui 0.0.1-Beta发布,EasyUI for JSP控件库

jeasyui 0.0.1-bate 首次发布 jeasyui项目是对Easyui控件库的JSP封装,将easyui组件封装成JSP标签库.简化easyui的使用难度,学习成本,更少的代码量.友好的IDE提示,类似JSF,Asp控件的写法,提供了相对统一的事件处理机制.直接通过jsp中的java对象绑定数据到控件. 文章转载自 开源中国社区 [http://www.oschina.net]

asp.net2.0中如何动态增加删除表格,在增加表格的同时能增加下拉列表控件?在线等

问题描述 asp.net2.0中如何动态增加删除表格,在增加表格的同时,表格中增加下拉列表控件>该如何实施?谢谢! 解决方案 解决方案二:昨晚天刚用JS写一个,给个参考吧-----------<scripttype="text/javascript">//印刷机组信息varmachineStr='<%=machineStr%>';//可开计划的产品编号和名称信息varproductionStr='<%=productionStr%>';//将印

Lucene.Net 2.3.1开发介绍 —— 二、分词(一)

原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(一) Lucene.Net中,分词是核心库之一,当然,也可以将它独立出来.目前Lucene.Net的分词库很不完善,实际应用价值不高.唯一能用在实际场合的StandardAnalyzer类,效果也不是很好.内置在Lucene.Net里的分词都被放在项目的Analysis目录下,也就是Lucene.Net.Analysis命名空间下.分词类的命名一般都是以"Analyzer"结束,比如StandardAnalyzer,Sto