版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
µC/GUILCD的应用提供一个有效的不依赖于处理器和LCD它的设计是模块化的,由在不同的模块中的不同的层组成。一个层,称作LCD驱动程序,包最小的RAM时能支持显示窗口。本指南描述如何安装,配置和在嵌入式应用中使用µC/GUI16/32/64CPUDSP8µC/GUI(RTOS虚拟显示,任何LCD控制器和CPU。其特点包括下列这些:参见第25章:“标准字体”。 支持回调函数(可选择用法真程序,在sample\EXESampleSample\GUIDemo包括一个展示大部分µC/GUI特点的应用程序。更详细的资料,请我们的: 所有的功能(应用程序接口,或者API。NewXYXY即值(X,Y)。在程序中需要用到X和Y坐标时,X坐标前面。显示屏(或者一个窗口)的LCDLCDConf.h这是一个很有效的LCD控制器方法,最值得推荐。LCD地址被定义为段LCDSEG,为了能该LCD,连接程序/只需要告知这些段位于什么地方。该位置必须与物理地址空间中地址相吻合。驱动程序对于这类接口是有效的,并且能用于不同的LCD控制器。个LCD的方法有稍微比直接总线接口慢一些的缺点,但是,特别是使用一个减少LCD访48性地将数据从高速缓存的内存传递到你的LCD。CµC/GUIsignedunsignedsignedunsignedsignedunsignedsignedunsigned16/32文件LCDConf.h中。第2章指使µC/GUI和你的应用文件分离,这是我们推荐的。在工程文件的“root” 的GUI子下保留所有的程序文件(包括头文件,这是一个好的习惯 结构应该和下图相似这种习惯有一个好处,就是很容易升级更新版本的µC/GUI,只需要替换 子 器件支持 (包括的先后顺序并不重要GUI/Widget(如果使用视窗控件库警告:你必须确认你在每个文件中只使用了一个版本的后进行编译和连接;或者建立一个库并连接这个库文件。如果你的工具支持“智能化”连接,建立一个库就很有意义了,否则如果将每样东西都要进行连接的话,程序会变得非常大。CPU从源程序建立一个库是一个简单的流程。第一步是拷贝批处理文件(位于“Sample\Makelib”下面)到根下。然后,做一些必要的修改。总共有四个批处理文 是将这些文件加入一个列表,这个列表是lib.bat是否录(GUI的上一级µC/GUI LCDConf.h节,请参阅第20需要的LCDConf.h。数值都可以激活,但是使用“1”使配置文件更易于阅读。这些开关能够启用或某一个选择开关用于从多个选项中选择一项(只能选中一项一个类似于简单的文本替代这样操作的宏。一个典型例子是定义U8,预处理程序会用“unsignedcharU8,来定制 开始运行。更详细的内容及范例程序的修改请参考第21章:次配置。到现在,你应该对如何使用µC/GUI特殊的µC/GUI函数和配置有效的宏。 在早些时候,一个“oWorld”程序被做为C语言编程的程序,因为它本质上是一个能写出的最简单的程序。µC/GUI的“oWorld”程序的名称是o.c,如下所示。在µC/GUI所带的范例中的它的名称为Basic_oWorld.c。文件 目的 绘制“oworld”的简单范#include 主函 void{ oworld!");}文件 目的 绘制“oworld”的简单范#include 主函 void{int oworld!");{GUI_DispDecAt(i++,20,20,4);if(i>9999)i=0;}}第3仿真的整个图形库I和视窗管理I与你的目标系统是一样的;所有函数运行与在目标的底层:D驱动。C仿真使用一个仿真的驱动写入一个位图,以代替实际的D驱动。在你的屏幕上显示的位图使用第二个仿真线程。第二个线程在实际应用并不存在,它只是在D 上面所示的 包括微软VisualC++工作区(Simulation-Trial.dsw)及项目文VisualC++工作区 结构如下图所示位于应用下的演示程序源文件是一个“ready-to-go”仿真,意思是你仅仅需要建立和启动它。请注意,如果需要建立可执行文件,你必须先安装微软VisualC++(6.0或以上的第一步:双击Simulation-Trial.dswVisualC+第二步:在菜单中选择“Build/RebuildAll”(或按“F7”键)第三步:在菜单中选择“Build/StartDebug/Go(或按“F5”键)开始仿真。第四步:双击“Sample”文件夹,选择里面的一个范例文件。你的工作区应该第五步:在菜单下选择“Build/RebuildAll”(或按“F7”键)第六步:在菜单中选择“Build/StartDebug/Go(或按“F5”键)开始仿真。上 可以在PC上的任意位置,例如:C:\work\GSCSim。 上面所显示的 包括微软VisualC++工作区(Simulation.dsw)和项目文(Simulation.dsp)VisualCGUI文件夹是打开的,显示µC/GUI子。请注意,你的GUI可能与下图并不完全一样,这取决于你所拥有的µC/GUI的附加区中显示。仿真演示包括一个或多个可以修改的C文件(在“Application”下),你也可以在片。你应该在VisualC++工作区中重建程序以进试及调试。一旦你获得一个满意的结果第一步:双击Simulation.dswVisualC++第二步:在菜单下选择“Build/RebuildAll”(或按“F7”键)第三步:在菜单中选择“Build/StartDebug/Go”(或按“F5”键)第四步:使用你的徽标或代替原有的位图第六步:在VisualC++中编译及运行应用程序,根据你的需要进行继续修观察器可能解决这个问题,它能显示仿真的LCD窗口和色彩窗口。观察器的执行文件是第二步:打开VisualC++的位置总是在顶部,你可能通过在菜单中选择“View\Alwaysontop”修改这个行为。为了仿真设备的外观,需要一幅位图。该位图通常是设备的(顶视图),必须命名 为一个可执行文件),或是做为一145BITMAPDISCARDABLE设备位图红域自动成为透明区。透明区没有必要是矩形;它们可以是任意的形状(甚至可是你的操作系统所限制的复杂形状,但是一般的就足够了)。亮红色(0)是默认的透明区域的颜,主要因为在大多数位图中很少用到这种颜色。如果位图中含有亮红色,你可MHardkey表示该Hardkey“没有按下”。在“按下”和“非按下”之间的切换行为也可以在程序的。该位图也作为里的一个独立文件或包括在可执行文件中做为一个资源。145BITMAPDISCARDABLE146BITMAPDISCARDABLE尽管在像素上一样,这样在e.mp上的Hy就能够正确地覆盖在eimp相应的位置上。下面的例子说明了这种情况:当一个键被鼠标“按下”,hardkey(Device1.bmp)的相应部分将覆盖设备位图以#include<windows.h>#include<stdio.h>#include"SIM.h"voidSIM_X_Init(){ LCD}函说voidSIM_SetLCDPos(intx,int 含x仿真LCD左上角(单位:像素)Xy仿真LCD左上角(单位:像素)YLCD。只有仿真屏幕的原点需要指定;你的显示器的分辨率应该已经反映在配置下的配置I32SIM_SetTransColor(I32 inty的序号遵循阅读顺序(从左到右,从上到下)。因此一个y最顶端的像素首先被发现,而不管它的水平位置如果。例如,在下面的位图中,Hardkey被标号,而在其y行:intSIM_HARDKEY_GetState(unsignedint Hardkey的(0=第一个键的 SIM_HARDKEY_CB*SIM_HARDKEY_SetCallback unsignedintSIM_HARDKEY_CB* Hardkey的(0=第一个键的typedefvoidSIM_HARDKEY_CB(intKeyIndex,int 含Hardkey的(0=第一个键的 intSIM_HARDKEY_SetMode(unsignedintKeyIndex,int 含Hardkey的(0=第一个键的行为模式(如下表所示 正常行为(默认 intSIM_HARDKEY_SetState(unsignedintKeyIndex,int Hardkey的(0=第一个键的 第4使用µC/GUIGUI_DispString("o上面的代码将会在当前文本坐标显示文本“oworld!”X=0;Y+=字体-距离()( o 函说GUI_voidGUI_DispChar(U16 cvoidGUI_DispCharAt(U16c,I16Px,I16P cxyvoidGUI_DispChars(U16c,int参 c重复的次数GUI_DispChars('*',30);voidGUI_DispString(constcharGUI_FAR s在屏幕上显示“oworld”及在下一行显示“Next o GUI_DispString("\nNext voidGUI_DispStringAt(constcharGUI_FAR*s,intx,int sxy在屏幕上坐标(50,20)处显示“PositionGUI_DispStringAt("Position50,20",50,20); 相关GUI_DispString(),GUI_DispStringAtCEOL(),该函数使用的参数与_tiA()完全一致。它也执行同样的操作:在指定坐标显示所给出的字符串。但是,完成这步操作后,它会调用UpEL函数清除本行剩下部分内容直至行末。如果字符串覆盖了其它的字符串,同时该字符串长度比原先的字符串短的时候,使用该函数就会很方便。voidGUI_DispStringInRect(constcharGUI_FARconstGUI_RECT*pRect,intAlign); sGUI_RECTrGUI_DispStringInRect("Text", ,GUI_TA_HCENTER|voidGUI_DispStringLen(constcharGUI_FAR*s,int s正常文本意思是指,文本覆盖已经显示的任何东西,在这种情况下,在字符中被设定的文本可能正常显示,此时模式标识应指定为GUI_TEXTMODE_NORMAL0通常情况下,用白色绘制的(实际字符)文本通过指定标识GUI_TEXTMODE_TRANS|GUI_TEXTMODE_REVERSEGUI_DrawLine(80,10,240,GUI_DrawLine(80,90,240, t("GUI_TM_NORMAL",160,10); t("GUI_TM_REV",160,26); t("GUI_TM_TRANS",160,42); t("GUI_TM_XOR",160,58);GUI_SetTextMode(GUI_TM_TRANS|GUI_TM_REV); t("GUI_TM_TRANS|GUI_TM_REV",160,74);intGUI_SetTextMode(int 设置正常文本,这是默认的设置,该数值等同于屏幕上坐标(0,0)处显示“Thevalueis”,设置文本模式为反转模式,再将其设回正inti=GUI_DispStringAt("Thevalueis",0,0);GUI_DispDec(20,3);intvoidGUI_SetLBorder(int xintGUI_SetTextAlign(int GUI_SetTextAlign(GUI_TA_HCENTER|GUI_TA_VCENTER);charGUI_GotoXY(intx,inty);charGUI_GotoX(intx);charGUI_GotoY(int xyGUI_DispString("Thevalueintintvoid在屏幕上显示“oworld”,等待1秒种,然后清除显示内容ovoid在屏幕上显示“oworld”,等待1秒钟,然后在同步坐标显示“Hi”,代替原先的GUI_DispStringAt("oworld",0, GUI_DispStringAt("Hi",0,0);第5然而,有时候这会是件的事。通常最容易(最有效)的是调用一个函数显示你所需任何系统。使用本章所述的函数有时能在ROM的空间和执行时间上进行精简。函说替首位的voidGUI_DispDec(I32v,U8 含v 最大值为 显示的数字的数量(最大为voidGUI_DispDecAt(I32v,I16Px,I16Py,U8参 v xy显示的数字的数量(最大为GUI_DispDecAT(Sec,200,0,voidGUI_DispDecMin(I32 v最小值为 (- GUI_DispString(“Theresultis:”);voidGUI_DispDecShift(I32v,U8Len,U8 v 最大值为 显示的数字的数量(最大为voidDispDecSpace(I32v,U8 v 最大值为 GUI_DispString(“Theresultis:”);GUI_DispDecSpace(Result,200);voidGUI_DispSDec(I32v,U8 V 最大值为 显示的数字的数量(最大为不首位为0的格式voidGUI_DispSDecShift(I32v,U8Len,U8 v 最大值为 显示的数字的数量(最大为void{longl=12345;GUI_DispSDecShift(l,7,3);GUI_DispStringAt(“Pressanykey”,0,GUI_VYSIZE-8);}voidGUI_DispFloat(floatv,char v最小值为:1.2E-38显示的数字的数量(最大为voidDemoFloat(void){floatf=123.45678;GUI_DispFloat(f,9);GUI_DispFloat(-f,9);GUI_DispFloatFix(f,9,2);GUI_DispFloatFix(-f,9,2);GUI_DispSFloatFix(f,9,2);GUI_DispSFloatFix(-f,9,2);GUI_DispFloatMin(f,3);GUI_DispFloatMin(-f,3);GUI_DispSFloatMin(f,3);GUI_DispSFloatMin(-f,3);GUI_DispStringAt(“Pressanykey”,0,GUI_VYSIZE-8);}voidGUI_DispFloatFix(floatv,charLen,char V最小值为:1.2E-38显示的所有数字的数量(最大为voidGUI_DispFloatMin(floatf,char v最小值为:1.2E-38voidGUI_DispSFloatFix(floatv,charLen,char v最小值为:1.2E-38显示的所有数字的数量(最大为voidGUI_DispSFloatMin(floatf,char v最小值为:1.2E-38voidGUI_DispBin(U32v,U8 v显示的数字的数量(包括首位的U32Input=0x7;GUI_DispBin(Input,voidDispBinAt(U32v,I16Py,I16Px,U8 vxy显示的数字的数量(包括首位的GUI_DispBinAt(Input,0,0,8);相关GUI_DispBin(),voidGUI_DispHex(U32v,U8 vGUI_DispDec(),GUI_DispBin(),constchar*第62-D被绘图所完。在XOR模式,当绘图覆盖在上面时,显示屏的内容反相显示。作于一个像素大小的笔尖尺寸。这意味着在使用类似GUI_DrawLine当使用诸如GUwoLne这样的函数或多次调用Dwo函数,转角点会反相两次。结果是这些像素保持背景颜色。GUI_DRAWMODEGUI_SetDrawMode(GUI_DRAWMODE GUI_FillCircle(120,64,40);GUI_FillCircle(140,84,40);使用任何有效的绘图模式。因为这些函数在大多数应用中被频繁调用,因此它们已经被尽量voidGUI_ClearRect(intx0,inty0,intx1,int 含voidGUI_DrawPixel(intx,int xyvoidGUI_DrawPoint(intx,int参 xyvoidGUI_FillRect(intx0,inty0,intx1,int参 voidGUI_InvertRect(intx0,inty0,intx1,int voidGUI_DrawBitmap(constGUI_BITMAP*pBM,intx,int xy址开始,而位图的第N行在地址偏移量n*BytesPerLine处开始。位图可以在客户区中任意一externconstGUI_BITMAPbmMicriumLogo; /*外部位图*/voidmain(){}voidGUI_DrawBitmapExp(intx0,intintXSize,intYSize,intXMul,intYMul,intBitsPerPixel,intBytesPerLine,constU8*pData,constGUI_LOGPALETTE* xyvoidGUI_DrawBitmapMag(constGUI_BITMAP*intx0,intintXMul,int voidGUI_DrawStreamedBitmap constGUI_BITMAP_STREAMintx,inty); xyvoidGUI_DrawHLine(inty,intx0,int yvoidGUI_DrawLine(intx0,inty0,intx1,int voidGUI_DrawLineRel(intdx,int voidGUI_DrawLineTo(intx,int xyvoidGUI_DrawPolyLine(constGUI_POINT*pPoint,intNumPoints,intx,int参 xyvoidGUI_DrawVLine(intx,inty0,int xvoidGUI_DrawPolygon(constGUI_POINT*pPoint,intNumPoints,intx,int xyvoidGUI_EnlargePolygon GUI_POINT*constGUI_POINT*pSrc,intNumPoints,int参含#definecountof(Array)(sizeof(Array)/sizeof(Array[0]))constGUI_POINTaPoints[]={{0,{40,{20,GUI_POINTaEnlargedPoints[countof(aPoints)];voidSample(void){intGUI_FillPolygon(aPoints,countof(aPoints),140,110);for(i=1;i<10;i++){GUI_EnlargePolygon(aEnlargedPoints,countof(aPoints),i*5);GUI_FillPolygon(aEnlargedPoints,countof(aPoints),140,110);}}voidGUI_FillPolygon(constGUI_POINT*pPoint,intNumPoints,intx,int参 xyvoidGUI_MagnifyPolygon GUI_POINT*constGUI_POINT*pSrc,intNumPoints,int参 #definecountof(Array)(sizeof(Array)/sizeof(Array[0]))constGUI_POINTaPoints[]={{0,{40,{20,GUI_POINTaMagnifiedPoints[countof(aPoints)];voidSample(void){intMag,y=0,Count=4;for(Mag=1;Mag<=4;Mag*=2,Count/={inti,x=GUI_MagnifyPolygon(aMagnifiedPoints,countof(aPoints),Mag);for(i=Count;i>0;i--,x+=40*Mag){GUI_FillPolygon(aMagnifiedPoints,countof(aPoints),x,}y+=20*}}voidGUI_RotatePolygon(GUI_POINT*constGUI_POINT*pSrc,intNumPoints,float 多边形旋转的角度(以弧度为单位文件 目的 绘制一个多边#include 箭头的 staticconstGUI_POINTaPointArrow[]={0,-{-40,-{-10,-{-10,-{10,-{10,-{40,- 绘制一个多边 staticvoid{intCnt=0;GUI_DispStringAt("Polygonsofarbitraryshape",0,GUI_DispStringAt("inanycolor",120,20);/*GUI_FillPolygon} NumPoints: 主函 void{}voidGUI_DrawCircle(intx0,inty0,int rvoid{intfor(i=10;i<50;i++)}voidGUI_FillCircle(intx0,inty0,int rvoidGUI_DrawEllipse(intx0,inty0,intrx,int voidGUI_FillEllipse(intx0,inty0,intrx,int /*GUI_FillEllipse(100,GUI_DrawEllipse(100,GUI_FillEllipse(100,voidGL_DrawArc(intxCenter,intyCenter,intrx,intry,inta0,int 客户视窗中圆弧中心的水平方向坐标(以像素为单位客户视窗中圆弧中心的垂直方向坐标(以像素为单位起始角度(度终止角度(度void{intx0=160;inty0=180;inti;charac[4];GUI_SetPenSize(5); GUI_SetColor(GUI_BLACK);GUI_DrawArc(x0,y0,150,150,-30,210);for(i=0;i<=23;{floata=(-30+i*10)*3. intx=-141*cos(a)+x0;inty=-141*sin(a)+y0;if(i%2==0)GUI_SetPenSize(5GUI_SetPenSize(4if(i%2==0){x=-123*cos(a)+x0;y=-sprintf(ac,"%d",10*i);}}}第7随µC/GUI一章描述了µC/GUI用于建立反信息的比例位图字体,带有4bpp(位/像素)用于建立反信息的反字GUIConf.h规范相兼容的“字体的描述要包含在GUIConf.h中(这很必要,这是为了避免由于没有的外部一旦你连接过一个如上面所描述的字体文件,将要连接的字体为一个外部常externconstGUI_FONTGUI_FontNew;intmain(void){GUI_Init();GUI_SetFont(&GUI_FontNew); oworld\n");return0;}GUIConf.h用连接,因此可能会耗尽ROM空间。老版本的µC/GUI一个等级,字体标识符(例如F6x8)依然有效。函说constGUI_FONT*constGUI_FONT*GUI_SetFont(constGUI_FONT*pNewFont)void{constGUI_FONTGUI_FLASH*OldFont=GUI_SetFont(&GUI_Font8x16);GUI_DispStringAt("Thistextis8by16pixels",0,0);GUI_DispStringAt("Thistextis6by8pixels",0,20);GUI_DispStringAt("Thistextisproportional"040); //恢复字体}GUI_SetFont(&GUIGUI_DispString("Theresult intGUI_GetCharDistX(U16cint字体Y轴方向距离数值。该返回值对于比例字体及等宽字体都有效。voidGUI_GetFontInfo(constGUI_FONT*pFont,GUI_FONTINFO*typedef{U16GUI_FONTINFOFontInfo;GUI_GetFontInfo(&GUI_Font6x8,&FontInfo);int返回值是当前选择字体Y轴方向大小数值。该值小于或等于通过执intGUI_GetStringDistX(constcharGUI_FARsintGUI_GetYDistOfFont(constGUI_FONT*intGUI_GetYSizeOfFont(constGUI_FONT*参考charGUI_IsInFont(constGUI_FONT*pFont,U16cif(GUI_IsInFont(&GUI_FontD32,'X')=={GUI_DispString("GUI_FontD32doesnotcontains'X'}0123456789ABCDEF!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~很不幸,因为ASCII立足于用于信息互换的标准,它为的需要而制定。它不包程序所接受的标准是ISO8859-1,一个ASCII字符的扩展集。ISO8859-1non-breakinginverted¡cent¢pound£generalcurrency¤yen¥brokenvertical¦section§umlaut¨©feminineªleftanglequote,«not¬softregistered®macron¯degree°plusor±superscript²superscript³acute´microµparagraph¶middle·¸superscript¹masculineºrightanglequote,guillemot»fraction¼fractionone-½fraction¾invertedquestion¿capitalA,graveÀcapitalA,acuteÁcapitalA,circumflexÂcapitalA,ÃcapitalA,dieresisorumlautÄcapitalA,ÅcapitalA,diphthongÆcapitalC,ÇcapitalE,graveÈcapitalE,acuteÉcapitalE,circumflexÊcapitalE,dieresisorumlautËcapitalI,graveÌcapitalI,acuteÍcapitalI,circumflexÎcapitalI,dieresisorumlautÏEth,ÐN,ÑcapitalO,graveÒcapitalO,acuteÓcapitalO,circumflexÔcapitalO,ÕcapitalO,dieresisorumlautÖmultiply×capitalO,ØcapitalU,graveÙcapitalU,acuteÚcapitalU,circumflexÛcapitalU,dieresisorumlautÜcapitalY,acuteÝTHORN,Þsharps,German(s-zßsmalla,graveàsmalla,acuteásmalla,circumflexâsmalla,ãsmalla,dieresisorumlautäsmalla,åsmallaediphthongæçsmalle,graveèsmalle,acuteésmalle,circumflexêsmalle,dieresisorumlautësmalli,graveìsmalli,acuteísmalli,circumflexîsmalli,dieresisorumlautïsmalleth,ðsmalln,ñsmallo,graveòsmallo,acuteósmallo,circumflexõsmallo,õsmallo,dieresisorumlautödivision÷smallo,øsmallu,graveùsmallu,acuteúsmallu,circumflexûsmallu,dieresisorumlautüsmally,acuteýsmallthorn,þsmally,dieresisorumlautÿ求16位的字符,因为所有的字符都有它们的固。目前,已经定义了超过30,000个不同作。请联系Micrium公司,或你的人,因为我们可能有你所需要的字符。WindowsWindows能用于µC/GUICGUI_BITMAP的相当的数据,可能相当大。在手工产生这些位图时,耗时巨大且效率很低,特别是你在处理相当大的及多级灰度梯度或颜色时。因此,我们推荐使用位图转换器。PC“C”文件。同时也能够进行色彩转AdobePhotoshopCorelPhotopaint。通常,使用这些软件进行图像一幅图像必须首先以一个.bmp以下类型的.bmp文件可以在程序中载入:转换后的位图可以保存为一个.bmp(可以再次载入及使用或用其它位图处理软件载庞大。对于全彩色位图,很有必要将其转换成调色板格式的位图,因为位图转换器不能从一在这个例子中,选择的位图文件是选择“Image/ConvertInto.”再选择所“Bestpalette(最佳调色板”际颜色都包括在这16种颜色当中。类型,在本范例中,文件以“Cwith位图转换器将在指定建立一个独立的文件,该文件包括位图的C代码。实现这个目的最普通的办法是如上面范例所述的使用“Bestpalette”选项,这是给专在菜单中选择“Image/ConvertInto/Bestpalette”就可实现。选择“Image/Convert板),应必须用到一个定制调色板。你可以选择菜单中的“Image/ConvertInto/Custom因此整个文件大小为:16+(NumColors*4)个字节。一个8种颜色的定制调色板将会占用:168*4)48该范例文件定义一个调色板,包含两种颜色:红与白:656d57696e50616c020000000000000010:ff000000ffffff个字节,第4个字节为0:RRGGBB00。因此代码的第二行定义该范例用到的两种颜色。在命令行下也同样有效。用于一幅位图处理的很多函数都可以用单行令行完成。命令输BmpCvt<文件名>.bmp(如果用到多个命令,则在每两个命令之间要用一个空格隔开BmpCvtMicriumLogo200.bmp-convertintobestpalette-saveaslogo2,1-注意,当文件载入位图转换器总是包括它的.bmpsaveas名。用一个整数指定的所需要获得的文件类型。在上面-saveas“1”表示“带下表列出了所有允许的位图转换器令。你也可以随时通过在命令提示行中键入命令“BmpCvt/?”获得这些内容。命说Invert-saveas<filename,type:1~6“C”文件(.c文件“C”文件(.c压缩的带调色板的“C”文件(.cC”文件(.c流(.dtaWindows的位图文件(.bmpC-filegeneratedbyµC/BmpCvtV2.30b,compiledMay82002,10:05:(c)2002Micrium, (c)1998-2002SeggerMicrocontrollerSystemeSourcefile:MicriumLogoBlueDimensions:269*#include"stdlib.h"#include/*ThefollowingaretheentriesofthepaletteEveryentryisa32-bitvalue(ofwhich24bitsareactuallyused)the8bitsrepresenttheRedthemiddle8bitsrepresenttheGreenthehighest8bits(ofthe24bitsused)representtheBluecomponentasfollows: /*numberofentries*/ /*Notransparency*/constunsignedcharacMicriumLogoBlue[]=0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,...0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x20,0x01,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,constGUI_BITMAPbmMicriumLogoBlue= /*XSize76,/*YSize /*BytesPerLine /*BitsPerPixelacMicriumLogoBlue,/*Pointertopicturedata(indices)&PalMicriumLogoBlue/*Pointertopalette/****Endoffile***位图中用到的总像素的数量为269×76=20444。两个像素,则图像尺寸未压缩为20444÷2=10222字节。C-filegeneratedbyµC/BmpCvtV2.30b,compiledMay82002,(c)2002Micrium,(c)1998-2002SeggerMicrocontrollerSystemeGmbHSourcefile: Dimensions:269*76#include"GUI.H"/*ThefollowingaretheentriesofthepaletteEveryentryisa32-bitvalue(ofwhich24bitsareactuallyused)thelower8bitsrepresenttheRedcomponent,themiddle8bitsrepresenttheGreenthehighest8bits(ofthe24bitsused)representtheBluecomponentasfollows:0xBBGGRRconst pressed[]{const pressed{10,/*numberofentries0,/*Notransparencyconstunsigned pressed[]=@254,@254,@1,@254,@0,2,/*@0,2,/*RLE:267Pixels@001,074*/254,0x01,13,/*ABS:003Pixels@268,074*/0,3,0x20,/*RLE:267Pixels@002,075*/254,0x02,13,0};/*4702for20444pixelsconst pressed{269,/*XSize76,/*YSize135,/*BytesPerLinepressed,/*Pointertopicturedata(indices)pressed/*Pointertopalette/****Endoffile***第9µC/GUI(不同亮度的单色)及彩色显示屏。同一个用户程序可以用于不位的数值,其中每个基色8位,如:0xBBGGRR。因此,白色应该为0xFFFFFF,黑色应该为0x000000,大红为0xFF0000。LCD,µC/GUI本的“最小平方偏移搜索”对它们进行转换。它对显示的颜色(逻辑颜色)LCD示(物理颜色)的所有有效颜色进行比较,然后使用LCD度量认为最接近的颜色。黑蓝绿青红GUI_BROW褐灰黄白/*将背景色设为洋红*/320*240色及灰度,同时纠色转换。屏幕截图来自Windows仿真器,如果你的设置和硬件是适当的,它看起来和你的显示屏实际输出正确的吻合。该程序在随µC/GUI文件 COLOR目的 绘制一个色彩条的例#include void{intx0=60,y0=40,yStep=15,intNumColors=LCD_GetDevCap(LCD_DEVCAP_NUMCOLORS);intxsize=LCD_GetDevCap(LCD_DEVCAP_XSIZE)-x0; t("µC/GUI-sample:Showcolorbars",160,0);GUI_DispString("Fixedpalette:");GUI_DispStringAt("Red",0,y0+yStep);GUI_DispStringAt("Green",0,y0+3*yStep);GUI_DispStringAt("Blue",0,y0+5*yStep);GUI_DispStringAt("Grey",0,y0+6*yStep);GUI_DispStringAt("Yellow",0,y0+8*yStep);GUI_DispStringAt("Cyan",0,y0+10*yStep);GUI_DispStringAt("Magenta",0,y0+12*yStep);for(i=0;i<xsize;i++){U16cs=(255*(U32)i)/xsize;U16x=x0+i;;/*GUI_DrawVLine(x,y0,y0+yStep-1);GUI_SetColor(0xff+(255-cs)*0x10100L);GUI_DrawVLine(x,y0+yStep,y0+2*yStep-1);/*GUI_DrawVLine(x,y0+2*yStep,y0+3*yStep-1);GUI_SetColor(0xff00+(255-cs)*0x10001L);GUI_DrawVLine(x,y0+3*yStep,y0+4*yStep-1);/**GUI_SetColor(cs*GUI_DrawVLine(x,y0+4*yStep,y0+5*yStep-1);GUI_SetColor(0xff0000+(255-cs)*0x101L);GUI_DrawVLine(x,y0+5*yStep,y0+6*yStep-1);/*GUI_SetColor((U32)cs*GUI_DrawVLine(x,y0+6*yStep,y0+7*yStep-/*GUI_SetColor(cs*GUI_DrawVLine(x,y0+7*yStep,y0+8*yStep-1);GUI_SetColor(0xffff+(255-cs)*0x10000L);GUI_DrawVLine(x,y0+8*yStep,y0+9*yStep-1);/*GUI_SetColor(cs*GUI_DrawVLine(x,y0+9*yStep,y0+10*yStep-1);GUI_SetColor(0xffff00+(255-cs)*0x1L);GUI_DrawVLine(x,y0+10*yStep,y0+11*yStep-1);/*GUI_SetColor(cs*GUI_DrawVLine(x,y0+11*yStep,y0+12*yStep-1);GUI_SetColor(0xff00ff+(255-cs)*0x100L);GUI_DrawVLine(x,y0+12*yStep,y0+13*yStep-1);} 主函 void{GUI_Init();}#define(12(黑和白1024(灰度20416(灰度40800000-10-1011bpp(黑和白22bpp(4有效颜色数量:2×244bpp(168模式。如果你的硬件只支持每像素每基色1如果你的硬件没有一个调色板用于每种单独2233233-233233849332332848×8×4=256-332332444444红,绿,蓝每部分平均分配4位。555555使用该模式需要一个支持15bpp的RGB颜色深-55555556556532×64×32=65536.-565565有效颜色数量:32×64×32=65536.86668bpp616该模式多数用于一个可编程的颜色查询表6级有效亮度,附加16级灰度。有效颜色数量:LCDµC/GUI能PC#defineLCD_FIXEDPALETTE#defineLCD_PHYSCOLORS0xffffff,0xaaaaaa,0x555555,一个查询表的条目,或者颜色映射,定义一个指定的RGB数值。阶段(GUI_Init()LCD_Init()LCD_InitLUTLCD_L0_SetLUTEntry())进行初始化。然而,它可能需要在运行时修改LUT(因为不同的理由。一些可能的理由包括:需要使用比硬件能显示颜色(在一个时间段)的颜色(在不同的时间GUIConf.h(LCD_PHYS_COLORS)进行编译时被定义。为API函数GUI_SetLUTColor()会有效,就能用于在同一时间修改颜色表和LUT的内容。说设置一种索引色的颜色(硬件及颜色表GUICOLORGUIintGUICOLORGUIintGUICOLORGUISetBkColor(GUICOLOR intGUI_SetBkColorIndex(int参 voidGUI_SetColor(GUI_COLOR voidGUI_SetColorIndex(int intGUI_Color2Index(GUI_COLOR intGUI_Index2Color(int参 LCDvoidLCD_InitLUT(void)voidGUI_SetLUTColor(U8Pos,GUI_COLOR 4bpp为0~15,8bpp为0~255)设置为同一个数值(例如0x555555或0xa0a0a0。该函数需要激活查询表(LCD_INITCONTROLLER)才有效果。该函数总是有效的,voidGUI_SetLUTEntry(U8Pos,GUI_COLOR 4bpp为0~15,8bpp为0~255)设置为同一个数值(例如0X555555或0Xa0a0a0。该函数需要激活查询表(LCD_INITCONTROLLER)才有效果。该函数常常用于确保GUI_SetLUTEntry(0,0x000000);GUI_SetLUTEntry(1,0x777777);GUI_SetLUTEntry(2,0xbbbbbb)GUI_SetLUTEntry(3,0xffffff)第10章设基本的思路很简单。没有使用设备时,绘图操作直接写屏。屏幕在绘图操作在执行时更然而,如果这样的操作使用一个设备的话,所有的操作在设备内执行。只有在二者的区别总结如下:如果不使用设备,绘图的操作的效果看起来是一步一步的,带来闪烁的缺点。而使用设备,所有程序执行的效果看起来象单步操作,没有中间步骤设备是一个附加(可选)的软件项目,不随µC/GUI的基本软件包一起发布。设备的软件包位于子GUI\Memdev下。下表是屏幕截图显示使用设备和不使用设备完成同样操作。两个例子的目的是一样的:旋转一个工件,标注各自的旋转角度(10。在第一个例子(不使用存一个设备,同样的操作在器执行,但是屏幕在这个时候并没有更新。唯一的更新出使用设步骤5:(只有在使用设备时有建立设备(使用GUI_MEMDEV_Create;激活它(GUI_MEMDEV_Select;将结果拷贝到显示屏(使用GUI_MEMDEV_CopyToLCD;GUI_MEMDEV_Delete置文件GUIConf.h中加入下面一行而关闭:#define 改为1。API函说GUI_MEMDEV_Create建立设备(第一步GUI_MEMDEV_CopyToLCDGUI_MEMDEV_DeleteGUI_MEMDEV_SelectGUI_MEMDEV_ClearGUI_MEMDEV_CopyFromLCDGUI_MEMDEV_GetYSizeGUI_MEMDEV_ReduceYSizeGUI_MEMDEV_SetOrgGUI_MEMDEV_DrawGUI_MEMDEV_CreateAutoGUI_MEMDEV_DeleteAutoGUI_MEMDEV_DrawAutoGUI_AUTODEVGUI_MEMDEV_HandleGUI_MEMDEV_Create(intx0,inty0,intXSize,int voidGUI_MEMDEV_CopyToLCD(GUI_MEMDEV_Handle voidGUI_MEMDEV_Delete(GUI_MEMDEV_Handle voidGUI_MEMDEV_Select(GUI_MEMDEV_Handle voidGUI_MEMDEV_Clear(GUI_MEMDEV_Handle 使用GUI_MEMDEV_CopyToLCD的下一步绘图操作是,只有在GUI_MEMDEV_ClearvoidGUI_MEMDEV_CopyFromLCD(GUI_MEMDEV_Handle 从区域拷贝设备的内容(反锯齿)到LCDvoidGUI_MEMDEV_CopyToLCDAA(GUI_MEMDEV_Handle GUI_MEMDEV_HandlehMem=GUI_MEMDEV_Create(0,0,60,32);intGUIMEMDEVGetYSize(GUIMEMDEVHandle voidGUIMEMDEVReduceYSize(GUIMEMDEVHandlehMem,int voidGUI_MEMDEV_SetOrg(GUI_MEMDEV_HandlehMem,intx0,int 水平坐标(左上角像素垂直坐标(左上角像素 范例见Source\Misc\MemDev.c文件。文件 目的 展示如何使用设备的简单例#include 展示设备的使 staticvoidDemoMemDev(void){GUI_MEMDEV_HandlehMem;{/*建立设备……hMem=GUI_MEMDEV_Create(0,0,110,/*向设备绘一个文本 GUI_DispStringAt(“Memorydevice”,0,0);}} 主函 void{}一个设备首先通过执行指定的绘图函数进行内容填充。设备填充完毕后,其内容写入LCD。有些情况下,可能会没有足够的有效器空间能够立刻用于所有输出区域的,intGUI_MEMDEV_Draw GUI_RECT*GUI_CALLBACK_VOID_P*pfDraw,void*pData,intFlags) 0GUI_MEMDEV_HASTRANS下面的范例展示了一个分片设备的使用。其源文件是Source\Misc\文件 目的 展示如何使用分片设备的例#includestaticconstGUI_POINTaPoints[]{#defineSIZE_OF_ARRAY(Array)(sizeof(Array)/sizeof(Array[0]))typedefstruct{intXPos_Poly,YPos_Poly;intXPos_Text,YPos_Text;GUI_POINT}绘图函 staticvoidDrawIt(void*pData){tDrawItContext*pDrawItContext=(tDrawItContext*)pData;/*GUI_FillRect(pDrawItContext--+-*GUI_FillPolygon(pDrawItContext-160,120);/** 220-pDrawItContext-pDrawItContext->YPos_Text+220-pDrawItContext->XPos_Text+100,pDrawItContext->YPos_Text+25);}展示分片设 #defineUSE_BANDING_MEMDEV(1)/*如设为0,则定义不使用分片设备进行绘图*/voidDedingMemdev(void){intintXSize=LCD_GET_XSIZE();intYSize=LCD_GET_YSIZE();tDrawItContextDrawItContext; t “Bandingmemorydevice\nwithoutDrawItContext.XPos_Poly=Xsize/2;DrawItContext.YPos_Poly=Ysize/2;DrawItContext.YPos_Text=Ysize/2-4;for(i=0;i<(XSize-100);i++)floatangle=i*3. /60;DrawItContext.XPos_Text=i;/**GUI_RotatePolygon(#if{GUI_RECTRect={0,70,320,170}/*使用分片设备进行绘图GUI_MEMDEV_Draw(&Rect,&DrawIt,&DrawItContext,0,}/*不使用设备的简单绘图*/DrawIt((void*)&DrawItContext);GUI_Delay(20);/**/}主函 voidmain{GUI_Init();{De}}当显示屏必须更新以反映其对象的移动或改变时,设备非常有用,因此在防止LCD闪烁这样一个应用方面是很重要的。一个自动设备对象是基于分片设备建立的,它可以新需要移动或改变的物体。实际的绘图操作使用分片设备机制,但只在需要的的空间内使用。使用一个自动设备(与直接使用分片设备相比)的主要优点是节省了计算时intGUI_MEMDEV_CreateAuto(GUI_AUTODEV* 0voidGUI_MEMDEV_DeleteAuto(GUI_AUTODEV* intGUI_MEMDEV_DrawAuto GUI_AUTODEV*GUI_AUTODEV_INFO*pAutoDevInfo,GUI_CALLBACK_VOID_P*pfDraw,void*pData);参 GUI_AUTODEVGUI_AUTODEV_INFOtypedef{char}时候,设为0。当使用这个特性时,我们推荐使用下面的程序:typedef{GUI_AUTODEV_INFO /*/*}staticvoidDraw(void*{PARAM*pParam=(PARAMif(pParam-{/*}/*if(pParam-{/*(如果需要)}}voidmain{PARAM /*GUI_AUTODEV /*分片设备的对象/* /*建立GUI_AUTODEV对象*/GUI_MEMDEV_DrawAuto( /*使用GUI_AUTODEV对象用于绘图*/&Draw,&Param); /*GUI_AUTODEV}景上绘一个带有可转动指针的刻度盘,景上绘一段小的文字。指针使用µC/GUI的抗锯齿特性绘制。在这里使用高分辨率抗锯齿以增强转动的指针的外观效果。对于抗锯齿的信息,请参阅第15章:抗锯齿。文件 目的 展示GUI_AUTODEV对象用法的例#include"GUI.H"#include<math.h>#ifndefWIN32#include#definecountof(Obj)(sizeof(Obj)/sizeof(Obj[0]))#defineDEG2RAD(3. 缩放位 staticconstGUI_COLORColorsScaleR140[]{0xD3D3D3,0xDFDFDF,0xBBDFBB,0x6161DF,0x61DF61,staticconstGUI_LOGPALETTEPalScaleR140{ /*numberofentries /*staticconstunsignedcharacScaleR140[]{/*staticconstGUI_BITMAPbmScaleR140{ /*X* /*Y* /* /* /*数据的指针(像素 /* 多边级的形 #defineMAGstaticconstGUI_POINTaNeedle[]{{MAG*(0),MAG*(0+{MAG*(-3),MAG*(-15+{MAG*(-3),MAG*(-65+{MAG*(3),MAG*(-65+{MAG*(3),MAG*(-15+ 包括绘图函数信息的结 typedef{/*Informationaboutwhathastobedisyed*/GUI_AUTODEV_INFOAutoDevInfo;/*多边形数据*/GUI_POINTaPoints[7]floatAngle;} 获得角 staticfloatGetAngle(inttDiff){if(tDiff<{return225-0.006*tDiff}tDiff-=15000;if(tDiff<7500){return225-90+0.012*tDiff}tDiff-=return} 绘图函 staticvoidDraw(void*{PARAM*pParam=(PARAM/*Fixedbackground*if(pParam-{GUI_ClearRect(50+60+bmScaleR140.XSize-GUI_DrawBitmap(&bmScaleR140,60,}/*GUI_AA_FillPolygon(pParam->aPoints,countof(aNeedle),MAG*160,/*Fixedforeground*if(pParam-{ t(“RPM/1000”,160,110);}} 使用分片设备显示一个带指针的刻度 staticvoid{intinttDiff,t0=PARAM /*GUI_AUTODEV /*分片设备对象/*显示消息*/ t(“ScaleusingGUI_AUTODEV-object”,160,/*建立GUI_AUTODEV对象*//*for(Cnt=0;(tDiff=GUI_GetTime()-t0)<24000;{/*获得数值用于显示一个多边形来表示指针*/Param.AngleGetAngle(tDiff)*DEG2RAD;GUI_RotatePolygon(Param.aPoints,GUI_MEMDEV_DrawAuto(&AutoDev,&Param.AutoDevInfo,&Draw,}/*“millisecondspicture”*/ t(“Milliseconds/picture:”,160,180);GUI_DispFloatMin((float)tDiff/(float)Cnt,/*删除GUI_AUTODEV对象*/} 主函 void{#ifndef}中,包括私有的操作系统或任何商业RTOS,例如embOS或µC/OS。(RTOS使用了一个实时内核(RTOSµC/GUIvoid{XXX_Init();YYY_Init();/*{}},不存在优先权/同步问题。超级循环程序如果超过一定的大小,可能变得很难。实时行为极有限,因为一个软关于µC/GUIGUI_Init()在你使用这个软件前APIGUI_Delay(GUI_ExecDialog(),不应在循环中使用,因为它们会妨碍其它软使用默认配置,它并不支持多任务系统使用(#defineGUI_MT0)超级循环范例(使用µC/GUI:void{/*XXX_Init(); /*µC/GUI*{ /*µC/GUI}}µC/GUI(RTOS一个单个任务调用µC/GUI(RTOS如果用到视察管理器的回调机制,一个µC/GUI更新函数(GUI_Exec()使用默认配置,它并不支持多任务系统的使用(#defineGUI_MT0);不需要内核接口µC/GUI同的优先级别。通常情况下,实时的临界任务(要求某一个反应时间)具有别。多个任务用于用户界面,调用µC/GUI(RTOS如果用到视察管理器的回调机制,一个µC/GUI更新函数(GUI_Exec()需要启用多任务支持,定义调用µC/GUI的任务的最大数量(自GUIConf.h):#defineGUI_MT #defineGUI_MAX_TASK GUI_Exec(),GUI_Delay()程序结构清晰有帮助。如果你的系统有足够的RAM,专门使用一个任务(最低级别)更新µC/GUI。该任务将不断地调用GUI_Exec(),不做其它事情,就象下面例子显示的一样。保持你的实时任务(决定你的系统行为,关于I/O,接口,网络等等)与调用该显示专门的dedicatedµC/GUI更新函数。它从范例MT_Multitasking中拿来,这个范例包括在随µC/GUI发布的范例当中:GUI背景处 /*触摸屏输入也可以处 void{{ /*做背景工作……更新窗口等等*/ /*剩下暂时不做什么事情……空闲处理*/}}GUI宏N4B0 停止,多任务支持(默认值 一个RTOS资源的例子。µC/GUI使用宏GUI_USE在显示屏之前或使用一个临界内部数据之前调用函数GUI_Use()。类似的方法,它在显示屏之后或使用一个临界内部数据之后调用函数GUI_Unuse()。这在模块GUITask.c中实现。GUITask.cGUIGUI_X_,因为它GUI(阻塞资源“旗语/互斥voidU32返回哪个数值没有关系,只要对于每个使用µC/GUIAPIvoid在显示屏之前或在使用临界内部数据结构之前,该函数被GUI所调用。它从插入相GUI.voidII.c:#includestaticOS_EVENT*U32{}void{DispSem=}void{}void{INT8Uerr;OSSemPend(DispSem,0,&err);} µC/GUI多任务接口,用于 staticHANDLEhMutex;voidGUI_X_InitOS(void){hMutex=CreateMutex(NULL,0,“µC/GUISim-}unsignedint{return}void{WaitForSingleObject(hMutex,}void{}使用µC/GUI(WM)时,在显示屏上显示的的所有内容包括在一个窗口里面——屏µC/GUI的视窗管理器是一个独立的(可选的)的软件项目,它没有包括进µC/GUI基本软件包里。视窗管理器的软件位于子“GUI\WM”下。宽和高)所定义。µC/GUI中一个窗口:很重要了。WM能自动处理正确的重绘顺序。WMAPIµC/GUI返回一个窗口的水平尺寸(宽度返回一个窗口的垂直尺寸(高度hashashasµC/GUI为窗口和窗口对象(控件)提供的回调机制实质是一个驱动系统。正如在大思是图形系统也可以调用用户程序提供的回调函数来达到更新窗口的目的。这种机制——常常表现好莱坞法则的特点不要打给我们,我们会打给!”)——主要是视窗管你不一定非要用回调函数不可,但这样做,WM在重绘窗口管理时会降低效率。也可以混时对应的回调函数指针参数名称相一致(WM_CreateWindow(cb。所有的回调voidcallback(WM_MESSAGE* 含用于定义了对于不同的使用一个或的的消息所采用的不同的处理方式(典型的至少有对WM_PAINT()的处理。voidWinHandler(WM_MESSAGE*{switch(pMsg-{caseWM_PAINT: oworld”,0,0);}}WM_MESSAGE消息的类型(参照下表MsgId重绘窗口(因为内容至少部分无效#defineMY_MESSAGE_AAAWM_USER+0#defineMY_MESSAGE_BBB在初始化视窗管理间,会创建一个包括整个LCD区域的窗口作为背景窗口(或称桌需要指定WM_SetBkWindowColor()函数设置重绘背景窗口的颜色。WM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 微创三叉神经微血管减压术的术后早期活动指导
- 影像学评分系统对职业性哮喘的严重度评估
- 康复辅助技术适配的培养策略创新优化
- 康复机器人与传统康复疗法的联合疗效对比
- 序贯免疫联合治疗在AEGC中的策略优化
- 干细胞治疗长期评估方法
- 小儿丹毒课件
- 干细胞多能性鉴定的质控体系优化策略
- 帕金森病非运动症状改善
- 寝室消防用电安全培训内容课件
- 消防电气安全培训资料课件
- 燃气管道标志桩设置规范
- 2025低空经济驱动因素、主要产品、产业链条及相关上市公司分析报告
- 手足综合征护理要点
- 2025贵州六盘水市盘州市教育系统考调教师48人备考试题及答案解析
- 益生菌医学科普知识培训课件
- 六年级上册数学《单位1》专项训练
- CT增强检查适应症课件
- 医院运营成本管理体系
- 中国无人机用光电吊舱行业市场前景预测及投资价值评估分析报告
- 2025年哈尔滨铁道职业技术学院单招笔试综合素质试题库含答案解析(5套共100道单选合辑)
评论
0/150
提交评论