主讲内容:

  1. 内存设备简介
  2. 内存设备API
  3. 内存设备基础实验

1.内存设备简介

内存设备是emWin的一种绘图机制,可以用在很多的绘图操作中,最主要的作用是消除在绘制重叠项目时出现的屏幕闪烁现象。

甚至可以在这种机制的帮助下实现一些华丽炫酷的界面效果,比如类似毛玻璃的模糊效果。

原理简介

不使用内存设备时,每一步绘图操作都会直接写入屏幕

如果使用内存设备,所有的绘图操作都在牛才能中进行,绘制完成后才更新到屏幕

内存要求

内存设备使用的是emWin的动态内存空间

emwin在m0上运行 emwin使用内部内存_单片机


emwin在m0上运行 emwin使用内部内存_句柄_02


使用步骤

  1. 创建内存设备
  2. 激活内存设备
  3. 绘制图形
  4. 激活屏幕
  5. 复制绘图结果到屏幕
  6. 如不再使用,则删除内存设备。




    这个函数是创建内存设备
    x0,y0是创建内存设备的位置坐标
    xsize,ysize是尺寸参数。


    这里定义了一个句柄,这个句柄是操作内存设备之后可以用到的,这里必须定义。
GUI_MEMDEV_Handle hMem = 0;

这里定义i,为下文做计数用。
设置背景颜色为黑色,然后清屏函数。

int i = 0;
	/* 设置背景色 */
  GUI_SetBkColor(GUI_BLACK);
  GUI_Clear();

关键来了!这里就是创建内存设备,把内存设备创建到这一个坐标里面。

/* 创建内存设备 */
  hMem = GUI_MEMDEV_Create(600, 150, 150, 100);

横坐标像素是150,纵坐标是100,这里说明一下:创建内存函数如果成功后,会返回一个句柄。

emwin在m0上运行 emwin使用内部内存_嵌入式_03


创建失败就会返回0.

接下来就进行while()循环

while (1)
	{
    /* 直接绘制 */
    _Draw(25, 150, 175, 250, i);
    
    /* 激活内存设备 */
    GUI_MEMDEV_Select(hMem);
    /* 向内存设备中绘制图形 */
    _Draw(600, 150, 750, 250, i);
    /* 选择LCD */
    GUI_MEMDEV_Select(0);
    /* 将内存设备中的内容复制到LCD */
    GUI_MEMDEV_CopyToLCDAt(hMem, 600, 150);

		GUI_Delay(40);
    i++;
		if (i > 999)
		{
			i = 0;
		}
	}

我们来看一下第一个函数_Draw(25, 150, 175, 250, i);详细

static void _Draw(int x0, int y0, int x1, int y1, int i)
{
  char buf[] = {0};

  /* 绘制矩形背景 */
  GUI_SetColor(GUI_BLUE);
	GUI_FillRect(x0, y0, x1, y1);
  
  /* 绘制文本 */
	GUI_SetFont(GUI_FONT_D64);
  GUI_SetTextMode(GUI_TEXTMODE_XOR);
  sprintf(buf, "%d", i);
	GUI_DispStringHCenterAt(buf, x0 + (x1 - x0)/2, (y0 + (y1 - y0)/2) - 32);
}

emwin在m0上运行 emwin使用内部内存_stm32_04


第五个这个int i是个计数参数。在这个函数里面会成为一个自增的函数。

emwin在m0上运行 emwin使用内部内存_嵌入式_05


emwin在m0上运行 emwin使用内部内存_句柄_06


emwin在m0上运行 emwin使用内部内存_emwin在m0上运行_07


emwin在m0上运行 emwin使用内部内存_stm32_08


emwin在m0上运行 emwin使用内部内存_句柄_09


emwin在m0上运行 emwin使用内部内存_句柄_10


emwin在m0上运行 emwin使用内部内存_嵌入式_11


内存设备基础实验的结果如图内存设备实验结果 所示,将例程下载到开发板运行后,在屏幕上能看到左侧不使用内存设备直接绘制的数字有明显的闪烁现象,而右侧使用内存设备绘制的数字稳定无闪烁。

emwin在m0上运行 emwin使用内部内存_嵌入式_12