《基于UCGUI图形系统的机械时钟的实现毕业设计.doc》由会员分享,可在线阅读,更多相关《基于UCGUI图形系统的机械时钟的实现毕业设计.doc(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、摘要滁州职业技术学院信息工程系2015届嵌入式系统工程专业毕业论文姓 名: xxxxxxx 班 级: 嵌入式系统工程班 设计课题: 基于UCGUI图形系统的机械时钟的实现 指导教师: xxxxx 2014年12月5日摘要 这个项目是用ucgui来编写的一个时钟程序,其中涉及到了ucgui的安装以及使用,ucgui是指计算机与其使用者之间的图形化对话接口。用它可以更好的实现人机的对话。根据时钟流程这个思路来进行编写代码,这样可以使编程的效率提高,也可以保持一个清晰的思路,为后续的错误的修改提供了较好的保证。本项目主要就是介绍了时钟代码的编写和时钟在ucgui中的编译和生成的步骤和仿真结果以及涉及
2、到的相关知识的介绍。AbstractThis project is to use ucgui to write a clock procedures, which involves the installation and use of ucgui, ucgui refers to dialogue graphical interface between a computer and its users. It can better realize the man-machine dialogue. I according to the clock process the idea to wr
3、ite code, so that we can raise the efficiency of programming, also can let me keep a clear train of thought, for the subsequent error modification provides a good guarantee. This project is mainly introduced the clock code to write and clock in ucgui compile and generate the steps and the results of
4、 simulation and involves the introduction of relevant knowledge.目录 I目录第一章.UC/GUI简介1第二章 UCGUI开发平台的搭建以及使用32.1 Vc6.0的安装以及使用32.1.1 Vc6.0的安装32.1.2 Vc6.0的使用42.1.3 ucgui在vc6.0中的使用112.2 仿真器12第三章 编写前的知识储备153.1 初始化和转义字符153.2 其他的必要显示函数和画图函数15第四章 机械时钟的实现214.1 机械时钟的原理图214.2 机械时钟的算法流程图和代码214.3 运行结果图26第五章 总结27 遇到的
5、问题及解决方法27致谢28参考文献28 第一章.C/GUI简介C/GUI 是一种用于嵌入式应用的图形支持软件。它被设计用于为任何使用一个图形LCD的应用提供一个有效的不依赖于处理器和LCD 控制器的图形用户接口。它能工作于单任务或多任务的系统环境下。C/GUI 适用于使用任何LCD 控制和CPU 的任何尺寸的物理和虚拟显示。它的设计是模块化的,由在不同的模块中的不同的层组成。一个层,称作LCD 驱动程序,包含了对LCD 的全部访问。C/GUI 适用于所有的CPU,因为它100%由的ANSI 的C 语言编写的。C/GUI 很适合大多数的使用黑色/白色和彩色LCD 的应用程序。它有一个很好的颜色管
6、理器,允许它处理灰阶。C/GUI 也提供一个可扩展的2D 图形库和一个视窗管理器,在使用一个最小的RAM 时能支持显示窗口。C/GUI的功能特性如下:1 .任何8/16/32 位CPU;只需要一个与ANSI 兼容的C 编译器。 任何控制器支持(如果有合适的驱动程序)的任何(单色的,灰度级或者彩色)LCD。 在较小显示屏上,可以不要LCD 控制器工作。 使用配置宏可以支持任何接口。 显示屏大小可配置。 字符和位图可能是写在LCD 上的任一点,而不仅仅局限于偶数的字节的地址。 程序对大小和速度都进行了最优化。 允许编译时的切换以获得不同的优化。 对于较慢的LCD 控制器,LCD 能够被存储到内存当
7、中,减少访问的次数使其最小,从而得到非常高的速度。 清晰的结构。 支持虚拟显示;虚拟显示能够比实际的显示表现更大尺寸的内容。2.图库1 支持不同颜色深度的位图。 有效的位图转换器。 绝对没有使用浮点运算。 快速线/点绘制(没有使用浮点运算)。 非常快的圆/多边形的绘制。 不同的绘画模式。3.字体 为基本软件提供了不同种类的字体:4*6,6*8,6*9,8*8,8*9,8*16,8*17,8*18,24*32,以及8,10,13,16 等几种高度(以象素为单位)的均衡字体。可以定义和简便地链接新的字体。 只有用于应用程序的字体才实际上与执行结果链接,这样保证了最低的ROM占用。 字体可以分别在X
8、 轴和Y 轴方向上充分地缩放。 提供有效的字体转换器,任何在你的主系统(即Microsoft Windows)上的有效字体都可以转换。4.字符串/数值输出程序 程序支持任何字体的十进制,二进制,十六进制的数值显示。 程序支持任何字体的十进制,二进制,十六进制的数值编辑。5.视窗管理器(WM) 完全的窗口管理器包括剪切在内。一个窗口的外部区域的改写是不可能的。 窗口能够移动和缩放。 支持回调函数(可选择用法)。 WM 使用极小的RAM(大约每个窗口20 字节)。6.可选择用于PC外观的控件 控件(窗口对象)有效。它们一般自动运行,并且易于使用。7.触摸屏和鼠标支持 对于比如按钮控件之类的窗口对象
9、,C/GUI 提供触摸屏和鼠标支持。8.P C工具 模拟器及观察器。 位图转换器。 字体转换2第二章 ucgui开发平台的搭建以及使用2.1 Vc6.0的安装以及使用2.1.1 Vc6.0的安装(1)先将VC+6.0安装包在一个目录下(一个文件夹下),这样安装完VC+6.0就会自动识别到,并且安装 (2)解压VC6.0后,双击文件夹下的setup.exe,如图所示,依次点击【下一步】图2-1(3)选择【typical】图2-23(4)VC6.0安装成功! 图2-32.1.2 Vc6.0的使用 (1)启动 Visual C+ 6.0安装完毕之后从开始i菜单中可以启动 VC6 ,启动之后的界面如图
10、,左侧停靠窗口为工程资源管理器,用于从不同角度对工程资源进行查看和快速定位,下侧为信息输出窗口、调试信息、查找信息等都会从该窗口输出,主要显示区显示程序代码或者资源。图2-44 (2)建立新工程从“File”菜单选择“New”,切换到“Project”标签,根据需要选择工程类型,初学者可以选择简单的 “Win32 Console Application”来学习基本 C+ 语法,在右侧输入工程的名称及存储位置,点击“OK”,系统会启用向导来给用户生成程序框架以便快速进入开发,作为初学者,选择 “An Empty Project”手动来添加工程文件,点击“Finish”结束向导,界面如图所示。图2
11、-5 (3)为工程添加代码文件5 继续选择“File”菜单下的“New”,本次切换到“Files”标签,根据需要选择要添加到工程里的文件类型,选择其中的 C+ Source File,右侧输入文件名称及对应的扩展名 .cpp 。当代码文件添加完毕后,可以从左侧工程资源管理器的“FileView”文件视图查看当前的各类资源文件,“ClassView”则从类和函数的角度查看代码并可以通过双击快速定位。如果硬盘上已有代码文件,则可以通过 “Project”菜单项来将现有资源文件添加到当前工程。在“FileView”的对应文件上按“Del”键,则可以将文件从工程中移除(注:仅从工程中移除,并非从硬盘上
12、删除文件)。图2-6(4)书写程序代码双击“FileView”中的代码文件可以直接进入代码编辑状态,根据需要输入代码。如果代码书写较乱,可以使用 “Edit”菜单“Advanced”子菜单中的“Format Selection”进行格式化,快捷键 Alt+F8 。6如果对编辑区域字体不满意,可以在“Tools”菜单“Options”对话框中选择“Format”标签对源代码窗口字体进行定制。图2-7(5)编译并运行程序代码书写完毕,可以在“Build”或者“Build”工具栏上依次点击“Compile .”“Build .”“Excute .”来对程序进行编译、连接和运行,并观察程序运行结果。7
13、图2-8(6)程序的错误修改8如果编译或者连接过程中出现错误,底部信息提示窗口会提示错误所在行以及错误的类型,双击即可定位到相应的代码处进行修改,尔后重新编译连接运行,重复此过程直到程序功能达到要求没有错误。图2-9(7)单步调试如果需要单步跟踪每个语句的执行过程并观察运行结果,可以使用单步调试。首先在你希望程序运行停止的语句上点击工具栏图标设置断点(Break Point),然后可以使用 “Go”按钮(快捷键 F5)来启动应用程序,此时程序会在运行到断点处的时候暂停,你可以使用“Debug”工具栏上的“Setp Over”(快捷键 F10)“Step Into”“Stop Debugging
14、”来分别进行单步运行、进入函数内部单步运行和停止调试,如果你希望直接运行到下一个断点处,则再次点击“Go”即可。单步运行时,当前代码所在函数内部的变量的值变化情况会在底部的“Auto”标签中显示,用户也可以直接把鼠标放到想要查看值的变量名上来查看当前值。9图2-10(8)生成可执行文件并发布在编码、调试程序的功能完成之后,接下来进入程序的发布过程,以 DEBUG 模式编译的程序附加了很多调试信息,而且没有经过优化,所以速度慢体积大,当程序功能完备在交给实际用户使用之前,应该以 RELEASE 模式重新编译。点选“Build”菜单中的“Batch Build”即可选择编译模式。Debug和Rel
15、ease模式编译生成的文件默认会分别放置在工程目录的 Debug和Release文件夹下,只需要将生成的 exe 文件及程序操作需要的附属文件交给用户即可,C+ 代码及工程无需交付。10图2-112.1.3 ucgui在vc6.0中的使用(1)打开vc6.0选着【文件】【打开工作空间】图2-12(2)打开工作空间后找到【ucgui324】【文件类型】选着所有文件然后选着待.dsw的文件打开11图2-13(3)选着.dsw后会在工作区间出现ucgui的目录选着fileview图2-14(4)必要时可以把application中三个文件删掉,即可在main.c中编写代码图2-152.2 仿真器C/
16、GUI的PC仿真器允许你在Windows下编译相同的“C”源程序。PC使用一个本地编译器(一般是微软所提供的)并建立一个用于你自己应用的可执行文件。这样做可能完成: 在你的PC上进行用户接口设计(不需要硬件支持)12 调试你的用户接口程序 建立你的应用的演示,可以用于描述用户接口在Visual C+ 环境下模拟演示 :根目录包括微软Visual C+工作区(Simulation-Trial.dsw)及项目文件(Simulation-Trial.dsp)。双击工作区文件可以打开微软IDE。 Visual C+工作区的目录结构如下图所示。图2-16编译演示程序:位于应用目录下的演示程序源文件是一个
17、“ready-to-go”仿真,意思是你仅仅需要建立和启动它。请注意,如果需要建立可执行文件,你必须先安装微软Visual C+(6.0或以上的版本)。 第一步:双击Simulation-Trial.dsw 文件打开Visual C+工作区。 第二步:在菜单中选择“Build/Rebuild All” (或按“F7”键)重建项目。 第三步:在菜单中选择“Build/Start Debug/Go” (或按“ F5”键)开始仿真。 演示项目开始运行,在任意时候可能通过单击右键并选择“Exit”退出。编译范例程序:目录“Sample”包括“ready-to-go”范例程序,可以示范 C/GUI的不同
18、特性及提供它们的典型应用的例子。为了建立这些可执行文件,它们的C源代码必须加入项目中。通过下面的步骤很容易做到: 13 第一步:双击Visual C+工作区的“Application”文件夹。演示文件会出现在它下面。 第二步:选择“Application”文件夹下的所有文件,按下“Delete”键将它们删除。这些文件并不是真是被删除了,只是从项目中移走。 第三步:现在你有了一个空的“Application”文件夹。在其上面单击右键,选择需加入的文件加入到文件夹,出现一个对话框。 第四步:双击“Sample”文件夹,选择里面的一个范例文件。你的工作区目录应该如下图所示。当然,文件名可以不一样;在
19、这里,很重要的一件事是“Application”文件夹只能包含你所想编译的范例的C文件,而不能是其它种类的文件。图2-17 第五步:在菜单下选择“Build/Rebuild All”(或按“F7”键)重建范例文件。 第六步:在菜单中选择“Build/Start Debug/Go” (或按“F5”键)开始仿真。上面所选择范例的仿真结果如下图所示:图2-1814第三章 编写前的知识储备3.1 初始化和转义字符初始化C/GUI程序GUI_Init()初始化LCD 和C/GUI 的内部数据结构,在其它C/GUI 函数运行之前必须被调用。这通过将下面一行放入你的程序序列的开始来做到:GUI_Init()
20、;如果忽略了这个调用,整个图形系统将不会得到初始化,从而无法准备下一步的动作。转义字符转义字符是一种特殊的字符常量。转义字符以反斜线开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。 转义字符中小于32的字符代码称为控制字符。控制字符被定义为ASCII码的一部分。字符代码10 表示n 换行,改变当前文本坐标到下一行 反斜线符 单引号符ddd 13位八进制数所代表的字符xhh 12位十六进制数所代表的字符3.2 其他的必要显示函数和画图函数1. void GUI_Clear(void);含义:清除当前视窗。备注:如果没有定义视窗,当前视窗为整个显示区。这样
21、的话,整个显示区15都会被清除。2.void GUI_DispChar(U16 c);含义:在当前视窗使用当前字体在当前文本坐标处显示单个字符。参 数:C : 显示的字符备注:字符是否有效取决于所选择的字体,如果在当前字体中该字符无效,则不会有任何显示。3void GUI_DispCharAt(U16 c, I16P x, I16P y);含义:在当前视窗使用当前字体在指定坐标处显示单个字符。参数: C::显示的字符 X: 写到客户窗口经X轴坐标(以像素为单位) Y: 写到客户窗口经Y轴坐标(以像素为单位)备注:字符是否有效取决于所选择的字体,如果在当前字体中该字符无效,则不会有任何显示。4v
22、oid GUI_DispString(const char GUI_FAR *s);含义:在当前视窗的当前坐标,使用当前字体显示作为参数的字符串。参数:s 显示的字符串备注:字符串包括控制字符“n”。该控制字符把当前文本坐标移到下一行的开始处。5void GUI_DispStringAt(const char GUI_FAR *s, int x, int y);含义:在当前视窗,使用当前字体在指定坐标显示作为参数的字符串。参数:s 显示的字符串x 写到客户视窗的X轴坐标(以像素为单位)y 写到客户视窗的Y轴坐标(以像素为单位)6.char GUI_GotoXY(int x, int y);含义
23、:对当前视窗文本坐标的X坐标和Y坐标两部分同时设置。7.char GUI_GotoX(int x);含义:只对当前视窗文本坐标的X坐标部分进行设置,Y坐标保持不变。8char GUI_GotoY(int y);含义:只对当前视窗文本坐标的Y坐标部分进行设置,X坐标保持不变。参数:x 新的X轴坐标(以像素为单位,0为视窗左边界)16y 新的Y轴坐标(以像素为单位,0为视窗顶部边界)返回值:通常为0。如果返回数值非0,则当前文本坐标超出视窗范围(到了右边或下边),这样紧接着的写操作可能被忽略。9.int GUI_SetTextMode(int TextMode);含义:按照指定的参数设置文本模式。
24、参 数 TextMode 设置的文本模式,可以是文本模式标识的任意组合参数TextMode允许的数值(可以用“OR(或|)”进行组合)GUI_TEXTMODE_NORMAL 设置正常文本,这是默认的设置,该数值等同于0GUI_TEXTMODE_REVERSE 设置反转文本GUI_TEXTMODE_TRANSPARENT 设置透明文本GUI_TEXTMODE_XOR 反相显示的文本10void GUI_DispDec(I32 v, U8 Len); 含义:在当前视窗的当前文本坐标,使用当前字体显示一个十进制数值,指定显示字符的数量。参数: v 用于显示的数值。最小值为:-2147483648(-
25、231)最大值为:2147483647(231-1)Len 显示的数字的数量(最大为9)备注:如果数值为负,则会显示一个减号。11void GUI_DispDecAt(I32 v, I16P x, I16P y, U8 Len);含义:在当前视窗的当前文本坐标,使用当前字体显示十进制数值,指定显示字符的数量。参数: v 用于显示的数值。最小值为:-2147483648(-231),最大值为:2147483647(231-1)x 写入客户视窗的X坐标(以像素为单位) y 写入客户视窗的Y坐标(以像素为单位) Len 显示的数字的数量(最大为9)备注:如果数值为负,则会显示一个减号。12.选择字体
26、C/GUI 提供不同的字体,总会有其中的一种被选中。可以通过调用函数 GUI_SetFont()17 图3-113const GUI_FONT * GUI_SetFont(const GUI_FONT * pNewFont)图3-2含义:设置用于文字输出的字体参数:pFont 所选择及使用字体的指针返回值 返回先前所选择字体的指针,这样你可以在稍后一点恢复原先使用的字体 图3-318图3-414GUI COLOR GUI GetBkColor(void);含义:返回当前背景颜色15. GUI COLOR GUI_SetBkColor(GUI COLOR Color);含义:设置当前背景颜色。1
27、6void GUI_ClearRect(int x0, int y0, int x1, int y1);含义:在当前视窗的指定位置通过向一个矩形区域填充背景色来清除它。参数: x0 左上角X坐标 y0 左上角Y坐标 x1 右下角X坐标 y1 右下角Y坐标17void GUI_DrawPoint(int x, int y);含义:在当前视窗使用当前尺寸笔尖绘一个点。参数: x 点的X坐标 y 点的Y坐标18void GUI_DrawLine(int x0, int y0, int x1, int y1);含义:在当前视窗的指定始点到指定终点绘一条直线。参 数:x0 X轴开始坐标 y0 Y轴开始坐
28、标 x1 X轴结束坐标 y1 Y轴结束坐标备注:如果线的一部分是不可见的,因为它不在当前视窗内,或者如果当前视窗的一部分是不可见的,由于裁剪的原因,这些部分将不会绘出。19void GUI_DrawCircle(int x0, int y0, int r);含义:在当前视窗指定坐标以指定的尺寸绘制一个圆。参数: x0 在客户视窗中圆心的X轴坐标(以像素为单位) y0 在客户视窗中圆心的Y轴坐标(以像素为单位) r 圆的半径(直径的一半),最小值:0(结果是一个点),最大值:18019备注:该函数不能处理超过180的半径,因为那样将使用到导致溢出错误的整数运算。20void GUI_DrawAr
29、c (int xCenter, int yCenter, int rx, int ry, int a0, int a1);含义:在当前视窗的指定坐标按指定尺寸绘一段圆弧,一段圆弧就是一个圆的一部分轮廓。参数: xCenter 客户视窗中圆弧中心的水平方向坐标(以像素为单位)yCenter 客户视窗中圆弧中心的垂直方向坐标(以像素为单位)rx X轴半径(像素)。ry Y轴半径(像素) a0 起始角度(度)a1 终止角度(度)备注:现在不使用参数ry,取而代之的是参数rx,处理的参数rx/ry不能超过180,因为那样将使用到导致溢出错误的整数运算。20第四章 机械时钟的实现4.1 机械时钟的原理图
30、时钟表设计思想:第一步,确定秒钟的走时。将圆等分成60份每过一 秒,秒钟要转1/60个圆,亦即一等份。第二步,确定分钟的走时。将圆等分成60份每过一 分,分钟要转1/60个圆,亦即一等份。分钟自己走的再加秒钟的,才是分钟此时 的位置。第三步,确定时钟的走时。将圆等分成12等分.每过一时,时钟走一等份。得加上分钟,秒钟的走时,才是此刻时钟的位置。时钟走动与系统时间联系:每过一秒画出秒针,并除去前一秒的秒针,分针秒针同样可用。画线函数与时间联系使用变量4.2 机械时钟的算法流程图和代码。图4-1 21#include GUI.H#include math.h void DrawArcScale(v
31、oid)int x0 = 150;int y0 = 120; int i,j=0;int Hour=00,Sec=00, Min=00; unsigned num=12,11,10,9,8,7,6,5,4,3,2,1;GUI_Init();GUI_SetBkColor(GUI_LIGHTBLUE);GUI_Clear();/绘画表盘GUI_SetColor(GUI_LIGHTRED);GUI_SetPenSize(5);GUI_DrawArc( x0,y0,100, 100,0, 360 );GUI_SetFont(&GUI_Font8x16);for (i=0; i= 59; i+)int
32、x,y,x4,y4;float a,e;a= (i*6)*3.1415926/180;e= (90+i*6)*3.1415926/180;x =90*cos(a)+x0;y =-90*sin(a)+y0;x4 =80*cos(e)+x0-5;y4 =-80*sin(e)+y0-8;GUI_SetColor(GUI_BLUE);if (i%5 = 0)22GUI_SetPenSize( 5);GUI_DrawPoint(x,y); GUI_DispStringAt(const char *)numj,x4,y4); j+;elseGUI_SetPenSize( 3 );GUI_DrawPoint
33、(x,y);while(1)int j=0,x1,y1,x2,y2,x3,y3;float b,c,d;for(i=0;i60*60*12,Sec59;i+)b= (90-i*6)*3.1415926/180;c= (90-i*6/60)*3.1415926/180;d= (90-i*6/60/12)*3.1415926/180;x1 =80*cos(b)+x0;y1 =-80*sin(b)+y0; x2 =75*cos(c)+x0;y2 =-75*sin(c)+y0;x3 =50*cos(d)+x0;y3 =-50*sin(d)+y0;23GUI_SetPenSize(3);GUI_SetC
34、olor(GUI_YELLOW);GUI_DrawLine( x0, y0, x2, y2);GUI_SetPenSize(5);GUI_SetColor(GUI_LIGHTMAGENTA);GUI_DrawLine( x0, y0, x3, y3);/秒针+Sec;GUI_Delay(1);GUI_SetColor(GUI_GREEN);GUI_DispDecAt(Sec,165,55,2);GUI_SetPenSize(2);GUI_DrawLine( x0, y0, x1, y1);GUI_SetColor(GUI_LIGHTBLUE);GUI_DrawLine( x0, y0, x1,
35、 y1);GUI_SetPenSize(3);GUI_DrawLine( x0, y0, x2, y2);GUI_SetPenSize(5);GUI_DrawLine( x0, y0, x3, y3);if(j=60*12,Min=60) /时针j=0;Min=0;+Hour;GUI_SetColor(GUI_GREEN);GUI_DispDecAt(Hour,117,55,2);24if(Hour=24)Hour=0,Min=0;GUI_SetColor(GUI_GREEN);GUI_DispDecAt(Hour,117,55,2);GUI_DispDecAt(Min,142,55,2);i
36、f(Sec%2=0)GUI_SetColor(GUI_RED);GUI_DispCharAt(:,157,55);elseif(Sec%2=0)GUI_SetColor(GUI_RED);/设置颜色为红色GUI_DispCharAt(:,133,57);elseGUI_DispCharAt( ,132,55);/在固定的坐标中显示字符GUI_DispCharAt( ,157,55);/在固定的坐标中显示字符void main(void)/main函数GUI_Init();/初始化DrawArcScale();/DrawArcScale()的调用while(1)GUI_Delay(100);/延
37、时函数25264.3 运行结果图图4-227第五章 总结遇到的问题及解决方法1.在编译文件时没有把application中多余的文件删去,导致文件编译出现错误。解决办法:把文件中 多余的文件删除2.在画表盘的数字是定义出错:unsigned int num=12,11,10,9,8,7,6,5,4,3,2,1;解决办法:定义unsigned num=12,11,10,9,8,7,6,5,4,3,2,1;即可3.时针,分针以及秒针的换算在语法上出现错误4. main函数中while()错误:使指针无法显示出来void main(void)GUI_Init();DrawArcScale(); GU
38、I_Delay(10000);while(1)GUI_Delay(10000);解决办法:修改成一下内容即可void main(void)GUI_Init();DrawArcScale(); GUI_Delay(10000);while(1)GUI_Delay(10000);致谢衷心感谢我的导师。她严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励励着我。导师学识渊博,品德高尚,平易近人,在我学习期间不仅传授了做学问的秘诀,还传授了做人的准则,这些都将使我终生受益。在我毕业论文的写作过程中老师始终给予我精心的指导和不懈的支持。她循循善诱的教导和不拘一格的思路给予我无尽的启迪。在此谨向老师致以诚挚的谢意和祟高的敬意。同时,我也要向身边的同学表示感谢,因为论文中某些观点提出和他们的讨论是分不开的。路漫漫其修远兮,吾将上下而求索。我愿在未来的学习和研究过程中,以更加丰厚的成果来答谢曾经关心、帮助和支持过我的老师和同学。参考文献1 嵌入式C/GUI图形系统校本教材2C/GUI中文手册校本教材3嵌入式系统概述4嵌入式系统软件设计与实现5ucgui开源设计文档 29