UCGUI
ucGUI移植详细设计及总结
ucGUI移植详细设计及总结序本文档阐述了将ucGUI移植到IM12上的过程。
ucGUI版本为3.9,移植到IM12上,触摸屏及按键能够正常使用。
在ucGUI源码包的基础上,添加了一些接口函数以适应IM12,在使用时应该根据情况使用这些接口,这些新增加的函数的接口将在后面章节中详细讲述。
此外,适应IM12的ucGUI在Wind River Workbench 3.0环境下被编译成两个静态库文件libNoWindow.a和libWindow.a,编译程序时应该连接这两个库。
文档篇章安排如下:第一章,ucGUI源码包简介。
主要介绍了所使用的ucGUI图形库中各文件夹的内容及功能,并对IM12中与ucGUI移植相关的部分,包括触摸屏、LCD、按键板等进行了简单的介绍。
第二章,图形库移植。
阐述如何对ucGUI进行配置、编译,以在IM12的LCD上显示图形,此部分还未实现触摸屏及按键功能,只是纯粹的显示而已第三章,触摸屏移植。
第四章,按键移植。
第五章,带触摸屏及按键功能的ucGUI应用程序模板。
第一章ucGUI源码包简介ucGUI要移植到im12上,实际上就是根据im12的情况修改ucGUI中的一些配置项,或增加、删减一些程序以适应im12,同时要保持ucGUI的特性。
要做好移植工作,需对ucGUI 及IM12相关部分有足够的了解。
1.1ucGUI简介移植所采用的ucGUI版本为3.9,主要包含的文件夹如图1所示图1 ucGUI源码结构图各文件夹的主要内容如下:Config ----------- 配置文件GUI ----------- 源代码GUI_X ---------- 操作系统接口函数定义文件GUI 源代码文件:1)AntiAlias: 抗锯齿显示效果支持。
2)ConvertColor: 彩色显示的色彩转换支持。
3)ConvertMono: (b/w)和灰度显示的色彩转换支持。
4)Core: 核心文件,提供了GUI基本的功能。
uCGUI 汉字显示技巧及总结
UCGUI的基础应用汉字显示在uC/GUI中显示汉字,必要的一个步骤就是汉字取模。
通常有两种方法:一、单个字模法:使用字模取模软件,进行单个字的取模。
此方法可应用于显示汉字字数较少的情况下。
其优点是:占用存储空间小,无冗余。
但当显示汉字字数较多时,该方法则非常繁琐。
二、字模库法:该方式需要移植整个汉字字库,若项目要求需显示多种汉字字体,则需移植多种字体的字库。
其优点是:操作方便。
若嵌入式系统的FLASH存储容量够大时,该方式可行。
根据作者多年的项目实践,找到一个兼具上述两种方式优点的显示方案:利用UCGUIFontTool软件,提取windows自带的字模库。
该方法的使用步骤:1、将项目中所要显示的汉字根据字体进行分类并汇总。
2、使用UCGUIFontTool软件分别提取上述字模。
3、将所产生的.C文件添加到工程中。
4、更改gui.h中的配置,添加该汉字的宏定义,如图5、显示汉字前更改需显示的字体,如图6、利用函数进行显示。
该方法移植方便,易实现同时显示多种字体,无字模冗余,占用存储空间最小。
图片显示uC/GUI提供了位图的解决方案,在GUI显示图片时,需先将其他格式的图片转换为bmp格式。
可利用windows系统自带的画图软件打开一个图片,再另存为bmp格式,继而转换为.c 格式文件加入到工程中。
其操作步骤如下:1、将其他格式的图片另存为bmp格式。
2、打开UCGUI源码自带的工具uC-GUI-BitmapConvert,选择相应参数,并转换为.c文件。
3、将该.c文件加入到工程中。
4、添加外部变量,并调用相应函数进行显示。
如图5、也可UCGUI提供的缩放函数可对图片进行缩放显示。
如图这里说一个技巧:如果无需在显示过程中对图片进行缩放,那么建议在第二步的时候就完成图片的缩放操作,以减少CPU的工作量。
控件显示UCGUI提供了很多控件,这里不再赘述,每个控件的操作方式类同。
这里以按钮控件作为举例。
UCGUI移植
移植UCGUI只需要修改3个文件:GUIConf.h,LCDConf.h,LCDDummy.c,并从源代码的Sample/GUI_X文件夹下复制GUI_X.c文件到工程的GUILib/Config目录下1、GUIConf.h刚开始移植的时候是没有RTOS的,LCD也不是触摸屏,所以GUI_OS和GUI_SUPPORT_TOUCH都定义为0,其他宏不需要修改2、LCDConf.hLCD_XSIZE、LCD_YSIZE和LCD_BITSPERPIXEL根据开发板LCD的配置定义,我用的屏的分辨率是480*272的,16位RGB;LCD_CONTROLLER必须定义成-1,表示使用自己定义的LCD驱动,这个LCD驱动是通过修改LCDDummy.c模板来实现的,因为LCDDummy.c中开始部分要判断宏LCD_CONTROLLER是否等于-1,如果不等于-1,LCDDummy.c中的内容不会被编译,当然LCD_CONTROLLER也可以定义成其他植,但和LCDDummy.c中一定要对应起来,而且不能等于UCGUI自带的LCD驱动号LCD_ON和LCD_OFF一定要定义,因为LCDDummy.c中的LCD_On()和LCD_Off()函数先判断相应的宏是否被定义,如果没定义则不会执行函数体中的内容UCGUI的初始化过程中的LCD部分是通过GUI_Init()(GUICore.c)->LCD_Init()(LCD.c)->LCD_L0_Init()(LCD_Dummy.c)实现的,因为LCDDummy.c中的LCD初始化函数LCD_L0_Init()调用LCD_INIT_CONTROLLER()宏来调用自定义的LCD初始化函数,所以要将宏LCD_INIT_CONTROLLER()定义成自定义的LCD 初始化函数GLCD_Init()。
也可以在不用修改LCD_INIT_CONTROLLER()宏,而是在LCD_L0_Init()直接调用GLCD_Init()3、LCDDummy.cLCDDummy.c文件中需要修改的函数有:1)、void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)2)、void LCD_L0_GetPixelIndex(int x, int y)3)、void LCD_On(void)4)、void LCD_Off(void)5)、int LCD_L0_Init(void)修改如下:其中395行的SetPixelIndex函数,422行的GetPixelIndex函数,536行的GLCD_On函数,542行GLCD_Off函数都是自己在LCD驱动文件中定义的函数,LCD_INIT_CONTROLLER()也被定义成LCD驱动文件中的LCD初始化函数4、LCD驱动文件1)、头文件drv_glcd.h:#include "lpc_types.h"#include "sdram_mt48lc2m32lfb5.h"#ifndef __GLCD_DRV_H#define __GLCD_DRV_H#define C_GLCD_PIX_CLK 9000000#define C_GLCD_REFRESH_FREQ (50HZ)#define C_GLCD_H_SIZE 480#define C_GLCD_H_PULSE 41#define C_GLCD_H_FRONT_PORCH 2#define C_GLCD_H_BACK_PORCH 2#define C_GLCD_V_SIZE 272#define C_GLCD_V_PULSE 10#define C_GLCD_V_FRONT_PORCH 2#define C_GLCD_V_BACK_PORCH 2#define LCD_RED 0xf800 /* red color */#define LCD_GREEN 0x07e0 /* green color */#define LCD_BLUE 0x001f /* blue color */#define LCD_BLACK 0x0000 /* black color */#define LCD_WHITE 0xffff /* white color */#define C_GLCD_PWR_ENA_DIS_DL Y 10000#define C_GLCD_ENA_DIS_DL Y 10000extern uint16_t LCD_Frame_Buffer[C_GLCD_H_SIZE * C_GLCD_V_SIZE];void GLCD_Init(void);void GLCD_Ctrl(BOOLEAN bEna);void SetPixelIndex(int x, int y, int PixelIndex);uint16_t GetPixelIndex(int x, int y);void GLCD_On(void);void GLCD_Off(void);#endif // __GLCD_DRV_H2)、drv_glcd.c文件#include <stdio.h>#include <stdlib.h>#include <assert.h>#include "board.h"#include "sdram_mt48lc2m32lfb5.h"#include "drv_glcd.h"#include "lpc177x_8x_clkpwr.h"#include "lpc177x_8x_pinsel.h"uint16_t LCD_Frame_Buffer[C_GLCD_H_SIZE * C_GLCD_V_SIZE];/************************************************************************** Function Name: GLCD_Init* Parameters: const uint32_t *pPain, const uint32_t * pPallete** Return: none** Description: GLCD controller init**************************************************************************/ void GLCD_Init(void){uint32_t i;//uint32_t *pDst = (uint32_t *)LCD_Frame_Buffer;//uint32_t p0,p1,p2,p3;/*Back light enable*///Turn on LCD clockCLKPWR_ConfigPPWR(CLKPWR_PCONP_PCLCD, ENABLE);// Disable cursorLPC_LCD->CRSR_CTRL &=~(1<<0);// disable GLCD controllerLPC_LCD->CTRL = 0;// 16 bppLPC_LCD->CTRL &= ~(0x07 <<1);LPC_LCD->CTRL |=(6<<1);// TFT panelLPC_LCD->CTRL |= (1<<5);// single panelLPC_LCD->CTRL &= ~(1<<7);// notmal output// LPC_LCD->CTRL &= ~(1<<8);LPC_LCD->CTRL |= (1<<8);// little endian byte orderLPC_LCD->CTRL &= ~(1<<9);// little endian pix orderLPC_LCD->CTRL &= ~(1<<10);// disable powerLPC_LCD->CTRL &= ~(1<<11);// init pixel clockLPC_SC->LCD_CFG = 1;//CLKPWR_GetCLK(CLKPWR_CLKTYPE_PER) / ((uint32_t)C_GLCD_PIX_CLK);// bypass inrenal clk dividerLPC_LCD->POL |=(1<<26);// clock source for the LCD block is HCLKLPC_LCD->POL &= ~(1<<5);// LCDFP pin is active LOW and inactive HIGHLPC_LCD->POL |= (1<<11);// LCDLP pin is active LOW and inactive HIGH// LPC_LCD->POL |= (1<<12);LPC_LCD->POL &= ~(1<<12);// data is driven out into the LCD on the falling edge// LPC_LCD->POL |= (1<<13);LPC_LCD->POL &= ~(1<<13);// active highLPC_LCD->POL &= ~(1<<14);LPC_LCD->POL &= ~(0x3FF <<16);LPC_LCD->POL |= (C_GLCD_H_SIZE-1)<<16;// init Horizontal TimingLPC_LCD->TIMH = 0; //reset TIMH before set valueLPC_LCD->TIMH |= (C_GLCD_H_BACK_PORCH - 1)<<24;LPC_LCD->TIMH |= (C_GLCD_H_FRONT_PORCH - 1)<<16;LPC_LCD->TIMH |= (C_GLCD_H_PULSE - 1)<<8;LPC_LCD->TIMH |= ((C_GLCD_H_SIZE/16) - 1)<<2;// init Vertical TimingLPC_LCD->TIMV = 0; //reset TIMV value before settingLPC_LCD->TIMV |= (C_GLCD_V_BACK_PORCH)<<24;LPC_LCD->TIMV |= (C_GLCD_V_FRONT_PORCH)<<16;LPC_LCD->TIMV |= (C_GLCD_V_PULSE - 1)<<10;LPC_LCD->TIMV |= C_GLCD_V_SIZE - 1;// Frame Base Address doubleword alignedLPC_LCD->UPBASE = (uint32_t)LCD_Frame_Buffer & ~7UL ;LPC_LCD->LPBASE = (uint32_t)LCD_Frame_Buffer & ~7UL ;for(i = C_GLCD_ENA_DIS_DL Y; i; i--);return ;}/************************************************************************* * Function Name: GLCD_Ctrl* Parameters: Bool bEna** Return: none** Description: GLCD enable disabe sequence**************************************************************************/void GLCD_Ctrl (BOOLEAN bEna){volatile uint32_t i;if (bEna){// LCD_CTRL_bit.LcdEn = 1;LPC_LCD->CTRL |= (1<<0);for(i = C_GLCD_PWR_ENA_DIS_DL Y; i; i--);// LCD_CTRL_bit.LcdPwr= 1; // enable powerLPC_LCD->CTRL |= (1<<11);}else{// LCD_CTRL_bit.LcdPwr= 0; // disable powerLPC_LCD->CTRL &= ~(1<<11);for(i = C_GLCD_PWR_ENA_DIS_DL Y; i; i--);// LCD_CTRL_bit.LcdEn = 0;LPC_LCD->CTRL &= ~(1<<0);}}void SetPixelIndex(int x, int y, int PixelIndex){if ((x < C_GLCD_H_SIZE) && (y < C_GLCD_V_SIZE)) {LCD_Frame_Buffer[x + y * C_GLCD_H_SIZE] = (uint16_t)PixelIndex;}}uint16_t GetPixelIndex(int x, int y){if ((x < C_GLCD_H_SIZE) && (y < C_GLCD_V_SIZE)) {return LCD_Frame_Buffer[x + y * C_GLCD_H_SIZE];}return 0;}void GLCD_On(void){uint32_t i;// LCD_CTRL_bit.LcdEn = 1;LPC_LCD->CTRL |= (1<<0);for(i = C_GLCD_PWR_ENA_DIS_DL Y; i; i--);// LCD_CTRL_bit.LcdPwr= 1; // enable powerLPC_LCD->CTRL |= (1<<11);}void GLCD_Off(void){uint32_t i;// LCD_CTRL_bit.LcdPwr= 0; // disable power LPC_LCD->CTRL &= ~(1<<11);for(i = C_GLCD_PWR_ENA_DIS_DL Y; i; i--); // LCD_CTRL_bit.LcdEn = 0;LPC_LCD->CTRL &= ~(1<<0);}。
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重点内容
1.目前国内普遍认同的嵌入式定义为:以应用为中心, 以计算机技术为基础, 软硬件可裁剪, 适应应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
2.嵌入式系统的特点:是专用的计算机系统。
系统资源需求较少。
使用高实时操作系统RTOS。
具有很好地可裁剪性。
功耗低、体积小、集成度高、成本低。
Ch31. GUI(Graphic User Interface)系统是是指计算机与其使用者之间的图形化对话接口。
2.嵌入式GUI具有以下特点:●体积小●功能强;●图形算法简洁、快速,占用系统资源少●高可靠性,高可裁剪性;●模块结构,上层接口与硬件无关,便于移植和定制3. GUI的主要特征:●Windows,采用窗口界面,每个窗口是用户或系统的一个工作区域。
一个屏幕上可以有多个窗口。
●Icons,采用形象化的图标或图符,易于操作者理解与操作。
●Menu,采用菜单,可供用户选择的功能提示●Pointing Devices ,指鼠标器、触摸屏等,便于用户直接对屏幕对象进行操作。
Ch41.正常文本GUI_TEXTMODE_NORMAL 或 0。
2.反转文本GUI_TEXTMODE_REVERSE。
3.透明文本GUI_TEXTMODE_TRANS4.透明反转文本GUI_TEXTMODE_TRANS |GUI_TEXTMODE_REVERSE5.文本对齐的选择:1). int GUI_GetTextAlign(void);返回当前文本对齐模式。
2).int GUI_SetTextAlign(int TextAlign);设置文本对齐模式,用于当前视窗的字符串输出。
水平对齐:GUI_TA_LEFT X轴方向左对齐(默认)GUI_TA_HCENTER X轴方向对中GUI_TA_RIGHT X轴方向右对齐(默认)垂直对齐:GUI_TA_TOP 在字符Y轴方向顶部对齐(默认)GUI_TA_VCENTER 在Y轴方向对中CUI_TA_BOTTOM 在字体Y轴底部线像素对齐Ch6 字体1.在应用程序中显示汉字的方式是通过字体转换器转换后得到的.C文件步骤:1.将所需显示的各种字体汉字库.C文件加入到Font目录中。
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)图形库
原创ucGUI入门心得
ucGUI 入门心得学习ucGUI 近一个月,感觉已经达到入门的级别,先前掌握的Windows 应用程序开发经验对于学习ucGUI 有着很大的帮助。
首先,我使用的是ucGUI 的高版本——emwin5.22 。
这个版本较旧版本多了些可用的控件和皮肤,这会让我们设计出外观更好,功能更强的界面。
然后,我们设计出来的界面需要在VC6.0 上进行调试。
网上可以下载到移植好的emwin及附带的小工具。
这些工具包括界面设计工具GUIBuilder ,图片转16进制数据工具BmpCvt和字体生成工具FontCvt。
用好这些工具对我们开发GUI有很大的帮助。
接着开始创建一个GUI 工程。
第一步用GUIBuilder 创建一个对话框做为窗体,第二步在这个对话框上面放上一些用到的控件,接下来对这些控件进行属性设置,这些都做完以后,点击保存菜单就会生成一个C文件。
VC6.0引用这个C文件就可以显示刚才设计的界面了。
如果让我们的界面更加美观就需要用到BmpCvt 工具,它可以把图片生成16 进制数据供图片框调用。
BmpCvt可以生成透明背景的图片,效果相当不错。
制作透明图片需要用到Photoshop,在PS里新建一个带透明背景的图片,然后把我们图片粘贴进去,再擦除一此不需要的颜色就可以了。
带透明背景的图片用BmpCvt打开以后,可以看到透明部分显示的是马赛克就对了。
用FontCvt 工具可以生成我们需要的各种字体,也包括汉字。
我习惯使用Keil 开发环境,Keil 里使用汉字是Ansi 编码,而FontCvt 生成的是Unicode 编码,这显然不能兼容。
这需要转换一下就可以直接使用了。
最后总结一下在使用emwin 过程中遇到的一些问题。
1. 在对话框里使用画线画多边形或显示文字这些基本绘图功能。
只需要在窗口回调函数下的WM_PAINT肖息里操作即可。
2. 在点取下拉列表的表项时,会点击到其下边的其它控件,造成误操作。
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配置文件内.。
uCGUIBuilder使用说明
一、ucGUBuilder使用方法 (2)1,新建ucGUI窗体 (2)2、设置窗体的属性 (3)3、向窗体添加控件 (4)二、V ersion 2.1.0.5 新增功能 (9)1、新增C语言语法高亮显示 (9)2、支持设计的窗体保存为文件,并可以打开 (9)3、对所有控件属性添加了Description (12)4、保存窗体布局 (13)三、Version 3.0.0.0 新增功能 (15)1、支持窗体设计器基本操作 (15)2、多控件操作 (15)3、文件关联 (16)4、在线检查更新 (18)5、自定义控件ID (20)四、Version 3.1.0.0新增功能 (22)1、添加了控件ID自动增加功能 (22)2、用户自定义字体 (22)3、中英文切换 (23)4、自动检查更新 (24)6、问题反馈或提建议 (25)五、Version 4.0新增功能 (27)1、代码分离 (27)2、添加编辑器工具栏 (28)3、内嵌VC编译器能直接运行模拟器 (29)4、如何使用代码自动完成功能 (30)声明:此程序用C#开发,需要.Net Framework 3.5或跟高版本支持大家在测试的过程中发现什么BUG或者有什么建议可以发Email:ucguibuilder@给我,一、ucGUBuilder使用方法1,新建ucGUI窗体或者单击新建窗体设计器工具栏按钮或者点下拉箭头选择新建窗体设计器新建后的效果:2、设置窗体的属性(包括大小,标题栏文本,……)3、向窗体添加控件(1)、在工具箱单击选中你要添加的控件将鼠标移动到窗体上,鼠标光标变成了十字形然后按住鼠标左键,拖动会出现一个矩形,拖动到合适大小,松开鼠标,在刚才矩形区域的地方就会添加一个同样大小的在工具箱选中的控件。
或者在工具箱中选中控件,将鼠标移动到窗体上,鼠标光标变成十字形时,单击鼠标,也能在单击处添加一个默认大小的选择的控件。
4、调整控件的大小及属性把鼠标移动到选中的控件四周的小方块上,当鼠标指针变成箭头时,按住鼠标左键就可向对应的方向调整控件大小,把鼠标移动到控件上,按住鼠标左键就可拖动控件,移动控件位置也可以,修改控件属性,来调整控件二、Version 2.1.0.5 新增功能1、新增C语言语法高亮显示2、支持设计的窗体保存为文件,并可以打开单击保存按钮或者菜单-》保存会弹出保存文件对话框选择路径,输入文件名即可保存(保存格式为ucfrm 格式)保存完毕。
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的值。
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)。
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添加汉字库方法
一找到UCGUIGenApp.exe程序,并打开,界面如下
二选择要转换的字体,这里选择“华文中宋,加粗,22号字体”
三因为全部导出的话文件会很大,因此根据项目需要,只导出特定的汉字做字库。
选择“指定范围导出GBK码”,输入要导出的汉字,并点“确定”。
四点击“确定”后,会自动生成字库的C文件,位置和uCGUIGenAPP.exe相同。
五将文件“Text_37.c”拷贝到/GUI/Font里,并在Keil工程中添加这个文件。
六打开Test_37.c文件,可见字库名已经被定义为“GUI_FontHZ_Test_37”
七修改GUI.h文件。
找到GUI.h中的“Standard Fonts”块,并在下方添加字库名“extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ_Test_37;”。
注意“;”号必须加入。
八设置好后就可以正常使用了,比如在按键上加汉字。
ucGUI触摸支持
ucGUI本身支持键盘,鼠标,触摸屏等外设,并在源码级对其消息进行了响应,为使得触摸屏正常工作,用户除实现触摸屏底层驱动之外,还必需对其相应配置文件的修改和添加一些相关函数。
文件中将宏GUI_SUPPORT_TOUCH概念为1。
文件包括触摸屏矫正时利用的一些宏概念,咱们需要依照目标板的具体配置设置具体的值,实验板2410,其中触摸板和液晶屏都是’’,修改后相应的值如下:#define GUI_TOUCH_AD_LEFT 60 #define GUI_TOUCH_AD_RIGHT 970#define GUI_TOUCH_AD_TOP 50 #define GUI_TOUCH_AD_BOTTOM 980#define GUI_TOUCH_SWAP_XY 1 #define GUI_TOUCH_MIRROR_X 1#define GUI_TOUCH_MIRROR_Y 1理论上来讲,GUI_TOUCH_AD_RIGHT 与GUI_TOUCH_AD_LEFT的取值或为0,或为1024(这是S3C2410内置的AD决定的),二者只取其一,GUI_TOUC_AD_BOTTOM与GUI_TOUCH_AD_TOP的取值一样遵守上述规定,可是在实际操作中往往可不能如此设置,均会依照具体情形灵活处置,进行校准操作,诸如windowsCE等其它嵌入式系统中利用触摸屏时一样也需要进行触摸屏校准操作,触摸屏的校正是在触摸屏底层驱动的基础上实现的,通过点击触摸板上边界点位置,经由串口打印的坐标值判定上述宏的取值。
咱们只取左上角和右下角两点坐标作为校正点,通过量次实验左上角坐标大约为(50,60), 右下角位置相应的值为(970,980), 故而确信相应宏的取值。
余下几个宏试均属于开关量,取值视相应情形而定。
在uCGUI框架基础上再增加一个文件,,该文件中增加四个函数:void GUI_TOUCH_X_ActivateX(void){} void GUI_TOUCH_X_ActivateY(void) {}int GUI_TOUCH_X_MeasureX(void) {} int GUI_TOUCH_X_MeasureY(void){}其中前面两个函数能够不予理会,只需在后面两个函数中返回测量值即可。
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专业论坛简介
『 闲话各路嵌入式GUI 』
收集与讨论各种嵌入式上应用的GUI,给学习与使用的人一个基本的介绍.
『 MacroWindow源码学习研究 』
学习ow的源码与设计结构,现已更名为Nano-X,并进行实际应用.
『 UCOS源码学习研究』
UCOS源码学习研究----学习小型的嵌入式多任务调度系统UCOS的多任务调度原理, 理解多任务之间的核心通信机制.
『 UCGUI专业论坛 』
---嵌入式图形系统与操作系统研究学习
版主:UCGUI
邮箱:UCGUI@
主页:/bbs
『 UCGUI源码学习研究 』
ucgui源码学习研究-----分析UCGUI的设计架构与思想, 并能进行实际应用中的改造, 最终打造自己的嵌入式GUI图形系统!
uCGUI介绍(8)解析
2018/10/19
13
2018/10/19
14
仿真器API
2018/10/19
15
文本显示
2018/10/19
16
文本显示
2018/10/19
2018/10/19
10
仿真器的目录结构
目录“Application”包括演示程序 的源代码。
目录“Exe”包括一个“ready-touse”演示程序。 目录“GUI”包括库文件和库使用 的包含文件。 目录“Sample”包括仿真范例及其 源代码。 目录“Simulation”包括仿真所需 的文件。 目录“Tool”包括µC/GUI观察器, 一个演示版的位图转换器和一个演 示版的字体转换器。
2018/10/19 3
硬件需求
2018/10/19
4
uCGUI特点
2018/10/19
5
uCGUI的结构
使µC/GUI和你的应用文件分离。 在工程文件的“root”目录的GUI子目录下保留 所有的程序文件(包括头文件),这是一个好的 习惯。 目录结构应该和下图相似。这种习惯有一个好处, 就是很容易升级更新版本的µC/GUI,只需要替 换GUI目录就可以。
2018/10/19 2
µC/GUI很适合大多数的使用黑色/白色和彩色 LCD的应用程序。
它有一个很好的颜色管理器,允许它处理灰阶。
µC/GUI也提供一个可扩展的2D图形库和一个视 窗管理器。
使用µC/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)。
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编译、连接、下载和固化),就可以很方便将其嵌入到产品中去。
设计者还可以根据系统应用程序的需要对uC/OS-I I进行相应的裁剪来减少产品中的uC/OS-II所需的存储器空间,这可以通过条件编译来实现。
2.3 uC/GUI接口uC/GUI 是运行于操作系统之上的程序,它既需要与操作系统的协调,又需要与各种输入输出设备的协调,来实现用户层与应用程序层的联结,即通过输入设备接收用户请求、通过输出设备反映微处理器的响应。
因此在这一过程中GUI至少要与3个对象打交道:输入设备、输出设备和操作系统。
因此uC/GUI接口主要包括2 个,与操作系统的接口和与输入输出设备的接口,这也正是在移植uC/GUI的过程中所要解决的关键问题。
对于操作系统,GUI作为操作系统的一个显示任务接受操作系统的调度,uC/GU I提供了与操作系统的接口支持。
与操作系统的接口主要解决系统实时性的要求。
对于用户输入,uC/GUI提供了键盘、鼠标以及触摸屏等支持,对于输出设备G UI反映微处理器的响应给用户是通过LCD输出图像来完成的,对于不同型号和显示原理的LCD要编制相应的驱动程序。
关于ucgui 的lcd驱动ucgui 是一个分层结构的gui系统,大概可以分为以下几个层次1、设备驱动层(LCD,键盘触摸屏等设备驱动)2、基本显示层3、在基本显示层上搭建的api层,字体等的显示4、窗口管理和控件层5、ap层这里主要记录显示驱动层的相关事项.ucgui的显示驱动层是显示的最下层,用户基本不用直接调用该层的接口,只有在移植和优化时要考虑修改和配置该层。
ucgui的lcd 驱动层是支持多lcd显示的,GUI_NUM_ LAYERS 宏来配置,GUI_NUM_LAYERS 最大为5.一、lcd驱动层的主要配置参数#define LCD_XSIZE (640) /* lcd 的X 方向的像素点数*/#define LCD_YSIZE (480) /* lcd 的Y 方向的像素点数*/#define LCD_BITSPERPIXEL (8) /* lcd 上每个像素点占的位数*/#define LCD_CONTROLLER 1375 /* lcd 控制器id号*/#define GUI_NUM_LAYERS /* lcd 的分层数目*/GUI_NUM_LAYERS 这个参数是分层显示的层数,ucgui中层可以是虚拟的显示层,也可以是实际的lcd屏。
这取决于各个层的接口函数。
二、lcd驱动需要提供的函数接口lcd驱动层要实现以下类型的接口函数typedef LCD_COLOR tLCDDEV_Index2Color (int Index);typedef unsigned int tLCDDEV_Color2Index (LCD_COLOR Color);typedef unsigned int tLCDDEV_GetIndexMask (void);typedef void tLCDDEV_DrawBitmap (int x0, int y0, int xsize, int ysize,int BitsPerPixel, int BytesPerLine,const U8 GUI_UNI_PTR * pData, int Diff,const void* pTrans); /* Really LCD_PIXELINDEX, but is void to avoid co mpiler warnings*/typedef void tLCDDEV_DrawHLine (int x0, int y0, int x1);typedef void tLCDDEV_DrawVLine (int x , int y0, int y1);typedef void tLCDDEV_FillRect (int x0, int y0, int x1, int y1);typedef unsigned int tLCDDEV_GetPixelIndex(int x, int y);typedef void tLCDDEV_SetPixelIndex(int x, int y, int ColorIndex);typedef void tLCDDEV_XorPixel (int x, int y);typedef void tLCDDEV_FillPolygon (const GUI_POINT* pPoints, int N umPoints, int x0, int y0);typedef void tLCDDEV_FillPolygonAA(const GUI_POINT* pPoints, int N umPoints, int x0, int y0);typedef void tLCDDEV_GetRect (LCD_RECT*pRect);typedef int tLCDDEV_Init (void);typedef int tLCDDEV_ReInit (void);typedef void tLCDDEV_On (void);typedef void tLCDDEV_Off (void);typedef void tLCDDEV_SetLUTEntry (U8 Pos, LCD_COLOR color);lcd驱动各个类型的接口函数的功能tLCDDEV_On 打开lcdtLCDDEV_Off 关闭lcdtLCDDEV_ReInit 重新初始化lcd,不清除lcd显示内容tLCDDEV_Init 初始化lcd,该是在初始化时被调用的,调用路径为GUI_Init->LCD_I nit->LCD_L0_Inittypedef void tLCDDEV_DrawBitmap(int x0, int y0, int xsize, int ysize,int BitsPerPixel, int BytesPerLine, const U8 GUI_UNI_PTR * pData, int Diff, const void* pTrans);功能:绘制位图参数:x0, y0 位图的左上角坐标xsize, ysize 位图宽度和高度BitsPerPixel 位图每个像素点占的位数BytesPerLine 位图每行的字节数pData 位图数据指针Diff 从左侧开始跳过的像素数pTrans 颜色转换表typedef LCD_COLOR tLCDDEV_Index2Color (int Index);将颜色索引转换成颜色值typedef unsigned int tLCDDEV_Color2Index (LCD_COLOR Color);将颜色值转换成颜色索引typedef unsigned int tLCDDEV_GetIndexMask (void);得到颜色索引的屏蔽字typedef void tLCDDEV_DrawHLine (int x0, int y0, int x1);功能:画一条水平线参数:x0 起点x坐标x1 终点x坐标y0 横线的y坐标typedef void tLCDDEV_DrawVLine (int x , int y0, int y1);功能:画一条垂直线参数:x 垂直线的x坐标y0 起点y坐标y1 终点y坐标typedef void tLCDDEV_FillRect (int x0, int y0, int x1, int y1); 功能:填充一个矩形参数:x0 , y0 矩形的左上角坐标x1 , y1 矩形的右上角坐标typedef unsigned int tLCDDEV_GetPixelIndex(int x, int y);读取给定点的颜色的索引typedef void tLCDDEV_SetPixelIndex(int x, int y, int ColorIndex); 以给定的颜色在指定的点画一个像素点typedef void tLCDDEV_XorPixel (int x, int y);反现指定点的像素typedef void tLCDDEV_FillPolygon (const GUI_POINT* pPoints, int N umPoints, int x0, int y0);填充一个多边形typedef void tLCDDEV_FillPolygonAA(const GUI_POINT* pPoints, int N umPoints, int x0, int y0);带抗锯齿功能的填充多边形typedef void tLCDDEV_GetRect (LCD_RECT*pRect);得到lcd的显示区域typedef void tLCDDEV_SetLUTEntry (U8 Pos, LCD_COLOR color);修改lcd控制器的LUT条目lcd 信息函数接口,每个显示层都应该提供lcd信息函数lcd 0层信息接口函数名如下:int LCD_GetXSize(void)读取lcd的物理宽度(像素值)int LCD_GetYSize(void)读取lcd的物理高度(像素值)int LCD_GetVXSize(void)读取lcd的虚拟宽度int LCD_GetVYSize(void)读取lcd的虚拟高度int LCD_GetBitsPerPixel(void)读取lcd每个像素的位数U32 LCD_GetNumColors(void)读取lcd颜色的数目int LCD_GetYMag(void)读取lcd虚拟高度的放大因子int LCD_GetXMag(void)读取lcd虚拟宽度的放大因子int LCD_GetFixedPalette(void)读取固定调试板的模式lcd 1-4层信息函数接口名如下:?=1,2,3,4int LCD_GetXSize_?(void)int LCD_GetYSize_?(void)int LCD_GetVXSize_?(void)int LCD_GetVYSize_?(void)int LCD_GetBitsPerPixel_?(void)U32 LCD_GetNumColors_?(void)int LCD_GetYMag_?(void)int LCD_GetXMag_?(void)int LCD_GetFixedPalette_?(void)uC/GUI与输入输出设备驱动接口模块设计本文以LCD驱动接口模块设计为例介绍在uC/GUI移植过程中LCD驱动程序的编写,以最终实现图形显示。