ucGUI移植笔记-完善版
GUI的种类及uCGUI的架构
GUI的种类及uCGUI的架构(说明:本博文转载自他人笔下,希望可以帮助同僚更深刻的认识GUI)GUI的种类及uC/GUI的架构一. GUI概述GUI(Graphic User Interface)是图形化的用户界面,它能提供友好的人机交互接口。
它有以下特性:体积小,运行时耗用系统资源少,层次化的结构,易移植,可靠性高嵌入式GUI种类嵌入式GUI种类有很多,下面列举几种:1. WINCE的GWES(图形、窗口、事件子系统),由应用程序接口(API)、用户接口(UI)和图形设备接口(GDI)组成,包含了消息机制2. Trolltech公司的产品:QT、QTE、QTOPIA,它们跨平台、功能强大,但资源消耗多3.MINIGUI是魏永明创建的嵌入式GUI中间件,可以以多线程、多进程、以及单任务运行,是比较成熟的商用系统4.ucGUI能支持多种环境的GUI,可以以多任务形式运行或者以前后台模式运行。
商用化,但功能相对简单GUI的两种模式:1. Windows模式,采用类似windows的API和相应的消息机制,如ucGUI、MicroWindows、miniGUI2.C/S模式,采用一个XServer,所有的显示都以客户端的形式请求服务,如Nano-XGUI在嵌入式系统或实时系统中的地位越来越多的市场需求数据显示,包括PDA、娱乐消费电子、机顶盒、DVD等影音设备、WAP 手机等高端电子产品得到广泛应用,原先仅在军工、工业控制等领域中使用的GUI图形系统,受到越来越多的关注。
对于轻量级 GUI 的系统而言,对 GUI 的要求相对较低,如传统51类型单片机这类系统一般不希望建立在庞大累赘的、非常消耗系统资源的操作系统和 GUI 之上,如 Windows 或 X Window。
目前此类系统都直接使用原有编程手段,采用比较简单的手法实现GUI。
对于太过庞大和臃肿的GUI系统而言,μc/GUI这类可运用于此类资源较紧张的轻型 GUI 的需求更加突出uc/GUI简介μc/GUI是美国Micrium公司出品的一款针对嵌入式系统的优秀图形软件。
如何将ucgui的汉字库存放到外部的flash memory
(原创)如何将ucgui的汉字库存放到外部的flash memory(ucgui)(汉字库)(外部flash)摘要:在ARM7系统中,都不会有足够大的程序存储器来存放大容量的汉字库,因此当系统中要用到汉字库时,需要将其存储在外部的FLASH Memory,而ucgui的字符显示函数是直接从程序存储器取数据的,因此需要在原始代码里增加一个接口,来指向外部的FLASH Memory。
简介:ucgui中,字符显示的底层函数是GUICharP.c 中的void GUIPROP_DispChar(U16P c) 函数,我们将这个函数修改如下:/*********************************************************************** GUIPROP_DispChar** Purpose:* This is the routine that displays a character. It is used by all* other routines which display characters as a subroutine.*/void GUIPROP_DispChar(U16P c) {int BytesPerLine;U8 BytesPerFont; //一个字的字节数U32 base,oft; //字库的起始地址和偏移量GUI_DRAWMODE DrawMode = GUI_Context.TextMode;const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c); if (pProp) {GUI_DRAWMODE OldDrawMode;const GUI_CHARINFO GUI_UNI_PTR * pCharInfo;//支持3种字体==if((GUI_Context.pAFont == &GUI_FontHZ16)||(GUI_Context.pAFont == &GUI_FontHZ24)||(GUI_Context.pAFont == &GUI_FontHZ32)){pCharInfo = pProp->paCharInfo;base = (U32)pProp->paCharInfo->pData;BytesPerFont = GUI_Context.pAFont->YSize * pProp->paCharInfo->BytesPerLine; //每个字模的数据字节数if (BytesPerFont > BYTES_PER_FONT){BytesPerFont = BYTES_PER_FONT;if (c < 0x80) //英文字符地址偏移算法{oft = base + (c - 0x20) * BytesPerFont; //计算出字码在flash中的偏移地址}else//中文字符地址偏移算法{oft = base + (((c>>8) - 0xa1) * 94 + ((c&0xff) - 0xa1)) * BytesPerFont;}LCD_ReadFlashBit(oft, GUI_FontDataBuf, BytesPerFont);//取出字模数据BytesPerLine = pCharInfo->BytesPerLine;OldDrawMode = LCD_SetDrawMode(DrawMode);LCD_DrawBitmap( GUI_Context.DispPosX,GUI_Context.DispPosY,pCharInfo->XSize,GUI_Context.pAFont->YSize,GUI_Context.pAFont->XMag,GUI_Context.pAFont->YMag,1, /*Bits per Pixel */BytesPerLine,GUI_FontDataBuf,&LCD_BKCOLORINDEX);}//--else{pCharInfo = pProp->paCharInfo+(c-pProp->First);BytesPerLine = pCharInfo->BytesPerLine;OldDrawMode = LCD_SetDrawMode(DrawMode);LCD_DrawBitmap( GUI_Context.DispPosX,GUI_Context.DispPosY,pCharInfo->XSize,GUI_Context.pAFont->YSize,GUI_Context.pAFont->XMag,GUI_Context.pAFont->YMag,1, /*Bits per Pixel */BytesPerLine,pCharInfo->pData,&LCD_BKCOLORINDEX);/*Fill empty pixel lines */if (GUI_Context.pAFont->YDist > GUI_Context.pAFont->YSize) {int YMag = GUI_Context.pAFont->YMag;int YDist = GUI_Context.pAFont->YDist * YMag;int YSize = GUI_Context.pAFont->YSize * YMag;if (DrawMode != LCD_DRAWMODE_TRANS) {LCD_COLOR OldColor = GUI_GetColor();GUI_SetColor(GUI_GetBkColor());LCD_FillRect(GUI_Context.DispPosX,GUI_Context.DispPosY + YSize,GUI_Context.DispPosX + pCharInfo->XSize,GUI_Context.DispPosY + YDist);GUI_SetColor(OldColor);}}LCD_SetDrawMode(OldDrawMode); /*Restore draw mode */GUI_Context.DispPosX += pCharInfo->XDist * GUI_Context.pAFont->XMag; }}然后再加入FLASH操作的底层驱动(这里用的是SPI FLASH)/********************************************************************* ** Static code*********************************************************************** *///字模数据的暂存数组,以单个字模的最大字节数为设定值#define BYTES_PER_FONT 4*32 //最大支持32*32的汉字static U8 GUI_FontDataBuf[BYTES_PER_FONT];/********************************************************************* ** 读FLASH中的字库*/#include "spi_flash.h"#include "ssp.h"void LCD_ReadFlashBit(U32 addr,U8* buf,U8 Bytes){U8 i;SPI_FLASH_StartReadSequence(addr); //设置起始地址for(i=0;i<Bytes;i++){buf[i] = SPI_FLASH_SendByte(0xa5);}SPI_FLASH_CS_HIGH();}我们知道,ucgui访问字库的时候,是根据字库文件的索引表来查找汉字数据地址的,因此汉字库文件中的索引也要修改,以汉字库32为例/*******************************************************File Name : hzk32.CCompiler :Author : Liu_xfVersion : V1.0Date : 2011-3-28 11:25:54Description :ucgui的中文字库,与uc工具生成的字库文件不同的是,可以将大容量的汉字数组存入到外部的FALSH里当然这个也是由uc工具生成的文件修改而来的。
uCGUI简单移植
嵌入式图形用户界面uc/gui在nios II上的移植uc/gui是一个优秀的嵌入式图形用户界面,这几天的工作就是将它移植到nios II系统上。
前人也做了一些工作,不过大部分都是针对其他硬核处理器,针对nios II软核处理器的移植资料那简直是凤毛麟角。
在阅读了相关文档后,我决定自己亲自动手实践,这下面的很多过程都是自己摸索出来的,并通过了实验的验证。
这只是一个初步的移植,也许在以后的更复杂的应用中,还需要对其进行调整。
但对目前我的应用而言,应该足够了。
写这篇文章的目的一是由于自己记性不好,所以需要给自己留个备忘,免得以后忘的一干二净;二是给有需要的朋友提供一些参考,也好相互交流,共同进步。
请大家多提宝贵意见。
一、源码和文档下载/上有很多不同版本的源码下载,目前能下到的最新版本是3.98,不过还有一些组件不是很完整,但作基础开发已经够用了。
ucgui3.98源码下载地址:uC-GUI-V3-98.zip。
ucgui最新版用户手册下载地址:uC-GUI-user.rar。
开发软件:quartus II 6.0, Nios II IDE 6.0。
二、移植过程先来看看解压后都有些什么东西:如图,核心的东西包括Config和GUI两个文件夹,这里面是ucgui的所有源码和配置文件。
ConvertColor包含彩色转换函数,ConvertMono包含灰度到彩色转换的函数,Core包含核心程序,Font是字体文件,LCDDriver包含多种控制器驱动,Widget是窗口控件库,WM是窗口库,提供复杂的功能。
其他文件夹包含一些应用范例以及一些有用的工具,留待慢慢探索。
1、config文件的移植:Config文件夹是ucgui的配置文件夹,里面有3个文件:GUIConf.h:gui的基本属性配置文件,有很多开关可以配置,具体可以参考ucgui的用户手册,这里只需配置几个必要的参数如下:#ifndef GUICONF_H#define GUICONF_H#define GUI_OS (1) /* 支持操作系统,nios系统自带了ucosII,所以我们选择此项,使gui支持该操作系统*/#define GUI_SUPPORT_TOUCH (0) /* 支持触摸屏,由于暂时没有用触摸屏,所以关掉这个开关*/#define GUI_SUPPORT_MOUSE (0) /* 支持鼠标,暂时关闭*/#define GUI_SUPPORT_UNICODE (1) /* Unicode字符串支持*/#define GUI_DEFAULT_FONT &GUI_Font6x8/* 默认字体*/#define GUI_ALLOC_SIZE 12500/* WM和memery device分配的内存*/ #define GUI_WINSUPPORT 1 /* Window manager available */#define GUI_SUPPORT_MEMDEV 0 /* Memory devices available,由于下载到的源代码中缺少memery device组件的源码,所以关闭此项*/#define GUI_SUPPORT_AA 1 /* Anti aliasing available */#endif /* Avoid multiple inclusion */LCDConf.h:LCD控制器的硬件配置文件,这个文件与硬件直接相关,一般是根据你所使用的LCD的类型和所用的LCD控制器的类型来配置。
ucgui gui_lock()原理
ucgui gui_lock()原理ucgui 并不是我所熟知的某个特定的GUI库,可能是某个特定环境或定制版本中的GUI库。
不过,基于一般的GUI库设计原理,gui_lock() 函数通常用于锁定GUI系统,防止在关键操作期间发生意外的界面更新或重绘。
以下是关于 gui_lock() 函数可能的工作原理的一般性描述:工作原理:1.状态管理:gui_lock() 函数会更改GUI库的内部状态,将GUI系统标记为锁定状态。
这通常通过设置一个标志位或计数器来实现。
2.阻止重绘:当GUI系统处于锁定状态时,任何尝试更新或重绘界面的操作都会被阻止或延迟。
这确保了在锁定期间,界面不会发生变化,从而避免了可能的界面闪烁或错误显示。
3.同步和异步操作:在某些情况下,GUI操作可能是异步的,即它们会在后台线程或定时任务中执行。
gui_lock() 需要确保即使在这些异步操作中,锁定状态也能被正确识别和处理。
4.嵌套锁定:有些GUI库支持嵌套锁定,即多次调用 gui_lock() 会增加锁定计数,而只有对应的 gui_unlock() 调用次数足够多时,GUI系统才会真正解锁。
这可以防止由于误操作导致的锁定和解锁不匹配问题。
5.解锁操作:通常会有一个与 gui_lock() 对应的 gui_unlock() 函数,用于解除锁定状态。
当GUI系统解锁时,之前被阻止的界面更新操作可以继续执行。
示例伪代码:c复制代码// 假设有一个全局变量来表示GUI的锁定状态int gui_locked = 0;void gui_lock() {gui_locked++;// 可能还有其他操作,如禁用定时器或事件处理等}void gui_unlock() {if (gui_locked > 0) {gui_locked--;// 如果解锁完成,恢复定时器或事件处理if (gui_locked == 0) {// 触发界面更新或重绘}}}注意事项:•谨慎使用:锁定GUI系统应该谨慎使用,因为它会阻止界面的正常更新。
第十讲 uCGUI简介
1 GUI 概述 1.1 GUI的功能
• GUI的功能 以API函数的形式向应用程序提供图 形界面的操作功能,如描点、画线、填 充、显示控件、字体管理等功能。 可以降低在嵌入式系统开发过程中的 图形操作界面的开发难度,提高效率, 美化界面。
第十讲 uCGUI简介 第十讲 uCGUI 简介
1、GUI 概述 2、GUI常见种类 3、uCGUI 的特点 4、uCGUI的功能函数 5、uCGUI的使用
下图为颜色模式555的效果图:
4 uC/GUI 的功能函数 4.4.6 定义物理调色板
4) 定义物理调色板
在LCDConf.h中定义4种颜色(全部为灰色) 的调色板:
4 uC/GUI 的功能函数 4.4.7 颜色管理函数
4) 颜色管理函数(1)
4 uC/GUI 的功能函数 4.4.8 颜色管理函数
3 uCGUI的特点 3.1.3 uC/GUI 概述
1) uCGUI的特征
• 视窗显示和管理功能; • 支持触摸屏和鼠标的输入; • 具有功能全面的PC机实用软件工具,如模拟 器、观察器、位图转换器、字体转换器等。
3 uCGUI的组成 3.1.4 uC/GUI 概述
2) uCGUI的组成 通常GUI文件放 在工程文件的根目
5) 字体操作函数(1) uCGUI支持ASC11,IOS8859-1,Unicode
字体编码;有宽位图字体、比例位图字体、
2bpp (bit/pixel)和4bpp比例位图等4种字体
字体的选择在GUIConf.h中定义,字体
需要与应用程序连接在一起。
4 4.5.2 增加字体 uC/GUI 的功能函数
▪文本显示函数 ▪数值显示函数
▪平面(2D)图形库
emWin522(uCGUI)图形用户接口移植详细实例_STM32_2013_12_30
emWin 5.22 (uCGUI) 图形用户接口移植实例——STM32作者:Ach日期:2013年12月29日联系方式:ox000008@1.概要移植图形用户接口的好处是不言而喻的。
本文图文并茂地介绍了一个emWin 5.22(uCGUI)的移植实例。
文章具体分为emWin简介,硬件平台简介,开发环境及项目简介,移植过程以及总结几个部分。
2.emWin简介emWin是一种高效的而图形用户界面,是我们能够摆脱处理器和显示控制器而更专注于GUI的设计。
这里借用STemWin的一幅图来说明emWin的作用和结构。
它通过LCD及GUI的配置来驱动底层硬件,而应用程序又是通过调用emWin来实现各种GUI。
5.22版的emWin带有许多常用的显示控制器的驱动(在参考手册Display Driver一章中有详细介绍),因此为我们移植带来了诸多方便。
emWin的更详细的内容可参照它的参考手册。
图1. emWin在项目中的结构3.硬件平台简介笔者使用的是一块以STM32F103VET6为核心的ARM开发板,没有外部的SRAM及Flash。
显示屏为2.8”320*240的彩色液晶屏,屏的驱动芯片为ILI9341(emWin 5.22带有它的驱动)。
屏与CPU 的连接方式为该ARM核心所特有的FSMC_SRAM方式,访问LCD内容时操作就如同读写SRAM一样方便。
如果你想使用其它硬件平台来移植emWin,本文亦有一定的参考价值。
希望本文能助你成功移植emWin。
图2. 硬件平台4.开发环境简介笔者所使用的开发软件为MDK-ARM 4.70。
项目模板使用的是STemWin库中的(可从ST官方下载)。
图3. 项目截图如图,项目下面有3个文件夹,其中Appli存放的是应用层的程序,第二个文件夹就如文件名,存放了emWin5.22所有部件,第三个文件夹存放了一些STM32及其它的库。
具体见附件。
5.移植过程有了MDK-ARM以及STemWin库,整个移植过程应该比较简单。
UCGUI
uC/GUI作为一个通用的嵌入式应用的图形模块,它在嵌入式系统中的作用也显得的越来越重要。
uC/GUI是一个源代码开放的图形系统,它提供了丰富的资源,包括二维绘图库、多字体及可扩充字符集、Unicode、位图显示、多级RGB及灰度调整、动画优化显示、具有Windows风格的对话框和预定义控件(按钮、编辑框、列表框等),以及对键盘、鼠标、触摸屏等输入设备和双LCD输出的支持,目前在具有图形界面的嵌入式产品中得到越来越广泛地应用。
2 通用嵌入式图形模块uC/GUIuC/GUI是一个通用的嵌入式应用的图形模块,它是美国Micrium公司开发的一种高效的、与处理器和LCD控制器独立的通用GUI,可以适用各种CPU和LC D,在单任务和多任务操作系统中,它都可以工作得很好。
它具有驱动接口层和应用层,全部代码采用ANSI _C编写,提供源代码,可以方便的移植到各种平台下。
2.1 uC/GUI特点(1) 支持任何8位、16位和32位的CPU,只要求CPU具有相应的ANSI_C编译器即可。
(2) 所有硬件接口定义都使用可配置的宏。
(3) 字符、位图可显示与LCD的任意点,并不限制与字节长度的整数倍数地址。
(4) 所有程序在长度和速度方面都进行了优化,结构清晰。
(5) 对于慢速的LCD控制器,可以使用缓冲存储器减少访问时间,提高显示速度[1]。
因为uC/GUI具有这些优点,它越来越受到更多嵌入式设计者的青睐。
2.2 uC/OS-II介绍在嵌入式系统的开发过程中,选择操作系统与选择开发平台一样的重要。
虽然不是一个完整的实时操作系统,只是一个实时内核,但与其它操作系统比起来它具有很多优点因而得到了广泛的应用。
首先它是一种结构简单、源代码公开的操作系统,适合所有的开发者使用;它具有可移植性,它的绝大部分源码都是用移植性很强的ANSI _C编写,与微处理器硬件相关的部分采用汇编语言编写,很容易被移植到各种微处理器上;它还具有可固化和可裁剪等特点,对于嵌入式设计者来讲的,只要拥有固化手段(C编译、连接、下载和固化),就可以很方便将其嵌入到产品中去。
UCGUI 简介
UCGUI 简介译者:UCGUI邮箱:UCGUI@主页:版本:v1.0.0.01.0......UCGUI整体简介................UCGUI简介................本文档的目的...... .........前提学习要求.1.1.....要求...............目标硬件系统................开发环境(编译器).1.2.....UCGUI特性....... ........示例.1.3.....评估板.1.4.....如何使用本手册................印刷上的字体说明.1.5.....屏幕及坐标系统.1.6.....LCD控制器的连接类型.1.7.....数据类型.UCGUIUCGUI是一种嵌入式应用中的图形支持系统.它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示.它的设计架构是模块化的, 由不同的模块中的不同层组成, 由一个LCD驱动层来包含所有对LCD的具体图形操作, UCGUI可以在任何的CPU上运行, 因为它是100%的标准C 代码编写的.UCGUI能够适应大多数的使用黑白或彩色LCD的应用, 它提供非常好的允许处理灰度的颜色管理.还提供一个可扩展的2D图形库及占用极少RAM的窗口管理体系.本文档的目的本文档描述如何在嵌入式应用中安装,配制,使用UCGUI的图形用户接口, 并讲解UCGUI的内部设计架构.前提本文档假定你已经备坚实的C语言程序设计方面的知识, 如果你觉得自己这方面还不够, 那么我们推荐Kernighan 和 Richie的"C语言程序设计"给你, 它描述了最新的C标准, 即ANSI C标准, 本文档不须要具备汇编语言方面的知识.第一章1.1 要求对于开发UCGUI图形应用不须什么目标系统, 大部分的图形应用开发都可以在模拟器下进行; 但是最终的目的是通常还是在目标系统上运行程序.目标系统(硬件)你的目标系统必须具备如下几点:[1].CPU(8/16/32/64位)[2].必要的RAM和ROM存储[3].LCD显示器(任何类型及分辩率的)对于内存的需求取决于你选用的UCGUI的功能模块以及你所使用的目标系统上的编译器的效率. 内存的占用量无法估计准确的值, 下面就一些的数值适用于多数的目标系统.小型系统(不含窗口管理功能)[1].RAM:100字节[2].堆栈:500字节[3].ROM:10~25K(取决于选用的UCGUI功能模块)大型系统(包含窗口管理及各种窗体控件功能)[1].RAM: 2-6 kb (决于选用的应用中建立窗口的数量)[2].堆栈: 1200 bytes[3].ROM: 30-60 kb (决于选用的UCGUI功能模块)还要注意ROM的需求量随着你在应用程序中使用的字体数目而增长,以上的所有值都是粗糙的估计, 并不准确.开发环境(编译器)目标系统中采用的什么样的CPU并不重要, 但必须要有与所用CPU相对应的C编译器,如果你所使用的编译器有什么局限性, 请联系我们, 我们会告知你这些局限性会不会在你编译程序时产生问题, 大多数的16/32/64位的CPU或DSP上的编译器都可以正常使用, 大部分8位的编译也都可以正常编译.并不须要C++编译器, 不过它也可以正常使用, 如果有须求的话, 应用程序也可以在C++环境下正常编译使用.1.2 UCGUI的特性UCGUI的设计目标是为使用LCD作为图形显示装置的应用提供高效的/与LCD控制器独立及处理器独立的图形用户接口. 它适合于单任务环境及多任务环境, 如私用的操作系统或是商业的RTOS(实时操作系统). UCGUI以C源码形式提供, 并适用于任意LCD 控制器和CPU下任何尺寸的真实显示或虚拟显示.它包含以下特性:一般特性[1] 适用任何8/16/32位CPU, 只要有相对应的标准C编译器.[2] 任何的控制器的LCD显示器(单色,灰度,颜色), 只要有适合的LCD驱动可用.[3] 在小模式显示时无须LCD控制器.[4] 所有接口支持使用宏进行配制.[5] 显示尺寸可定制.[6] 字符和位图可在LCD显示器上的任意起点显示,并不仅局限于偶数对齐的地址起点.[7] 程序在大小和速度上都进行了优化.[8] 编译时允许进行不同的优化.[9] 对于缓慢一些的LCD控制器, LCD显存可以映射到内存当中, 从而减少访问次数到最小并达到更高的显示速度.[10]清晰的设计架构.[11]支持虚拟显示, 虚拟显示可以比实际尺寸大(即放大).图形库[1] 支持不同颜色深度的位图.[2] 提供可用的位图转换工具.[3] 图形运算时绝对不含浮点运算.[4] 快速画点/线(不含浮点运算).[5] 高速画圆及多边形.[6] 多种画图模式.字体集[1] 为基础应用提供多种不同字体:4*6, 6*8, 6*9,8*8, 8*9, 8*16, 8*17, 8*18, 24*32, 以及8, 10, 13, 16等几种高度(象素单位)的均衡字体(proportional fonts). 更详细的信息, 请参考第25章:"标准字体".[2] 可以方便的加入及链接进自定义字体.[3] 只有应用程序中用到的字体被实际链接进最后的执行映象文件中, 因此保证占用最小数量的ROM.[4] 提供可用的字体转换工具.任何宿主系统(如微软windows系统)上的可用字体均可以经转换后使用.字符串/数值输出[1] 支持数值的任何字体下的十进制/二进制/十六制显示.[2] 支持数值的任何字体下的十进制/二进制/十六制编辑输入.窗体管理器[1] 齐全的窗口管理, 包括剪切, 在窗体客户区外[2] 窗体可以移动及改变大小.[3] 支持窗口回调函数(可选功能).[4] 窗体占用最低RAM(每个窗体占用20个字节).可选的类似PC机的窗体控件[1] 可用的窗体控件(窗体对象, 也称作控件), 操作简便而且容易使用.触摸屏及鼠标支持[1]对于窗体控件如按钮, UCGUI提供触摸屏及鼠标支持.PC下的工具[1] 模拟器及查看器.[2] 位图转器工具.[3] 字体转换工具.示范样例为了给你一个更好的关于UCGUI可以完成什么的概念. 我们编写了不同的可用范例程序, 执行映象文件在Sample\exe下, 源码码在Sample目录下. Sample\GUIDemo下包含了展示更多UCGUI特性的范围范例程序.1.3 评估板一个完整的评估板包括有LCD显示器的演示板/C编译器/完整的工程示例, 评估板的目的主要是测试和演示UCGUI, 并可以熟悉UCGUI的开发.评估板[1] 三菱M30803 CPU/SED 13705 LCD 控制器(包含图表及文档说明).[2] LCD(320*240 分辨率)单色, 1/4 VGA彩色显示或者TFT.更详细的说明, 请查看网站.1.4 如何使用此文档本文档介绍了如何安装、配制、使用UCGUI, 并描述了UCGUI的内部设计架构以及所有提供的功能(即应用程序开发手册, 简称API接口).在实际使用UCGUI之前, 你应该阅读或者至少概览一遍整个手册以对UCGUI有一个整体的认识, 建议按照以下的步骤进行UCGUI的学习:[1] 获取UCGUI源码到硬盘中.[2] 通读本文档第二章:"UCGUI开篇".[3] 使用UCGUI模拟器以慢慢熟悉用它可以做什么(参考第三章:"UCGUI模拟器").[4] 使用文档其它部分提供的知识扩展你的程序.文档排版中使用符号标志的约定[参看具体的E文档]风格作用[1] 正文.[2][3] API参数.[4] 程序示例源码.[5] 已经加入存在的应用中的源码.1.5 屏幕及坐标体系屏幕由许多可以单独控制的点组成, 这些点称为象素, 大部分UCGUI提供的文本显示及画图函数均可以在任意指定的点进行画写.水平刻度为X轴, 垂直刻度为Y轴. 由X轴及Y轴坐标组成(x,y)二维坐标来描述屏幕中一点, 在需要X,Y坐标的作为参数的函数中X坐标在Y坐标之前传递. 屏幕(或者窗口)左上角点的坐标为(0,0). X轴右方向为正, Y轴下方向为正. 上图描述了UCGUI中的会标体系及X轴Y轴. 所有传入API参数中的坐标值的单位均为象素.1.6 LCD显示器到微控制器连接方式UCGUI提供所有LCD的访问支持, 实际上对几乎所有LCD控制器的都能提供独立透明的访问支持. 了解详细情况, 请参考第20章:"初级UCGUI配制". 如果你的LCD控制器不被支持的话请与我们联系, 我们目前正在为市场上所有的的LCD控制器编写驱动, 也许我们已经可以提供你打算使用的LCD控制器的驱动. 通常的为你应用写访问LCD的驱动是非常简单的工作. 如果在你目标硬件中需要的话, MIcrium公司可提供专业化的用户支持服务.LCD显示器控制器是以何种方式连接到系统中以及它是如何被程序访问的都不重要, 通常可以有几种连接方法, 在驱动程序中提供实现大部分的相同访问接口. 驱动程序通常情况下无须做什么大的修改, 可以在LCDConf.h文件中进行适合你的硬件的配制修改. 有关如何配制的情况可参考在第22章:"LCD 驱动程序"中的解释说明. 最通常的LCD 访问方法如下所描述, 如果你只想知道如何使用UCGUI, 以下小节可跳过.[1] LCD控制器总线型连接LCD控制器直接连接到系统总线上, 即意味着可以象RAM一样访问它, 这是一种非常高效的访问方法, 是强烈推荐使用的方法. LCD显存地址定义在LCDSEG当中, 为了能访问LCD显存, 必须知道LCD显存在物理空间中的映射区域, 这种连接方式的不同LCD控制器的驱动通用的.[2] LCD控制器端口型连接对于速度缓慢一些的控制器使用在快速的处理器上, 使用端口连接方式是唯一的解决方案. 这种连接方法的缺点是访问LCD的速度比总线型连接慢, 不过加上访问缓存后可以最大化的提高LCD的访问速度, 从而使LCD画面更新不会明显的下降. 编写驱动时所要做的就是写出设置及读写与LCD控制器连接的硬件端口的宏. 这种连接方式对于不同的LCD控制器需要不同的驱动程序.[3] 无须控制器的连接LCD显示器也可以不用LCD控制器而直接连接到系统上, LCD显示数据可以直接通过一个4位或是8位的移位寄存器来传送, 这种方式的硬件解决方案的优点是成本低, 但是缺点是占用大部分的处理器时间, 其占用率在不同的CPU上从20%到差不多100%不等; 对于速度慢的处理器, 这是根本不能接受的. 这种连接方式根本不须要指定的驱动程序, 因为UCGUI只是简单的将要显示的数据传送到LCD显存当中, 其余就是编写周期性的将LCD显存中的数据传送到LCD中显示的硬件图形显示相关部分.样例中提供了用C及优化过的M16C及M16C/80汇编语言编写的传送显存中数据到LCD中显示的代码.1.7 数据类型因为C并没有提供在不同的平台中固定长度的数据类型, 所以UCGUI定义了大部分自己的数据类型如下表所示:数据类型定义注解位有符号整数char 8-bitI8 signed无符号整数char 16-bitU8 unsignedI16 signed short 16-bit 有符号整数U16 unsigned short 16-bit 无符号整数I32 signed long 32-bit 有符号整数U32 unsigned long 32-bit 无符号整数I16P signed short 16-bit 有符号整数U16P unsigned short 16-bit 无符号整数对于多数16/32位的定义都可以非常方便的设置, 如果你在自己的应用程序部分定义改变或是重新定义自己的数据类型,推荐放在LCDConf.h配置文件内.。
ucGUI一般移植标准步骤
μc/GUI一般移植过程移植的版本为3.90a,主要包含的文件夹如下图所示,主要涉及到:1.Config:配置文件2.GUI:源代码3.GUI_X:操作系统接口函数GUI源代码文件:1)AntiAlias:9个C文件,主要用于抗锯齿的显示效果。
2)ConvertColor:彩色显示的色彩转换支持。
3)ConvertMono:(b/w)和灰度显示的色彩转换支持。
4)Core:核心文件,提供了GUI基本的功能。
5)Font:字库。
6)JPEG:图片操作函数。
7)LCDDriver:LCD驱动程序8)MenDev:Memory device支持。
这个东西可用在很多情况下,但最主要的功能是防止在项目重叠时,防止屏幕的闪烁。
9)Widget:窗体控件库。
10)WM:窗口管理库。
注意:JPEG、MenDev、Widget、WM都可以裁减掉,若要支持Widget(窗体控件),需要WM(窗口管理器)的支持;使用控件时,需要将相应的头文件包含进去,比如我们要使用按钮button,那么我们需要先包含button.h头文件,否则控件即使支持也不可用!一、Config文件夹配置文件修改1.LCDConfig.h#define LCD_XSIZE(240)//X-resolution of LCD,Logical coor.#define LCD_YSIZE(320)//Y-resolution of LCD,Logical coor.#define LCD_BITSPERPIXEL(16)//总线宽度#define LCD_FIXEDPALETTE(565)//TFT格式#define LCD_CONTROLLER(9325)//控制器型号(-1即可)#define LCD_SWAP_RB(1)//是否红蓝交换注意:LCD_SWAP_RB会影响到颜色的正确性,倘若发现颜色是反向的,那么不如改变LCD_SWAP_RB的值。
第5章emWin(UCGUI)模拟器的使用方法
第5章emWin(UCGUI)模拟器的使用方法第5章emWin5.24模拟器的使用方法本期主要是带领大家学习emWin5.24模拟器的使用,主要内容是学习如何运行emWin5.24安装包里面的例子以及emWin查看器的使用。
5. 1 emWin5.24的使用方法5. 2 emWin5.24查看器的使用方法5. 3 总结5.1e m W i n5.24的使用方法如果没有emWin5.24模拟器的,需要到官网下模拟器。
解压emWin5.24的安装包,用VC6.0打开后的效果是这样的:默认的情况下运行的是emWin官方的DEMO,点击下面这两个按钮后运行:5.1.1如何改变显示界面的大小以前的那些版本,改变显示界面大小的时候,完全的没有反应,现在的这个模拟器的版本完全的没有问题的,默认的情况下是320*240的。
运行官方的DEMO后显示效果如下:现在我们把分辨率改成480*272,显示效果就是下面这个样子的。
5.1.2如何在这个工程上运行官方其它例子比如我们要运行这个例子2DGL_BMPExport.c。
这里我们需要把Application文件从工程里面独立出去第一步:●第二步:勾选红色方块就可以了。
●第三步第四步:这里把这个对勾去掉设置完以后就可以运行这个例子了。
5.1.3如何运行下面这种官方例子比如下面这种例子:冲突,所以要把下面这里的独立出来(方法和上面讲的一样)。
5.2e m W i n5.24查看器的使用方法关于emWin5.24查看器的位置在模拟器软件包的这个路径下:查看器的使用方法也比较简单,用户可以先运行emWin模拟器再打开查看器或者先运行查看器再打开emWin模拟器都可以的。
下面是模拟器的实际显示效果:查看器在多层显示的时候比较有用。
5.3总结官方的模拟器是个非常好的东西,一般情况下,界面比较麻烦的可以先在上面做好,然后再移植到开发板上面。
从下期教程开始,我们将讲解STemWin中API的使用。
UCGUI显示中文
UCGUI显示中文
最近用stm32搞个mp3,用的是ucgui,无奈不支持中文,找了半天资料发现一个可以直接的代码,发来给大家参考下
字库代码是《嵌入式系统设计与开发实例详解:基于ARM的应用》这本书里面的,方法是和ucgui显示字符一样的原理,所以可以直接调用GUI_DispStringAt();这类函数直接显示中文,非常方便,不过只有一种字体大小。
我已经做成单独的文件夹User_Font,只要调用里面的头文件“FHZK12GUI.H”就可以了,用的时候先要设置字体
GUI_SetFont(&GUI_FontHZ12);
GUI_DispStringAt("显示汉字1234",0,188);
这样就可以了
然后在上传该书的光盘源码吧,里面有书籍的图片吧,可以将就着看看
ucgui可以使用的汉字字库ourdev_639049NHGDRT.rar(文件大小:184K)(原文件名:User_Font.rar)
嵌入式系统设计与开发实例详解这本书的光盘源码和图片ourdev_639050PGR14R.rar(文件大小:147.41M)(原文件名:嵌入式系统设计与开发实例详解―基于ARM的应用.rar)。
gui编程实训体会 -回复
gui编程实训体会-回复GUI编程实训体会在这次GUI编程实训中,我学到了许多有关图形用户界面设计和开发的知识和技能。
通过设计和实现一个完整的GUI应用程序,我对GUI编程的方法和流程有了更深入的理解。
在本文中,我将分享我在这次实训中的体会和收获。
首先,我学会了如何使用GUI库来创建窗口和组件。
在实训过程中,我们使用了一种流行的GUI库,如Tkinter、Qt等,它们提供了各种各样的窗口和组件,以及相关的布局管理器。
通过学习这些库的文档和示例,我能够创建出各种各样的窗口和组件,并且对其进行布局和美化。
这让我意识到,GUI编程并不是一件复杂的事情,只要学会了一些基本的概念和技能,就可以很容易地实现一个漂亮而功能强大的界面。
其次,我学到了如何处理用户交互和事件。
在GUI应用程序中,用户可以通过鼠标和键盘与应用程序进行交互,而这些交互会触发各种各样的事件。
通过学习和实践,我能够掌握如何捕捉和处理这些事件,并且根据用户的操作做出相应的响应。
例如,当用户点击一个按钮时,我可以通过绑定一个回调函数来执行相应的操作。
这种处理用户交互和事件的能力对于开发GUI应用程序来说是非常重要的,它可以使应用程序更加灵活和可交互。
此外,我还学到了如何使用布局管理器来管理窗口和组件的布局。
在一个复杂的GUI应用程序中,窗口和组件的布局是一个非常重要的问题。
合理的布局可以使界面更加美观、易用和可维护。
通过学习布局管理器的原理和应用,我能够使用各种布局管理器来实现不同的布局方式,如水平布局、垂直布局、网格布局等。
这让我深刻地意识到,选择和使用合适的布局管理器是进行GUI编程的一项非常重要的工作。
此外,我还学到了如何进行界面美化和主题设计。
在实训中,我们不仅仅是关注功能和交互性,还要考虑界面的美观和可用性。
通过使用各种样式表和主题,我能够改变窗口和组件的颜色、字体、大小等属性,以实现不同的视觉效果。
这让我认识到,良好的界面设计可以提升用户的体验,使用户更愿意使用和探索应用程序。
uCGUI使用
uCGUI使用最好多参考几篇文章,比如UC/GUI中文手册与emWin5_UM_SC0:画图函数GUI_DrawRect:在当前窗口中的指定位置绘制矩形(不填充,画线颜色为前景色)void GUI_DrawRect(int x0, int y0, int x1, int y1); GUI_FillRect:在当前窗口中的指定位置绘制填充的矩形区域(填充前景色)GUI_ClearRect:清除矩形区域(为矩形区域填充背景颜色,图形界面用填充背景色达到清除屏幕的效果)1:存储设备不使用存储设备时,绘制操作直接写入显示器。
屏幕在执行绘制操作时随时更新,从而在进行各种更新时使屏幕闪烁。
如果在此过程中使用存储设备,则所有绘制操作都在存储器中执行。
仅在所有操作都完成后才将最终结果显示在屏幕上,其优点是没有闪烁。
如果不使用存储设备,则可以看到一步步的绘制操作效果,缺点是会出现显示器闪烁。
使用存储设备时,一次可见到所有例程的效果,就象单次操作一样,不能实际看见中间步骤。
以下例程是在使用存储设备时通常会调用的,基本用法非常简单:1. 创建存储设备(使用GUI_MEMDEV_Create() )。
2. 激活它(使用GUI_MEMDEV_Select() )。
3. 执行绘制操作。
4. 将结果复制到显示器中(使用GUI_MEMDEV_CopyToLCD() )。
5. 不再需要它时,删除该存储设备(使用GUI_MEMDEV_Delete() )。
2:WM窗口管理器回调例程:回调例程由用户程序定义,指示在特定事件出现时图形系统调用特定的函数。
它们通常用于在窗口内容更改时自动重绘窗口。
窗口管理器的默认特性是向每个需要重绘的窗口发送一条 WM_PAINT 。
当用户对窗口有操作时,WM会发送相应的消息给该窗口,窗口可通过回调函数根据消息直接对屏(没有用存储设备时)或对窗口的存储设备进行操作再拷贝到屏幕上,具体的消息说明可以参考emWin的中文手册。
ucgui移植笔记
在源文件夹的Start\GUI\LCDDriver下有个LCDDummy.c文件,主要修改此文件与自己的lcd驱动文件进行链接。
主要修改以下这两个函数就可以了:unsigned int LCD_L0_GetPixelIndex(int x, int y)void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)移植步骤:第一步:首先,得把你的TFT底层驱动和触摸驱动写好,既在裸机下,可以正常显示并实现触摸。
第二步:加入UCGUI程序包。
第三步:配置LCDConf.h GUIConf.h GUITouchConf.h配置LCDConf.h文件如下:#ifndef LCDCONF_H#define LCDCONF_H#define LCD_XSIZE (240) /*X轴分辨率 */#define LCD_YSIZE (320) /* Y轴分辨率 */#define LCD_BITSPERPIXEL (16) //像素位数#define LCD_FIXEDPALETTE (565) //颜色模板//#define LCD_SWAP_RB (1)//以下两部分在LCDDummy.c文件中要用到#define LCD_CONTROLLER 9320 //控制器型号的配置#define LCD_INIT_CONTROLLER()Touch_Initializtion();ili9320_Initializtion() //LCD初始化#endif在LCDDummy.c文件中,需要修改以下3个函数和一个宏判断,并添加自己的lcd驱动头文件(1)宏修改#if (LCD_CONTROLLER == -1) \&& (!defined(WIN32) | defined(LCD_SIMCONTROLLER))此处将 -1 改为 9320 ,以对应上面的配置。
S3C44B0X 调试笔记
S3C44B0X 调试笔记开发板:北京恒丰锐科科技有限公司HF44b0开发板硬件规格:1. Samsung S3C44B0X 66MHz (ARM7 内核)2. 8M SDRAM3. 2M FLASH4. 10M 以太网接口5. IDE 接口6. USB1.1 接口7. 音频输出8. MIC 输入接口9. 时实时钟,备有可充电电池,方便您的使用。
10. IIC 总线接口11. 实时系统时钟12. LCD 接口:支持640*480 以下单色或320*240 以下STN/DSTN 256 色13. 2 个RS232 串行口14. 包括protel 格式的原理图,有利您硬件的学习。
15. 20 针JTAG 调试端口16. 1*4 键盘17. 可扩展的总线接口,CPU 的160 个引脚全部用2.54 标准插座引出编程环境:MDK 5.13仿真环境:J-LINK V8 固件版本4.90e测试项目:LCD ucGUI Flash运行和RAM运行测试LCD:夏普LM8M64(640X240 256色)1.Flash运行测试1)MDK的配置/******************************************************************************/ /* FLASH.INI: Flash Initialization File *//******************************************************************************/ /* This file is part of the uVision/ARM development tools. *//* Copyright (c) 2005-2006 Keil Software. All rights reserved. *//* This software may only be used under the terms of a valid, current, *//* end user licence from KEIL for a compatible version of KEIL software *//* development tools. Nothing else gives you the right to use this software. *//******************************************************************************/_WDWORD(0x01D30000, 0x00000000); // WTCON: Disable Watchdog_WDWORD(0x01C00000, 0x00000001); // SYSCFG: Disable Cache这里选择Flash的型号是AM29F160DB,实际型号是AM29LV160DB,但实际也好用.2.Flash运行测试1)MDK的配置//*** <<< Use Configuration !disalbe! Wizard in Context Menu >>> ***FUNC void Setup (void){_WWORD (0x1c00000, 0x00000008); //System Configuration SYSCFG_WWORD (0x01C80000, 0x11119102); //Bus Width & Wait Status Control BWSCON_WWORD (0x01C80004, 0x00000600);_WWORD (0x01C80008, 0x00007FFC);_WWORD (0x01C8000C, 0x00007FFC);_WWORD (0x01C80010, 0x00007FFC);_WWORD (0x01C80014, 0x00007FFC);_WWORD (0x01C80018, 0x00007FFC);_WWORD (0x01C8001C, 0x00018000);_WWORD (0x01C80020, 0x00018000);_WWORD (0x01C80024, 0x00860459);_WWORD (0x01C80028, 0x00000010);_WWORD (0x01C8002C, 0x00000020);_WWORD (0x01C80030, 0x00000020);// <o> Program Entry Pointpc = 0x0C001000;}//map 0x01c00000, 0x02000000 read writeLOAD ./RAM/Hello.axf INCREMENTALSetup(); // Setup for Running帮用户解决空间不够时候看的一个资料,【转】过来整理一下供大家参考:RealView MDK具有强大的编译、链接功能。
基于ucGUI多任务系统的图形用户界面开发
基于ucGUI多任务系统的图形用户界面开发吴建鲁江苏自动化研究所,江苏连云港 (222006)E-mail:wujianlucool2006@摘要:图形用户界面是人与计算机进行交互的一种操作方式,它的质量直接影响着产品的推广和用户的使用效率。
针对嵌入式系统中图形用户界面应用的广泛需求,本文介绍ucos-II 和ucGUI在S1C33209上的移植过程,并在此基础上实现了ucGUI多任务系统中图形用户界面的开发。
关键词:ucos-II; ucGUI; 移植;图形用户界面1 引言与命令式用户界面(Command Line Iser Interface)不同,图形用户界面(Graphical User Interface,GUI)不需要用户通过输入专业性很强的抽象命令来操作计算机,而代之以窗口、图标、菜单等直观的图形或图标,再加上可以控制光标移动的指示装置来完成数据和控制命令的输入,从而实现对计算机的交互式操作。
由于这样的用户界面不需要记忆专门性很强的控制命令并且非常直观易懂,图形用户界面受到了普遍的欢迎[1]。
ucGUI是Micrium公司出品的一款针对嵌入式系统的开放源代码的优秀图形软件,它为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口。
适用于单任务或是多任务系统环境,并适用于任意LCD控制器和CPU下任何尺寸的真实显示与虚拟显示。
架构基于模块化设计,由不同的模块中的不同层组成。
采用100%的标准C代码编写,由一个LCD驱动层来包含所有对LCD的具体图形操作,ucGUI可以在任何CPU上运行。
在ucGUI单任务系统中,程序顺序的执行,一个软件单元的反应时间依赖于这个系统中所有其他单元的执行时间,实时行为变得极为有限。
为了增强实时性,采用ucGUI多任务系统,使用开放源代码ucos-II实时内核,把应用程序分割成不同的部分运行在不同的任务中,具有不同的优先级。
这样,任务的实时行为只受运行在更高优先级的任务影响,系统的实时性得到极大的改善。
5UCGUI学习资料-第17章Shift-JIS支持
第17章 Shift-JIS支持最通用的日文编码方法是Shift-JIS。
Shift-JIS编码使8位字符得到丰富的使用,第一个字节的值用来区别单字节和多字节字符。
你不需要调用特殊函数来显示一个Shift-JIS字符串。
最主要的必要条件是要有一种包含有用于显示的Shift-JIS字符的字体。
第1页µC/GUI中文手册17.1 创建Shift-JIS字体字体转换器能够从任何的Windows字体产生一种Shift-JIS字体用于µC/GUI。
当使用一种Shift-JIS字体时,用于显示显示Shift-JIS字符的函数会自动地与库链接。
关于如何创建Shift-JIS字体的详细信息,请联系Micrium公司(info@)。
一份单独的字体转换器的技术资料描述了所有你需要在你的µC/GUI工程中实现Shift-JIS的有效方法。
17.2 例子下面的例子定义了一种包括6个字符的小字体:“A”,“B”,“C”和Shift-JIS字符0x8350(片假名字母KE),0x8351(片假名字母GE)和0x8352(片假名字母KO)。
然后在显示屏上绘出一个复合字符串。
该例子的源代码是Sample\Misc\ShiftJIS.c。
/*-------------------------------------------------------------------------- 文件: ShiftJIS.c目的: 展示µC/GUI的ShiftJIS性能--------------------------------------------------------------------------*/#include “GUI.H”/*************************************************************************** * ShiftJIS字体的定义 * ***************************************************************************//* 拉丁文大写字母 A */static const unsigned char acFontSJIS13_0041[13] = { /* 编码0041 */________,________,___X____,___X____,__X_X___,__X_X___,__X_X___,_XXXXX__,_X___X__,_X___X__,XXX_XXX_,________,________};第2页µC/GUI中文手册/* 拉丁文大写字母 B */static const unsigned char acFontSJIS13_0042[13] = { /* 编码0042 */________,________,XXXXX___,_X___X__,_X___X__,_X___X__,_XXXX___,_X___X__,_X___X__,_X___X__,XXXXX___,________,________};/* 拉丁文大写字母 C */static const unsigned char acFontSJIS13_0043[13] = {/* 编码0043 */________,________,__XX_X__,_X__XX__,X____X__,X_______,X_______,X_______,X_______,_X___X__,__XXX___,________,________};/* 片假名字母KE */static const unsigned char acFontSJIS13_8350[26] = { /* 编码8350 */__XX____,________,___X____,________,___X____,________,___XXXXX,XXXX____,__X____X,________,_X_____X,________,X______X,________,______X_,________,第3页µC/GUI中文手册______X_,________,_____X__,________,____X___,________,__XX____,________,________,________};/* 片假名字母GE */static const unsigned char acFontSJIS13_8351[26] = { /* 编码8351 */__XX____,X_X_____,___X____,_X_X____,___X____,________,__XXXXXX,XXX_____,__X____X,________,_X_____X,________,X______X,________,______X_,________,______X_,________,_____X__,________,____X___,________,__XX____,________,________,________};/* 片假名字母KO */static const unsigned char acFontSJIS13_8352[26] = { /* 编码8352 */________,________,________,________,__XXXXXX,XX______,________,_X______,________,_X______,________,_X______,________,_X______,________,_X______,________,_X______,_XXXXXXX,XXXX____,________,________,________,________,________,________};static const GUI_CHARINFO GUI_FontSJIS13_CharInfo[6] = {{7, 7, 1, (void *)&acFontSJIS13_0041} /* 编码0041 */,{ 7, 7, 1, (void *)&acFontSJIS13_0042} /* 编码0042 */,{ 7, 7, 1, (void *)&acFontSJIS13_0043} /* 编码0043 */第4页µC/GUI中文手册,{ 14, 14, 2, (void *)&acFontSJIS13_8350} /* 编码8350 */,{ 14, 14, 2, (void *)&acFontSJIS13_8351} /* 编码8351 */,{ 14, 14, 2, (void *)&acFontSJIS13_8352} /* 编码8352 */ };static const GUI_FONT_PROP GUI_FontSJIS13_Prop2 = {0x8350 /* 第一个字符 */,0x8352 /* 最后一个字符 */,&GUI_FontSJIS13_CharInfo[3] /* 第一个字符的地址 */,(void*)0 /* 指向下一个GUI_FONT_PROP的指针 */ };static const GUI_FONT_PROP GUI_FontSJIS13_Prop1 = {0x0041 /* 第一个字符 */,0x0043 /* 最后一个字符 */,&GUI_FontSJIS13_CharInfo[ 0] /* 第一个字符的地址 */,(void *)&GUI_FontSJIS13_Prop2 /* 指向下一个GUI_FONT_PROP的指针 */ };static const GUI_FONT GUI_FontSJIS13 = {GUI_FONTTYPE_PROP_SJIS /* 字体类型 */,13 /* 字体高度 */,13 /* 字体Y轴方向的间隔 */,1 /* X轴方向放大系数 */,1 /* Y轴方向放大系数 */,(void *)&GUI_FontSJIS13_Prop1};/*************************************************************************** * 包含ASCII字符和ShiftJIS字符的字符串的定义 * ***************************************************************************/static const char aSJIS[] = {"ABC\x83\x50\x83\x51\x83\x52\x0"};/*************************************************************************** * 展示ShiftJIS字符的输出 * ***************************************************************************/void DemoShiftJIS(void)第5页µC/GUI中文手册{GUI_SetFont(&GUI_Font13HB_1);GUI_DispStringHCenterAt("μC/GUI-sample: ShiftJIS characters", 160, 0);/* 设置ShiftJIS字体 */GUI_SetFont(&GUI_FontSJIS13);/* 显示字符串 */GUI_DispStringHCenterAt(aSJIS, 160, 40);}/*************************************************************************** * 主函数 * ***************************************************************************/void main(void){GUI_Init();DemoShiftJIS();while(1)GUI_Delay(100);}范例程序运行结果的屏幕截图第6页µC/GUI中文手册。
UCGUI专业论坛简介
『 闲话各路嵌入式GUI 』
收集与讨论各种嵌入式上应用的GUI,给学习与使用的人一个基本的介绍.
『 MacroWindow源码学习研究 』
学习ow的源码与设计结构,现已更名为Nano-X,并进行实际应用.
『 UCOS源码学习研究』
UCOS源码学习研究----学习小型的嵌入式多任务调度系统UCOS的多任务调度原理, 理解多任务之间的核心通信机制.
『 UCGUI专业论坛 』
---嵌入式图形系统与操作系统研究学习
版主:UCGUI
邮箱:UCGUI@
主页:/bbs
『 UCGUI源码学习研究 』
ucgui源码学习研究-----分析UCGUI的设计架构与思想, 并能进行实际应用中的改造, 最终打造自己的嵌入式GUI图形系统!
UCGUI移植教程
UCGUI移植教程
1. 环境搭建:首先,需要准备开发板和相应的编译工具链。
可以选择使用适合的开发环境,例如Keil、IAR或者GCC等。
2.移植UCGUI的底层驱动:UCGUI的底层驱动负责和硬件进行通信,并提供一系列函数接口给上层应用。
通常需要编写底层驱动的源代码,并将其与UCGUI的库文件链接。
3.配置移植环境:UCGUI提供了一个配置文件,该文件包含了各种编译选项和参数设置,可以根据具体的硬件平台进行修改。
通过修改这些配置文件,可以让UCGUI适应不同的平台。
4.移植字体和图像资源:UCGUI支持多种字体和图像格式,但并不包含实际的字体和图像资源。
因此,需要将所需的字体和图像资源转换成UCGUI支持的格式,并将其添加到应用程序中。
5.界面设计和调试:UCGUI提供了一套界面设计工具,通常可以在PC 机上进行界面设计和调试。
可以使用该工具创建界面,并将其转换成C代码,然后添加到应用程序中进行测试和调试。
6.运行UCGUI应用程序:最后,将编写的应用程序与UCGUI的库文件进行链接,生成可执行文件。
将该可执行文件烧写至开发板并运行,即可看到UCGUI的界面效果。
以上是UCGUI的移植过程的基本步骤,具体的移植过程可能会因不同的硬件平台而有所不同。
在进行移植时,可以参考UCGUI提供的官方文档和示例代码,也可以参考其他人的移植经验和教程。
需要注意的是,UCGUI的移植过程可能会遇到一些问题,例如显示效果不符合预期、界面响应速度慢等。
这时候可以通过调试和优化来解决这些问题,例如检查驱动程序的正确性、优化界面渲染算法等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ucGUI移植笔记完善版
最近在弄ucGUI的移植,网上搜了不少资料,也问了同学,总算把简单的一个程序弄好了,也感谢openedv论坛和hua290565456的网友,看了他的贴子,才恍然大悟弄好。
该程序是直接用的原子大哥的TFTLCD显示的例子,直接拿过来移植的,感谢原子大哥的程序,在我学习STM32的旅途上帮助我不少。
所用到的是原子大哥TFTLCD例子(库函数版本)和ucGUI3.90源码。
建工程就不说了,附件里有,相信大家也看到别人建的工程了,下面直接说重点。
补充说明:如果你移植的时候怎么也不成功,大部分原因是GUI无法初始化LCD。
考虑两方面的原因:
一、你写的底层驱动程序;
二、底层驱动程序与GUI系统的接口,即GUI的配置。
所有的问题几乎都是出现在这两方面,造成GUI无法成功调用正确的底层初始化程序。
所以:
1.确保你的底层驱动在没有移植GUI之前,能顺序驱动LCD成功。
2.然后,确保你的底层驱动接口没有与上层GUI有相同的公共的变量。
可以有同名的变
量,但所有的变量都必须是私有的。
也就是原子哥的那个结构体LCD不能在.h中定义。
如果LCD驱动文件是lcd.c和lcd.h,最好改为别的名字,比如ili93xx.c和ili93xx.h。
然后还要把LCD_Init()初始化函数改为LCDx_Init();因为GUI系统已经有名为LCD.c的文件和LCD_Init()的函数。
总而言之,确保你的底层的接口文件(xx.h)没有与上层同名的公共变量。
3.修改GUI系统与底层的接口:
A.LCDConf.h中按照下面的图就行,其余的可以删除掉,一定要删除其他的,因为有
相同的LCD_CONTROLLER定义,会造成硬件出错而进入硬件出错中断死循环。
注意红框中是刚刚改过的LCD初始化函数,改为刚刚更改的初始化函数就行。
B.接下来是GUIConf.h中的设置,目前只是用到简单的一个现实函数,多以就全部设
为0
C.然后是LCDDummy.c。
这个是LCD驱动函数的修改,这三个最好改红框选中的文
件
接下来就是更改的第一块,首先的把第1部所更改的相应的LCD底层函数的头文件加进来,不然ucGUI没办法正常工作。
然后就是第二个红框给为自己的驱动芯片型号。
再就是第二块,找到画蓝线的两个函数,用方框里的函数取代,如果是用原子大哥的,第一个函数必须要用快速画点函数,因为函数参数里有颜色这个参数,画点函数没有,如果是别的程序,也是一样,加入画点函数就行,但必须要有颜色的参数。
第二个函数就是读取某点的颜色值的函数,加进来就行,我这儿直接就用了原子大哥的程序。
需要强调的一点是,这些GUI与底层的接口的宏,必须正确书写,否则GUI无法与底层驱动成功连接。
4.最后修改主函数
以上要给注释掉,使用GUI的初始化语句GUI_Init()。
让GUI 去调用底层的初始化语句来初始化配置LCD。
如下:
在前面文件中不是有个宏定义
这个宏定义已经在这个文件中调用,见下图哦
还有一项特别注意的,移植完后,你发现,
1.LED指示灯闪烁,但屏幕一直黑屏,说明程序成功运行到while循环,但GUI没有成功调用底层的初始化程序,而是直接返回0。
说明你在修改GUI的配置文件时,书写不正确。
就是那些宏定义的变量.
2. LED指示灯没有闪烁,屏幕一直黑屏,说明程序没有成功运行到while循环, GUI也没有成功调用底层的初始化程序。
可能是你用了原子哥的库函数版本的LCD驱动。
库函数版本的驱动在初始化函数里面有一个pringf()打印函数,要把它去掉,与GUI系统的冲突。
3.有人说,屏幕先白屏一下之后就马上黑屏,而且后面无论设置什么颜色都是这样的情况。
在调用GUI_Init()的时候,这个函数会进入LCD_Init(),然后在LCD_Init()函数里面有着样的语句
#if (GUI_DEFAULT_BKCOLOR != GUI_INVALID_COLOR) LCD_SetDrawMode(GUI_DRAWMODE_REV);
LCD_FillRect(0,0, GUI_XMAX, GUI_YMAX); LCD_SetDrawMode(0);#endif
这句#if (GUI_DEFAULT_BKCOLOR != GUI_INVALID_COLOR)里面的GUI_DEFAULT_BKCOLOR 初值是OXFFFF,GUI_INVALID_COLOR 初值也是0XFFFF,而原子哥的初始化函数最后有一句LCD_Clear(WHITE);这样就把
GUI_INVALID_COLOR 的值设置成了0X0000;导致调用了下面的三个函数。
从而出现上面的问题。
只要把原子哥的初始化函数LCD_Clear(WHITE); 注释掉就不会错了,小问题大错误。
这是引用的hua290565456的帖子里的话,觉得很有用,就粘贴过来了。
其实不准确,本人用库函数版本和寄存器版本两个版本的驱动程序测试完全没有问题。
而且GUI的GUI_DEFAULT_BKCOLOR和GUI_INVALID_COLOR并不是0xFFFF,而是:
GUI_DEFAULT_BKCOLOR为0x000000,GUI_INVALID_COLOR为0xffff。
应该是那个pringf()打印函数造成的。
这就是一个基本的ucGUI的移植。