当前位置:首页 > 单片机 > 单片机
[导读]GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是可以通过窗口、菜单、按键等方式进行操作。在某些场合,设计一款人机界面丰富友好的嵌入式产品能赢得更多的用户。笔者此处就s

GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是可以通过窗口、菜单、按键等方式进行操作。在某些场合,设计一款人机界面丰富友好的嵌入式产品能赢得更多的用户。笔者此处就s3c2416基于UCGUI图形用户界面的使用作一个简单的介绍。

1. 代码准备

UCGUI 3.98源码,这个版本的UCGUI是开放源码的最高版本,之后版本只提供库文件,不再开源。笔者以UCGUI 3.98这个版本移植作为讲解,请读者自行下载UCGUI3.98的版本,其它版本文件命名有些不一致。关于UCGUI概述、使用、移植等详细内容,可以直接阅读UCGUI用户手册。

s3c2416启动代码工程,启动代码是s3c2416/50/51这系列arm9芯片在运行用户c代码main函数之前必须先运行的代码,启动代码支持sd、Nand启动,为用户设置系统时钟,初始化内存,自动识别启动设备并搬移代码到RAM,MMU映射,中断管理等,用户只需专注于用c开发其它功能函数即可。关于启动代码以及启动代码的实现过程,笔者前面章节有非常详细的介绍。此处以GCC下移植UCGUI为讲解,下载”GCC启动代码工程应用实例”中的启动代码源码即可。如果在MDK下开发,下载”MDK启动代码工程应用实例”中的启动代码源码,MDK下开发设置均比较简单,不再细分MDK下UCGUI的移植。

用户代码,用c开发的所有功能代码,其中,用户代码入口为main()函数,在这里实现LCD屏、触摸屏的模块驱动以支持UCGUI显示以及触控。

2. 工程搭建

在linux操作系统下任一路径下新建一个UCGUI的工程目录,下载UCGUI 3.98源码并解压,把Start目录下的GUI、Config这两个目录拷贝到UCGUI目录中,GUI目录下为UCGUI源码实现,Config目录下包括GUI、LCD、触摸屏的配置文件。再把Sample目录下GUIDemo这个目录拷贝到UCGUI目录中,GUIDemo为micrium公司编写的测试代码,用以告诉用户UCGUI可以怎样应用。拷贝Sample->GUI_X下GUI_X.c和GUI_X_Touch.c这两个代码文件到UCGUI目录下的GUI_X目录中,GUI_X.c为GUI与系统相关的扩展部分,如实现延时,不涉及到操作系统。GUI_X_Touch.c为GUI支持触屏实现的接口部分。

把启用代码目录start_code拷贝到UCGUI目录下,这部分代码无需任何的修改。并保留其中的Makefile这些文件。GCC启动代码下的工程管理Makefile提取自uboot,可以方便地增加源代码以及代码目录。

在UCGUI目录下新建apps目录,用来保存应用相关的源码。

最终的UCGUI目录内容如下:

图2-1 linux操作系统下UCGUI目录内容

3. 修改UCGUI

UCGUI要用到LCD以及触摸屏,需要根据我们实际的屏以及触摸屏进行配置以及接口调用。

3.1. Config目录

进入Config目录,打开GUIConf.h对GUI进行总体的配置,由于内存充足,可以设置较大的动态内存以及支持内存设备,此处并不支持操作系统以及鼠标。修改后的内容如下:

#ifndef GUICONF_H

#define GUICONF_H

#define GUI_OS (0) /* 不支持多任务 */

#defineGUI_SUPPORT_TOUCH (1) /* Support a touch screen (req. win-manager)*/

#defineGUI_SUPPORT_MOUSE (0) /* 不支持鼠标 */

#defineGUI_SUPPORT_UNICODE (1) /* Support mixed ASCII/UNICODE strings */

#defineGUI_DEFAULT_FONT &GUI_Font6x8

#defineGUI_ALLOC_SIZE(1024*1024) /* 动态内存1M*/

/*********************************************************************

*

* Configuration of available packages

*/

#defineGUI_WINSUPPORT 1 /* Window manager package available */

#defineGUI_SUPPORT_MEMDEV 1 /* Memory devices available */

#defineGUI_SUPPORT_AA 1 /* Anti aliasing available */

#endif /* Avoidmultiple inclusion */

打开LCDConf.h对LCD进行配置,笔者使用的是16位(R:5-G:6-B:5)色深800*480的RGB屏,清空LCDConf.h中的所有内容,因为这是其它LCD屏的配置,与所用屏完全不一致,修改后的内容如下:

#ifndef LCDCONF_H

#define LCDCONF_H

/*********************************************************************

* Generalconfiguration of LCD

**********************************************************************

*/

#define LCD_XSIZE (800) /* 屏X水平像素点 */

#define LCD_YSIZE (480) /* 屏Y水平像素点 */

#define LCD_BITSPERPIXEL (16) /* 16位色深*/

#define LCD_CONTROLLER (-1) /* 宏开关,使用LCDDriver下的模板 */

