emwin模拟器 demo 怎么删减

最好多参考几篇文章,比如UC/GUI中文手册与emWin5_UM_SC
0:画图函数
&GUI_DrawRect:在当前窗口中的指定位置绘制矩形(不填充,画线颜色为前景色)
&void GUI_DrawRect(int x0, int y0, int x1,
& &GUI_FillRect:在当前窗口中的指定位置绘制填充的矩形区域(填充前景色)
& &GUI_ClearRect:清除矩形区域(为矩形区域填充背景颜色,图形界面用填充背景色达到清除屏幕的
1:存储设备
不使用存储设备时,绘制操作直接写入显示器。屏幕在执行绘制操作时随时更新,从而在进行各
种更新时使屏幕闪烁。如果在此过程中使用存储设备,则所有绘制操作都在存储器中执行。仅在所有操作都完成后才将最终结果显示在屏幕上,其优点是没有闪烁。
如果不使用存储设备,则可以看到一步步的绘制操作效果,缺点是会出现显示器闪
烁。使用存储设备时,一次可见到所有例程的效果,就象单次操作一样,不能实际看见中间步骤。
以下例程是在使用存储设备时通常会调用的,基本用法非常简单:
创建存储设备(使用GUI_MEMDEV_Create() )。
&2. 激活它(使用GUI_MEMDEV_Select() )。
&3. 执行绘制操作。
&4. 将结果复制到显示器中(使用GUI_MEMDEV_CopyToLCD()
&5. 不再需要它时,删除该存储设备(使用 GUI_MEMDEV_Delete()
2:WM窗口管理器
&回调例程:回调例程由用户程序定义,指示在特定事件出现时图形系统调用特定的函数。它们通常用于在窗口内容更改时自动重绘窗口。窗口管理器的默认特性是向每个需要重绘的窗口发送一条
WM_PAINT 。
&当用户对窗口有操作时,WM会发送相应的消息给该窗口,窗口可通过回调函数根据消息直接对屏(没有用存储设备时)或对窗口的存储设备进行操作再拷贝到屏幕上,具体的消息说明可以参考emWin的中文手册。
& &WM_SetCallback&
& & 设置窗口的回调例程:WM_CALLBACK* WM_SetCallback (WM_HWIN hWin, WM_CALLBACK*
有了这个函数就可以动态的选择操作的重绘操作等消息的响应动作了。
& WM_SetDesktopColor
&&设置桌面窗口的颜色:WGUI_COLOR
WM_SetDesktopColor(GUI_COLOR Color);&
& &桌面窗口由视窗管理器自动创建,总是覆盖整个显示区域。它始终是一个最底层的窗口,没有定义其
&他窗口,它就是默认活动窗口。所有窗口都是桌面窗口的继承窗口。桌面窗口的默认设置不用于自身
&重新着色。如果不调用此函数,则桌面窗口不进行重绘;因此其它窗口将保持可见,即使在将它们删
&除之后。一旦使用此函数指定了颜色,则桌面窗口将进行自身重新着色。为了恢复默认设置,请调用
& &此函数并指定GUI_INVALID_COLOR
&对桌面窗口颜色设置后,需要调用WM_Exec(),通过执行回调函数重绘无效窗口(针对所有作业),这
& &样新的桌面窗口的颜色就会显现。
&GUI_Exec【重要、重要,进行操作动作后,一般都要会通过一个GUI延时函数(GUI_Delay)来间接调用该函数,也可以单独建立一个任务来执行GUI_Exec()函数】
&GUI_Exec()可以理解为GUI执行函数,调用了很多操作函数或发生了相关的动作,最后都需要通过GUI_Exec()函数通过各个回调函数来一一执行,所以函数名叫GUI_Exec
&此函数将自动重复调用WM_Exec1(),直至完成所有作业 & &实质是直至返回0
值为止。建议调用函数GUI_Exec()作为代替。通常,此函数无需由用户应用程序调用,它自动由GUI_Delay()
调用,所以一般作业后都调用一个GUI_Delay(),使作业显现出来。如果使用的是多任务系统,建议通过单独的任务执行此函数,如下所示:
& & & void
ExecIdleTask(void)&
& & while(1) {
&WM_Exec();//调用WM_Exec()完成到显示屏的显示作业(我的理解是:(类似于)调用该函数前,其他的函数执行绘制操作,WM_Exec完成将结果复制到显示器中)
&&WM_InvalidateWindow:调用此函数会告诉WM
指定的窗口未更新
& WM_PAINT消息: 窗口变为无效并应重绘时,发送到窗口。
WM_InvalidateWindow(WM_HWIN hWin);
&&WM_BringToTop:将窗口放在其同属窗口前面
void WM_BringToTop(WM_HWIN
hWin);该窗口将放置在其他所有同属窗口及父窗口的顶部,加入同属于A窗口的B、C两个子窗口,B先C后,则可以通过该函数将B又放在前面。
&&WM_BringToBottom:窗口将放置在所有其他同属窗口的下面,但将留在其父窗口的前面。
&&void WM_BringToBottom(WM_HWIN
& WM_BringToBottom(_hWindow1);
& GUIDEMO_Delay(SPEED);
&&WM_HideWindow:使指定窗口不可见。
& & & void
WM_HideWindow(WM_HWIN hWin);调用此函数后,窗口不会立即“不可见”。在执行WM_Exec()
时,其它窗口的无效区域(出现在要隐藏窗口“后面”的区域)将重绘。隐藏父窗口时,父窗口上的子窗口也会消息。
&WM_HideWindow(hChild2);
&GUIDEMO_Delay(1000/3);
&&WM_ShowWindow:使指定窗口显示。
&WM_ShowWindow(hWindow1);
&GUIDEMO_Delay(1000/3);
&&WM_GetInsideRect:
& void WM_GetInsideRect(GUI_RECT*
&&返回客户区的坐标,该区域由活动小工具尺寸减去边界尺寸确定。此函数向活动窗口发送一条消息,检
索内部矩形。如果小工具不处理此消息(也即意味着小工具没有边界),则需使用
WM_GetClientRect函数计算出矩形。结果通过窗口坐标给出。也即, GUI_RECT结构中的 x0和y0相当于x 和y
的边界尺寸, x1和y1相当于窗口尺寸减去边界尺寸 -1。
&客户区:一个窗口的客户区简单地说是它的可使用区。如果一个窗口包括一个边框或标题栏,则客户区是内部的矩形区域。如果没有这样一个
边框或标题栏&,则客户区等于窗口本身
& &WM_GetWindowSizeX/WM_GetWindowSizeY:
WM_GetWindowSizeX(WM_HWIN
...Y(WM_HWIN hWin)&
&&返回窗口的水平尺寸(宽度)
&,返回窗口的垂直尺寸(高度)
WM_GetWindowSizeX(pMsg-&hWin);pMsg为发送给窗口的消息。
& WM_DefaultProc:窗口消息的默认处理函数
&&void WM_DefaultProc(WM_MESSAGE* pMsg);
&&WM_MoveTo():将指定窗口移动到某个位置
&&void WM_MoveTo(WM_HWIN hWin,
int x, int y);父窗口移动时,子窗口是跟着做相应移动;
【WM_MoveTo使用说明】
& &WM_MoveTo刚开始用的时候,移动一个窗口,窗口一直会留下运动的痕迹;
&后来学习别人的例程,了解到,所有窗口都是桌面窗口的继承窗口;因为窗口移动,不仅被移动的窗口要重绘,桌面窗口也要重绘,所以必须给桌面通过&WM_SetCallback(WM_GetDesktopWindow(),
BkWindow)函数配置一个桌面的回调函数,在回调函数中处理重绘信息WM_PAINT时,要设置好背景色(与桌面窗口的背景一致),然后调用GUI_Clear(),这样移动窗口的移动痕迹就没有了,同理子窗口在父窗口中移动时,父窗口的WM_PAINT也要如此处理,即一个原则就是要在重绘时清除移动窗口所在的上层窗口,以去掉痕迹。
&&WM_MoveWindow():将指定窗口移动某段距离
&&void WM_MoveWindow(WM_HWIN
hWin, int dx, int dy);
&&WM_ResizeWindow:通过增加(或减少)给定差别更改指定窗口的尺寸
WM_ResizeWindow(_hWindow2, -1, -1);
GUI_Delay(tDiff);
WM_DeleteWindow:删除一个窗口
///////////////窗口设计shil///////////////////
下面就是一个窗口的一个设计,建立窗口后,在窗口的区域默认是黑色;且窗口使用存储设备;建好之后,是不会直接显示出来的,但可通过各种途径调用WM_EXEC()来完成作业(这里是GUIDEMO_Delay);
建立好之后,在它的回调函数里面设置各个消息的处理操作;
用户对操作的各种操作,都会向串口发送对应的消息;消息都可以通过WM_DefaultProc进行默认处理;如果要想达到一定效果可以分开处理,这里要重绘窗口,处理WM_PAINT消息,在这个消息处理中先设置好环境颜色,在窗口区域内画了一个矩形显示了汉子,做出一个彩色窗口。
【改变窗口背景两种方法:1.在窗口的回调函数的WM_PAINT中先设置背景色,再GUI_Clear()
2.在窗口的回调函数的WM_PAINT中先设置背景色,再可以画框等
【一个窗口会接收到不同的消息,用回调函数来处理消息是窗口最合适的选择,尤其是窗体重绘WM_PAINT】
static void Window1(WM_MESSAGE* pMsg) {
& GUI_RECT R
& switch (pMsg-&MsgId) {
& case WM_PAINT:
WM_GetInsideRect(&Rect);
GUI_SetBkColor(GUI_RED);
GUI_SetColor(GUI_YELLOW);
GUI_ClearRectEx(&Rect);
GUI_DrawRectEx(&Rect);
GUI_SetColor(GUI_WHITE);
GUI_SetFont(&GUI_Font24_ASCII);
WM_GetWindowSizeX(pMsg-&hWin);
WM_GetWindowSizeY(pMsg-&hWin);
GUI_DispStringHCenterAt("Window 1", x / 2, (y / 2) - 12);
& default:
& & WM_DefaultProc(pMsg);
//要处理WM_GetInsideRect发过来的消息(检索内部矩形的大小)
static void cbChild(WM_MESSAGE* pMsg) {
& switch (pMsg-&MsgId) {
& case WM_PAINT:
GUI_SetBkColor(GUI_WHITE);
GUI_Clear(); //清除的范围是子窗口即该回调函数对应的窗口,其他的窗口均不受影响
GUI_SetColor(GUI_RED);
GUI_SetFont(&GUI_Font24_ASCII);
WM_GetWindowSizeX(pMsg-&hWin);
WM_GetWindowSizeY(pMsg-&hWin);
GUI_DispStringHCenterAt("Child window", x / 2, (y / 2) - 12);
& default:
WM_DefaultProc(pMsg);
WM_HWIN hWindow1;
hWindow1 = WM_CreateWindow( 50, &70, 165,
100, WM_CF_SHOW|WM_CF_MEMDEV , Window1, 0);
GUIDEMO_Delay(1000/3);
hChild = WM_CreateWindowAsChild(10, 50, 145, 40, hWindow1,
WM_CF_SHOW | WM_CF_MEMDEV, cbChild, 0);
GUIDEMO_Delay(1000);
/////////////////////////////////////////////
3:GUI环境设置
& 背景、前景颜色设置(这里只是设置颜色,需要通过GUI_Clear()全部换成新的背景色)
设置(还有有读取)当前背景颜色:GUI_COLOR
GUI_SetBkColor(GUI_COLOR Color)
设置(还有有读取)当前前景色:
& void GUI_SetColor(GUI_COLOR Color);
【 &GUI_Clear()清除背景时,清除的范围是调用函数时所多对应的窗口,其他的窗口(包括桌面窗口)等均不受影响,&】
& 设置用于文本输出的字体
&&GUI_SetFont() 设置当前字体:const GUI_FONT *
GUI_SetFont(const GUI_FONT * pNewFont);
&&&GUI_SetFont(&GUI_Font24_ASCII);
&&GUI_SetDefaultFont()
设置默认字体
4:通过触摸屏获取输入信息
& int&CursorX
、CursorY ;
& CursorX =
GUI_TOUCH_GetxPhys();
& CursorY = GUI_TOUCH_GetyPhys();
GUI_CURSOR_SetPosition(CursorX,CursorY);
& GUI_Delay(100); //调用GUI_EXEC()
完成操作作业
在UC/OS中,一般通过建立一个高优先级的任务,来通过GUI_TOUCH_Exec()扫描触摸屏,获得
static void taskA (void *p_arg)&
u8 tick=0;
while(DEF_TRUE)&
&OSTimeDlyHMSM(0,0,0,10);&
&GUI_TOUCH_Exec();&
GUI_TOUCH_Exec()在这个函数中调用TOUCH_X_MeasureY
&TOUCH_X_MeasureX检测触摸屏的触摸位置,保存在xPhys、yPhys&中,应用层可以通过GUI_TOUCH_GetyPhys来获取这个值。
yPhys = TOUCH_X_MeasureY();
xPhys = TOUCH_X_MeasureX();
int &GUI_TOUCH_GetyPhys(void) {
& return yP
5:窗口对象(小工具)
&1:BUTTON:可按下的按钮。按钮上可显示文本或位图
&&BUTTON_Handle hButton1;
& hButton1 =
BUTTON_CreateEx(10,10,50,50,0,WM_CF_SHOW,0,'1');&
BUTTON_SetText(hButton1,"hello!");//按键上显示的文字
=&GUI_GetKey();//BUTTON创建后,会响应触摸屏的触摸消息;通过GUI_GetKey()可以获取键缓冲器中的字符编码;若未缓冲键,则返回值为0,缓冲键可以理解为被按下的
BUTTON,若有BUTTON被按下,它的ID值就会传送到键缓冲器中,用GUI_GetKey可以读到。&&
代码://此处需根据Key值或超时退出while循环等待
&&GUI_Delay(100);//内部调用GUI_Exec();
有事件或操作任务需要通过GUI_Exec()来最终执行,
& &} while()
&2: EDIT:文本编辑框控件,编辑区通常用作输入文本的主要用户接口
&&EDIT_Handle
& hEdit = EDIT_Create( 200, 114, 100, 25, ' ', 80,
& EDIT_SetFont(hEdit,
&GUI_Font8x16);
& GUIDEMO_Delay(100);
& Key = GUIDEMO_WaitKey();//内部包含GUI_GetKey()与GUI_Exec(),获取缓冲键的ID
& switch (Key) {
& case GUI_ID_CANCEL:
& default:
& EDIT_AddKey(hEdit, Key);//在EDIT中显示Key
} while ((Key != '3') &&
(Key!=GUI_ID_CANCEL));
/////EDIT_GetText() 获取用户输入
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。后使用快捷导航没有帐号?
查看: 1136|回复: 12
【水军团】F7之emwin入门学习
在线时间1411 小时
威望4603 分
芯币15506 枚
E金币600 枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 4603, 距离下一级还需 1397 积分
五彩晶圆(中级), 积分 4603, 距离下一级还需 1397 积分
本帖最后由 wateras1 于
10:36 编辑
emWin 应用的软件架构
Config文件夹
Config 文件夹是显示配置文件包。在 Config 文件夹下,有 GUIConf.c、GUIConf.h、
LCDConfig.c、LCDConfig.h 及 SIMConfig.c 文件,其中前三个文件在实际的嵌入式平台是
非常重要的,它们分别起到了分配存储空间、裁剪 emWin 功能模块和 LCD 底层驱动实现。
而 LCDConfig.h 文件没有内容,SIMConfig.c 文件是 VS2010 仿真环境需求的一些特定设置,
在此我们不作探讨。关于 GUIConf.c、GUIConf.h 与 LCDConfig.c 文件的内容见代码清单
首先看下windows GUIConf.c
#include &GUI.h&
/*********************************************************************
*& && & Defines
**********************************************************************
// Define the available number of bytes available for the GUI
#define GUI_NUMBYTES&&0x400000
// Define the average block size
#define GUI_BLOCKSIZE 0x80
/*********************************************************************
*& && & Public code
**********************************************************************
/*********************************************************************
*& && & GUI_X_Config
* Purpose:
*& &Called during the initialization process in order to set up the
*& &available memory for the GUI.
void GUI_X_Config(void) {
&&// 32 bit aligned memory area
&&static U32 aMemory[GUI_NUMBYTES / 4];
&&// Assign memory to emWin
&&GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
&&GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
F7环境下的GUIConf.c代码
/*********************************************************************
*& && && & Portions COPYRIGHT 2015 STMicroelectronics& && && && && & *
*& && && & Portions SEGGER Microcontroller GmbH & Co. KG& && && && & *
*& && &&&Solutions for real time microcontroller applications& && &&&*
**********************************************************************
*& && && && && && && && && && && && && && && && && && && && && && &&&*
*& && &&&(c) 1996 - 2015&&SEGGER Microcontroller GmbH & Co. KG& && & *
*& && && && && && && && && && && && && && && && && && && && && && &&&*
*& && &&&Internet: & & Support:&&& & *
*& && && && && && && && && && && && && && && && && && && && && && &&&*
**********************************************************************
** emWin V5.28 - Graphical user interface for embedded applications **
All&&Intellectual Property rights&&in the Software belongs to&&SEGGER.
emWin is protected by&&international copyright laws.&&Knowledge of the
source code may not be used to write a similar product.&&This file may
only be used in accordance with the following terms:
The&&software has&&been licensed&&to STMicroelectronics International
N.V. a Dutch company with a Swiss branch and its headquarters in Plan-
les-Ouates, Geneva, 39 Chemin du Champ des Filles, Switzerland for the
purposes of creating libraries for ARM Cortex-M-based 32-bit microcon_
troller products commercialized by Licensee only, sublicensed and dis_
tributed under the terms and conditions of the End User License Agree_
ment supplied by STMicroelectronics International N.V.
Full source code is available at:
We appreciate your understanding and fairness.
----------------------------------------------------------------------
File& && &&&: GUIConf.c
Purpose& &&&: Display controller initialization
---------------------------END-OF-HEADER------------------------------
&&******************************************************************************
&&* @attention
&&* Licensed under MCD-ST Liberty SW License Agreement V2, (the &License&);
&&* You may not use this file except in compliance with the License.
&&* You may obtain a copy of the License at:
&&*& && &&&
&&* Unless required by applicable law or agreed to in writing, software
&&* distributed under the License is distributed on an &AS IS& BASIS,
&&* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&&* See the License for the specific language governing permissions and
&&* limitations under the License.
&&******************************************************************************
#include &GUI.h&
void GUI_TOUCH_X_ActivateX(void)
// XPT2046_WriteCMD(0x90);
void GUI_TOUCH_X_ActivateY(void)
&&//XPT2046_WriteCMD(0xd0);
int&&GUI_TOUCH_X_MeasureX(void)
& &// return XPT2046_ReadAdc_Fliter(CHY);
int&&GUI_TOUCH_X_MeasureY(void)
& &// return XPT2046_ReadAdc_Fliter(CHX);
/*********************************************************************
*& && & Defines
**********************************************************************
/* Define the available number of bytes available for the GUI */
#define GUI_NUMBYTES&&(128) *&&1024
U32 aMemory[GUI_NUMBYTES / 4];
/*********************************************************************
*& && & Public code
**********************************************************************
/*********************************************************************
*& && & GUI_X_Config
* Purpose:
*& &Called during the initialization process in order to set up the
*& &available memory for the GUI.
void GUI_X_Config(void)
&&GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
/*************************** End of file ****************************/
可以看到windows分配了4MB&&静 态 空 间 aMemory,而我们的F7分配了128k.
接 着 调 用 emWin 的 库 函 数GUI_ALLOC_AssignMemory 把 这 个 空 间 分 配 给 emWin , 并 使 用 库 函 数GUI_ALLOC_SetAvBlockSize 设置存储块的平均大小。所以 emWin的库函数使用的存储空间都是 aMemory 中分配的。在嵌入式平台上,我们需要根据其限制控制分配给 emWin 库
的 aMemory 大小,修改宏 GUI_NUMBYTES 即可。
& && && && &GUIConfig.h代码
/*********************************************************************
*& && && && && & SEGGER Microcontroller GmbH & Co. KG& && && && && & *
*& && &&&Solutions for real time microcontroller applications& && &&&*
**********************************************************************
*& && && && && && && && && && && && && && && && && && && && && && &&&*
*& && &&&(c) 1996 - 2013&&SEGGER Microcontroller GmbH & Co. KG& && & *
*& && && && && && && && && && && && && && && && && && && && && && &&&*
*& && &&&Internet: & & Support:&&& & *
*& && && && && && && && && && && && && && && && && && && && && && &&&*
**********************************************************************
** emWin V5.22 - Graphical user interface for embedded applications **
emWin is protected by international copyright laws.& &Knowledge of the
source code may not be used to write a similar product.&&This file may
only be used in accordance with a license and should not be re-
distributed in any way. We appreciate your understanding and fairness.
----------------------------------------------------------------------
File& && &&&: GUIConf.h
Purpose& &&&: Configuration of available features and default values
----------------------------------------------------------------------
#ifndef GUICONF_H
#define GUICONF_H
/*********************************************************************
*& && & Multi layer/display support
#define GUI_NUM_LAYERS& && &16& &// Maximum number of available layers
/*********************************************************************
*& && & Multi tasking support
#define GUI_OS& && && && &&&(1)&&// Compile with multitasking support
/*********************************************************************
*& && & Configuration of available packages
#define GUI_SUPPORT_TOUCH& &(1)&&// Support a touch screen (req. win-manager)
#define GUI_SUPPORT_MOUSE& &(1)&&// Support a mouse
#define GUI_WINSUPPORT& && &(1)&&// Window manager package available
#define GUI_SUPPORT_MEMDEV&&(1)&&// Memory devices available
/*********************************************************************
*& && & Configuration of window manager
#define WM_SUPPORT_NOTIFY_VIS_CHANGED (1) // Enable sending of WM_NOTIFY_VIS_CHANGED messages
/*********************************************************************
*& && & Default font
#define GUI_DEFAULT_FONT& && && & &GUI_Font6x8
#endif&&/* Avoid multiple inclusion */
/*************************** End of file ****************************/
GUIConf.h 文件聚集了各种与 emWin 功能裁剪相关的宏,如 GUI_NUM_LAYERS 用
于配置 emWin 的最大可用层数(多显示器及复合视图支持),GUI_OS 用于告诉 emWin 是否
运行在带多任务系统的平台上等等,通过设置这些宏,可以方便地根据需要裁剪 emWin 的
LCDConfig.c 文件内容
/*********************************************************************
*& && && && && & SEGGER Microcontroller GmbH & Co. KG& && && && && & *
*& && &&&Solutions for real time microcontroller applications& && &&&*
**********************************************************************
*& && && && && && && && && && && && && && && && && && && && && && &&&*
*& && &&&(c) 1996 - 2013&&SEGGER Microcontroller GmbH & Co. KG& && & *
*& && && && && && && && && && && && && && && && && && && && && && &&&*
*& && &&&Internet: & & Support:&&& & *
*& && && && && && && && && && && && && && && && && && && && && && &&&*
**********************************************************************
** emWin V5.22 - Graphical user interface for embedded applications **
emWin is protected by international copyright laws.& &Knowledge of the
source code may not be used to write a similar product.&&This file may
only be used in accordance with a license and should not be re-
distributed in any way. We appreciate your understanding and fairness.
----------------------------------------------------------------------
File& && &&&: LCDConf.c
Purpose& &&&: Display controller configuration (single layer)
---------------------------END-OF-HEADER------------------------------
#include &GUI.h&
/*********************************************************************
*& && & Layer configuration (to be modified)
**********************************************************************
// Physical display size
#define XSIZE_PHYS&&320
#define YSIZE_PHYS&&240
#define VYSIZE_PHYS (YSIZE_PHYS && 1)
// Color conversion
#define COLOR_CONVERSION GUICC_8888
// Display driver
#define DISPLAY_DRIVER GUIDRV_WIN32
/*********************************************************************
*& && & Configuration checking
**********************************************************************
#ifndef& &VXSIZE_PHYS
&&#define VXSIZE_PHYS XSIZE_PHYS
#ifndef& &VYSIZE_PHYS
&&#define VYSIZE_PHYS YSIZE_PHYS
#ifndef& &VRAM_ADDR
&&#define VRAM_ADDR 0
#ifndef& &XSIZE_PHYS
&&#error Physical X size of display is not defined!
#ifndef& &YSIZE_PHYS
&&#error Physical Y size of display is not defined!
#ifndef& &COLOR_CONVERSION
&&#error Color conversion not defined!
#ifndef& &DISPLAY_DRIVER
&&#error No display driver defined!
/*********************************************************************
*& && & Public code
**********************************************************************
/*********************************************************************
*& && & LCD_X_Config
* Purpose:
*& &Called during the initialization process in order to set up the
*& &display driver configuration.
void LCD_X_Config(void) {
&&// Set display driver and color conversion for 1st layer
&&GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0);
&&// Display driver configuration, required for Lin-driver
&&LCD_SetSizeEx& & (0, XSIZE_PHYS,& &YSIZE_PHYS);
&&LCD_SetVSizeEx& &(0, VXSIZE_PHYS,&&VYSIZE_PHYS);
&&LCD_SetVRAMAddrEx(0, (void *)VRAM_ADDR);
&&// Set user palette data (only required if no fixed palette is used)
&&#if defined(PALETTE)
& & LCD_SetLUTEx(0, PALETTE);
/*********************************************************************
*& && & LCD_X_DisplayDriver
* Purpose:
*& &This function is called by the display driver for several purposes.
*& &To support the according task the routine needs to be adapted to
*& &the display controller. Please note that the commands marked with
*& &'optional' are not cogently required and should only be adapted if
*& &the display controller supports these features.
* Parameter:
*& &LayerIndex - Index of layer to be configured
*& &Cmd& && &&&- Please refer to the details in the switch statement below
*& &pData& && &- Pointer to a LCD_X_DATA structure
* Return Value:
*& && -1 - Error
*& &&&-1 - Command not handled
*& && &0 - Ok
int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) {
&&switch (Cmd) {
&&// Required
&&case LCD_X_INITCONTROLLER: {
& & // Called during the initialization process in order to set up the
& & // display controller and put it into operation. If the display
& & // controller is not initialized by any external routine this needs
& & // to be adapted by the customer...
& & // ...
& & return 0;
&&case LCD_X_SETVRAMADDR: {
& & // Required for setting the address of the video RAM for drivers
& & // with memory mapped video RAM which is passed in the 'pVRAM' element of p
& & LCD_X_SETVRAMADDR_INFO *
& & p = (LCD_X_SETVRAMADDR_INFO *)pD
& & return 0;
&&case LCD_X_SETORG: {
& & // Required for setting the display origin which is passed in the 'xPos' and 'yPos' element of p
& & LCD_X_SETORG_INFO *
& & p = (LCD_X_SETORG_INFO *)pD
& & return 0;
&&case LCD_X_SETLUTENTRY: {
& & // Required for setting a lookup table entry which is passed in the 'Pos' and 'Color' element of p
& & LCD_X_SETLUTENTRY_INFO *
& & p = (LCD_X_SETLUTENTRY_INFO *)pD
& & return 0;
&&case LCD_X_ON: {
& & // Required if the display controller should support switching on and off
& & return 0;
&&case LCD_X_OFF: {
& & // Required if the display controller should support switching on and off
& & // ...
& & return 0;
&&default:
& & r = -1;
/*************************** End of file ****************************/
LCDConfig.c 文 件 包 含 了 LCD_X_Config 和 LCD_X_DisplayDriver 两 个 函 数 。
LCD_X_Config 函数调用 emWin 库函数 GUI_DEVICE_CreateAndLink 配置了显示驱动及颜
色转换格式,该函数的输入参数是根据 Windows 系统的环境配置的。接着调用
LCD_SetSizeEx 配置了显示尺寸,输入参数是本文件中的两个宏:#define XSIZE_PHYS
320 及 #define YSIZE_PHYS 240,也就是说把屏幕配置成了 320x240 分辨率大小,我们可
以通过修改这两个宏的数值改变仿真时的屏幕尺寸。
LCD_X_DisplayDriver 是提供给 emWin 库的驱动回调函数,该函数根据输入的参数
Cmd 区分要进行的操作,如 LCD_X_INITCONTROLLER 表示初始化液晶控制器,
LCD_X_ON 表示启动液晶屏,LCD_X_OFF 表示关闭液晶屏,这些命令是由用户根据需要
选择性实现的。
在使用 emWin 的应用函数之前,我们需要调用其库函数 GUI_Init 初始化 emWin 运行
的环境,而 GUI_Init 函数会执行我们前面提到的 GUI_X_Config、LCD_X_Config、
LCD_X_DisplayDriver 三个函数,从而完成初始化工作。当我们移植 emWin 时,主要的移
植工作就是根据自己的平台实现这些函数,而 emWin 的上层应用函数无需修改,也无法修
改,因为那些函数都已经编译进库里了,不开放源码。
GUI 文件夹是 emWin 库核心文件包。它包含一个 Include 文件夹和一个 Library 文件夹,
在 Include 文件夹里的都是 emWin 库的头文件,由于 emWin 以库的形式提供给用户,所以
必须带有这些头文件以方便我们使用。Library 目录下的 GUI.lib 就是 emWin 的库文件了,
它是编译好的二进制编码,无法查看源程序。在不同的 CPU 平台下,需要使用不同版本的
库,如这个工程里的 GUI.lib 库仅可以用在 windows 的 VC++编译平台下,针对 Cortex-M0,
M3 和 M4 芯片及 IAR、MDK 编译环境都有相对应的库文件,使用时要根据自己的平台选
择适当的库文件。
对于在MDK中移植EWMIN需要把 STemWin522_CM3_Keil.lib、
GUIConf.c、LCDConf_FlexColor_Template.c 及 GUI_X.c 文件添加到工程中,另外注意要把头文件路径添加到 Keil 的编译器选项中(以M3为例,其实F7一样)。
emWin 的初始化过程
& &在使用 emWin 前,都要先调用GUI_Init 库函数,以初始化 emWin 运行所需要的环境,在这个 GUI_Init 函数里,调用了emWin 底层的配置函数,它按顺序分别调用了 GUI_X_Config、LCD_X_Config及 LCD_X_DisplayDriver 函数,完成了存储器分配、屏幕类型配置及初始化液晶驱动的工作。这些函数在前面仿真 emWin 的章节已经简要介绍过,在 Win32 仿真环境下的这些函数,已由 Segger 官方配置过,我们无需修改也能正常运行,而在嵌入式平台上,就必须改写这几个函数,以适应特定平台的需求。
GUI_X_Config 函数
GUI_Init 初始化 emWin,最先调用了 GUI_X_Config 函数,该函数在 GUIConf.c 文件
/* Define the available number of bytes available for the GUI */
#define GUI_NUMBYTES&&(128) *&&1024
U32 aMemory[GUI_NUMBYTES / 4];
/*********************************************************************
*& && & Public code
**********************************************************************
/*********************************************************************
*& && & GUI_X_Config
* Purpose:
*& &Called during the initialization process in order to set up the
*& &available memory for the GUI.
void GUI_X_Config(void)
&&GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
从上面可以看到F7为EMWIN分配了128K的空间。
VS2010环境运行模拟器
模拟菜单demo
之前没有接触过emwin,一切从零开始,接下来结合官方demo以及官方api具体研究如何制作属于一些绚丽的GUI.
本帖子中包含更多资源
才可以下载或查看,没有帐号?
<p id="rate_494" onmouseover="showTip(this)" tip="水军团。。。。赞。。。&威望 + 5 分
芯币 + 5 枚
" class="mtn mbn">
<p id="rate_33" onmouseover="showTip(this)" tip="赞一个!&威望 + 5 分
芯币 + 5 枚
" class="mtn mbn">
当你的才华还撑不起你的野心时,那就应该静下心来学习;当你的能力还驾驭不了你的目标时,那就应该沉下心来历练。当你对未来迷茫时,请停下来认准目标。 梦想,不是浮云,而是沉淀和积累。只有拼出来的美丽,没有...
&&&&&&&&&&
在线时间554 小时
威望949 分
芯币22954 枚
E金币230 枚
TA的帖子TA的资源
纯净的硅(中级), 积分 949, 距离下一级还需 251 积分
纯净的硅(中级), 积分 949, 距离下一级还需 251 积分
&&这个和 ucGUI 有 撒子区别呢??
在国内的嵌入式行业中,由于 uC/OS 系统的名气,大家比较熟悉的嵌入式图形软件库
是 uC/GUI,但大部分人不知道,其实 uC/GUI 是 Segger 公司为 Micrium 公司(制作 uC/OS
的公司)定制的图形软件库,说是定制,但其&
分享铸就美好未来。。。
在线时间554 小时
威望949 分
芯币22954 枚
E金币230 枚
TA的帖子TA的资源
纯净的硅(中级), 积分 949, 距离下一级还需 251 积分
纯净的硅(中级), 积分 949, 距离下一级还需 251 积分
坐等科普。。。。
分享铸就美好未来。。。
在线时间771 小时
威望1623 分
芯币3531 枚
E金币600 枚
TA的帖子TA的资源
在线时间1411 小时
威望4603 分
芯币15506 枚
E金币600 枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 4603, 距离下一级还需 1397 积分
五彩晶圆(中级), 积分 4603, 距离下一级还需 1397 积分
这个和 ucGUI 有 撒子区别呢??
在国内的嵌入式行业中,由于 uC/OS 系统的名气,大家比较熟悉的嵌入式图形软件库
是 uC/GUI,但大部分人不知道,其实 uC/GUI 是 Segger 公司为 Micrium 公司(制作 uC/OS
的公司)定制的图形软件库,说是定制,但其实它跟 emWin 的区别并不大,以致于本人并
不知道它们在功能上究竟差别在何处。比较确定的是旧版本 uC/GUI 在网上还可以找到开
源的代码,而当前新版本的 emWin及 uC/GUI只对用户提供了库文件,是不开源的。
另外,Segger 公司还向 ST 公司出售了 emWin 的版权,从而 ST 公司也得到了定制版
的 emWin,然后改了名字叫 STemWin。当用户在 STM32 芯片上使用 emWin软件库时,是
不需要向 emWin或 ST公司付费的。
总而言之,uC/GUI 和 STemWin 都是 Segger 公司的 emWin 产品,而且它们的版本编
号是统一的,如 uC/GUI 目前最新版本命名为 uC-GUI V5.3,STemWin 最新版本命名为
STemWin Library V5.3,emWin最新版本则为 emWin V5.3,所以,要比较这三个软件库
功能上的区别,只需要看它们的版本号就可以了。
虽然功能上没有区别,但因为版权付费问题,在实际使用时就需要根据自己的平台来
选择。由于我们使用的是 STM32 开发平台,自然我们选择的是 STemWin。因为如果我们
选择的是 emWin 或 uC/GUI 使用到 STM32 产品上,同样是需要向 Segger 或 Micrium 公司
购买版权的,而使用 STemWin 就不存在这个问题。在 STemWin 里有一个检测机制确定代
码所运行的平台,若是 STM32 芯片,则运行正常,若非 STM32 芯片,就不能正常使用了
刚特别跑到st官网确认了一下 STemwin的授权问题。
确实是对stm32 for free。
看起来唯一需要担心的只是 它能否跟上emwin的更新了。
不过这个似乎不需要太在意,作为一个不太在意软件更新的我来说。
因为emwin&
其实很多时候,我听网上的人说,emwin或者ucgui几乎就是一回事。
另外,我一般是尽量回避使用需要付费的中间件,之所以考虑emwin,
重要的也就是这个 STemwin的存在。
反正我用的是stm32,不用白不用。&
赞一个。。。。。&
当你的才华还撑不起你的野心时,那就应该静下心来学习;当你的能力还驾驭不了你的目标时,那就应该沉下心来历练。当你对未来迷茫时,请停下来认准目标。 梦想,不是浮云,而是沉淀和积累。只有拼出来的美丽,没有...
在线时间554 小时
威望949 分
芯币22954 枚
E金币230 枚
TA的帖子TA的资源
纯净的硅(中级), 积分 949, 距离下一级还需 251 积分
纯净的硅(中级), 积分 949, 距离下一级还需 251 积分
在国内的嵌入式行业中,由于 uC/OS 系统的名气,大家比较熟悉的嵌入式图形软件库
是 uC/GUI,但大部分人 ...
赞一个。。。。。
分享铸就美好未来。。。
在线时间10 小时
威望-12 分
TA的帖子TA的资源
宇宙尘埃, 积分 -12, 距离下一级还需 12 积分
宇宙尘埃, 积分 -12, 距离下一级还需 12 积分
过来学习一下!
http://www.arm8.net嵌入式培训
http://www.arm7.net
在线时间1100 小时
威望1525 分
芯币2211 枚
E金币83 枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1525, 距离下一级还需 475 积分
纯净的硅(高级), 积分 1525, 距离下一级还需 475 积分
来学习,帮顶
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅!
在线时间433 小时
威望1758 分
芯币1516 枚
E金币526 枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1758, 距离下一级还需 242 积分
纯净的硅(高级), 积分 1758, 距离下一级还需 242 积分
这个F7的活动终于有些文章跟上了。
在线时间5 小时
TA的帖子TA的资源
宇宙尘埃, 积分 -2, 距离下一级还需 2 积分
宇宙尘埃, 积分 -2, 距离下一级还需 2 积分
在线时间1751 小时
威望3764 分
芯币8956 枚
TA的帖子TA的资源
终于开始启动工作的赶脚~~
在线时间1525 小时
威望23025 分
芯币9024 枚
E金币386 枚
TA的帖子TA的资源
在国内的嵌入式行业中,由于 uC/OS 系统的名气,大家比较熟悉的嵌入式图形软件库
是 uC/GUI,但大部分人 ...
其实很多时候,我听网上的人说,emwin或者ucgui几乎就是一回事。
另外,我一般是尽量回避使用需要付费的中间件,之所以考虑emwin,
重要的也就是这个 STemwin的存在。
反正我用的是stm32,不用白不用。
本人变态,生物勿近
在线时间1525 小时
威望23025 分
芯币9024 枚
E金币386 枚
TA的帖子TA的资源
在国内的嵌入式行业中,由于 uC/OS 系统的名气,大家比较熟悉的嵌入式图形软件库
是 uC/GUI,但大部分人 ...
刚特别跑到st官网确认了一下 STemwin的授权问题。
确实是对stm32 for free。
看起来唯一需要担心的只是 它能否跟上emwin的更新了。
不过这个似乎不需要太在意,作为一个不太在意软件更新的我来说。
因为emwin本身已经够成熟了。
至于看不到源码的问题,还是和前面一样,如果它足够成熟了,那不看也无所谓。
毕竟要改进还是一件很困难的事情。
本人变态,生物勿近
荣誉会员勋章
曾经的版主且威望大于2000,或对EEWORLD论坛有突出贡献的坛友
Powered by
逛了这许久,何不进去瞧瞧?

我要回帖

更多关于 emwin 的文章

 

随机推荐