#define LCD_FIXEDPALETTE (565) /* R:5-G:6-B:5 */

#define LCD_SWAP_RB (1) /*RB颜色调换 */

#define LCD_SWAP_XY (0) /* 屏x,y方向不调换 */

#define LCD_INIT_CONTROLLER()LCD_RGB_Init() /* 屏驱动初始化接口 */

#endif /* LCDCONF_H */

打开GUITouchConf.h对触摸屏进行配置,笔者使用的是电容屏,驱动IC已处理好返回的触摸坐标值与屏像素坐标一一对应,也可以在移植后进行校准。

#ifndefGUITOUCH_CONF_H

#defineGUITOUCH_CONF_H

#defineGUI_TOUCH_AD_LEFT 0 /* 触摸屏能返回最左边的值 */

#defineGUI_TOUCH_AD_RIGHT 800 /* 触摸屏能返回最右边的值 */

#defineGUI_TOUCH_AD_TOP 0 /* 触摸屏能返回最上面的值 */

#defineGUI_TOUCH_AD_BOTTOM 480 /* 触摸屏能返回最下面的值 */

#defineGUI_TOUCH_SWAP_XY 0 /* 触摸屏x,y方向不调换 */

#defineGUI_TOUCH_MIRROR_X 0 /* 触摸屏x方向不镜像调换*/

#defineGUI_TOUCH_MIRROR_Y 0 /* 触摸屏y方向不镜像调换*/

#endif /* GUITOUCH_CONF_H */

3.2. LCDDriver目录

进入GUI->LCDDriver目录,需修改UCGUI关于实际LCD的底层接口调用。由于我们在LCDConf.h里配置LCD_CONTROLLER为-1,这个宏开关会选择LCDTemplate.c这个模板文件进行编译,其它的接口文件不会被编译。LCDTemplate.c里面已经有相关的模板代码,只需加入LCD_L0_SetPixelIndex()和LCD_L0_GetPixelIndex()的实现即可,LCD_L0_SetPixelIndex设置LCD某一坐标的像素值,LCD_L0_GetPixelIndex从LCD某一坐标读出像素值,分别对应RGB屏驱动模块底层函数LCD_SetPixel()和LCD_GetPixel()。加入这两个模块中的底层函数即可。

LCD_L0_SetPixelIndex()修改后代码如下:

void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) {

GUI_USE_PARA(x);

GUI_USE_PARA(y);

GUI_USE_PARA(PixelIndex);

/* Convert logical into physicalcoordinates (Dep. on LCDConf.h) */

#if LCD_SWAP_XY " LCD_MIRROR_X|LCD_MIRROR_Y

int xPhys = LOG2PHYS_X(x, y);

int yPhys = LOG2PHYS_Y(x, y);

#else

#define xPhys x

#define yPhys y

#endif

/* Write into hardware ... Adapt toyour system */

{

LCD_SetPixel(x,y, (unsigned short)PixelIndex);

}

}

LCD_L0_GetPixelIndex()修改后的代码如下:

unsigned int LCD_L0_GetPixelIndex(int x, int y) {

LCD_PIXELINDEX PixelIndex;

GUI_USE_PARA(x);

GUI_USE_PARA(y);

/* Convert logical into physicalcoordinates (Dep. on LCDConf.h) */

#if LCD_SWAP_XY | LCD_MIRROR_X|LCD_MIRROR_Y

int xPhys = LOG2PHYS_X(x, y);

int yPhys = LOG2PHYS_Y(x, y);

#else

#define xPhys x

#define yPhys y

#endif

/* Read from hardware ... Adapt toyour system */

{

PixelIndex =(LCD_PIXELINDEX)(LCD_GetPixel(x, y));

}

return PixelIndex;

}

LCDTemplate.c是UCGUI最底层的接口实现,将直接访问LCD,因此这些接口函数往往需要根据LCD屏的特点重新改写,以达到最好的访问速度。例如LCD_L0_DrawVLine画坚线函数、LCD_L0_FillRect矩形填充函数等,模板的实现是调用LCD_L0_SetPixelIndex一个点一个点地写屏,这对于i80接口的LCD是致命的,因为每个点的访问都是需要先写命令、地址,最后才是数据,屏访问速度会非常慢,因此应改写为连续写方式,即写入连续写命令后再连续送出数据。为进一步提高UCGUI访问LCD的性能,通过减小函数嵌套调用的层次,减小不必要的底层代码,甚至汇编实现等都可以尝试。由于笔者采用的是RGB屏,屏显存在主系统内存区,对屏的访问实际是对显存的访问,UCGUI其它接口函数采用模板默认的实现函数也不会造成性能的明显变差,其它接口函数不再改写优化。

最后在LCDTemplate.c中加入LCD驱动接口访问的模块头文件#include “lcd_rgb.h”即可。

3.3. GUI_X目录

GUI_X目录下保存了UCGUI扩展部分,GUI_X.c无需操作系统的支持,只需要系统时间O

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