嵌入式LCD闪烁--emWin使用内存设备避免闪烁
0、引子
近日在论坛看到有人说屏幕闪烁,问道怎么解决。在嵌入式gui使用方面,屏幕闪烁一般多出现在多个窗口层叠、多图层层叠、更新图层时。受限于接口速度,即使屏幕有很高的刷新率,也做不到无闪烁,所以要从减少数据传送上下功夫,比如使用内存设备处理好数据再整体搬到LCD上,还有就是使用局部刷新较少刷新的数据量,同时还要注意图层顺序的问题。
1、内存设备避免闪烁原理
当在液晶屏上绘制一些文字叠加在图片上的效果时,通常是先在液晶屏上绘制底层的图片,然后再在图片上叠加上文字,多次刷新会出现闪烁。
存储设备可在各种情况下使用,主要用于防止在绘制重叠项目时出现显示器闪烁。其基本思想很简单,不使用存储设备时,绘制操作直接写入显示器,屏幕在执行绘制操作时随时更新,从而在进行各种更新时使屏幕闪烁。例如,如果要在背景中绘制一个位图,在前景中绘制一些透明文本,应首先绘制位图,然后绘制文本。效果将是文本出现闪烁。但是,如果在此过程中使用存储设备,则所有绘制操作都在存储器中执行。仅在所有操作都完成后才将最终结果显示在屏幕上,实现一次性从内存到LCD绘制,其优点是没有闪烁。
下图形象的解释了内存设备避免闪烁的原理。

2、emWin使用内存设备
emWin使用内存设备需要先打开配置:
#define GUI_SUPPORT_MEMDEV (1) // Memory devices available
测试例子:
void MainTask(void) {
    GUI_Init();
    //
    // Check if recommended memory for the sample is available
    //
    if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {
        GUI_ErrorOut("Not enough memory available.");
        return;
    }
    GUI_SetColor(GUI_LIGHTGRAY);
    GUI_RECT rect = { , , LCD_GetXSize(),  };
    GUI_FillRectEx(&rect);
    char title[] = "Draw direct And Use Memory device";
    GUI_SetFont(GUI_FONT_24_ASCII);
    GUI_SetColor(GUI_RED);
    GUI_SetTextMode(GUI_TEXTMODE_TRANS);
    GUI_DispStringInRect(title, &rect, GUI_TA_HCENTER | GUI_TA_VCENTER);
    GUI_DispStringAt("Direct Draw", , );
    GUI_DispStringAt("Use Memory", , );
    GUI_MEMDEV_Handle hMem = GUI_MEMDEV_Create(, , , );
    int i = ;
    while ()
    {
        GUI_Delay();
        Draw(, , , , i); // 直接在LCD绘制
        GUI_MEMDEV_Select(hMem); //选择内存设备
        Draw(, , , , i); // 在内存中绘制
        GUI_MEMDEV_Select(); // 恢复LCD设备
        GUI_MEMDEV_CopyToLCDAt(hMem, , );
        i++;
        if (i >= ) i = ;
    }
  while();
}
void Draw(int x0, int y0, int x1, int y1, int i)
{
    char buf[] = {  };
    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) / , y0 + (y1 - y0) /  - );
}
3、测试效果
测试截图如下:

动态效果可以看到,左侧直接绘制有闪烁,尤其是百位数字即使没有更新时候也会闪烁一次。右侧是先在内存中绘制,然后从内存设备拷贝到界面上,只需要更新一次,没有闪烁。

4、参考文献
1、《emWin用户参考手册》
2、野火《emWin应用开发实战指南》
嵌入式LCD闪烁--emWin使用内存设备避免闪烁的更多相关文章
- Visual C++ 打印编程技术-内存设备环境
		1.内存设备环境 内存设备环境是一个没有设备与它联系的环境.一般利用与某个标准设备环境兼容的内存设备环境把一个位图复制到屏幕上去.为此可以先创建一个与某个标准设备环境兼容的内存设备环境,然后把所要显示 ... 
- JZ2440学习笔记之内存设备
		通过OM[1:0]选择启动的设备: OM[1:0]=00,地址0对应的是Internal 4K RAM,且Nand的前4K会被复制到这里,得到执行: OM[1:0]=01,地址0对应的是Nor Fla ... 
- LCD驱动分析(一)字符设备驱动框架分析
		参考:S3C2440 LCD驱动(FrameBuffer)实例开发<一> S3C2440 LCD驱动(FrameBuffer)实例开发<二> LCD驱动也是字符设备驱动,也 ... 
- 在编程的时候,NotePad++ 中闪烁的光标突然有竖着闪烁的编程蓝色下划线闪烁的--小技巧告诉你-费元星
		当在写代码时出现的光标闪烁(横线闪烁) 在键盘上找 Insert ,按这个Insert就可以把横向闪烁光标( _ )修改成竖向闪烁光标样式( | ),横向光标会在你写代码的时候修改前面的代码,把光标移 ... 
- Linux 驱动学习笔记05--字符驱动实例,实现一个共享内存设备的驱动
		断断续续学驱动,好不容易有空,做了段字符驱动的例子.主要还是跟书上学习在此记录下来,以后说不定能回过头来温故知新. 首先上驱动源码 gmem.c: /************************* ... 
- 嵌入式无操作系统下管理内存和队列(类UCOS II思想)
		例子:存储日志,最多存128条,每条最大1MB. 内存方面 因为嵌入式不适合用动态内存,会产生碎片.这里我们用 u8 data[LOG_SIZE];开辟固定128MB的内存区,再对其分为128个1MB ... 
- 嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化
		一.内存管理基本知识 1.S3C2440最多会用到两级页表:以段的方式进行转换时只用到一级页表,以页的方式进行转换时用到两级页表.页的大小有三种:大页(64KB),小页(4KB),极小页(1KB).条 ... 
- 关于NGUI制作图集在低内存设备上的注意事项
		正在写一个游戏.由于2D且比较简单.打算用NGUI全权搞定,对,游戏内容也用NGUI. 想的很好,做的很爽.PC上跑起来happy. 天杀的诺基亚出了个手机叫lumia520,可用内存512M.单个程 ... 
- android 关于LCD背光调节渐变过程引起背光闪烁问题
		如果背光渐变过程会引起背光闪烁,可以采取以下任意一种方法修改: 方法1.减少调节级别时间 http://blog.csdn.net/sergeycao 默认的设计在关闭背光时会有灭屏动画,就是 ... 
随机推荐
- python 面向对象静态方法、类方法、属性方法、类的特殊成员方法
			静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性. 在类中方法定义前添加@staticmethod,该方法就与类中的其他(属性,方法)没有关系,不能通过实例化类调用方法使用 ... 
- ES插件升级
			#!/bin/bash mkdir -p /home/esuser cd /home/esuser wget http://10.12.xx.xx:8090/search_plugins/sd_wai ... 
- kettle_errot_karafLifecycleListenter
			使用kettle 6.1 通过命令行批量执行作业的过程中,发现偶尔有作业执行时间会变慢几分钟,查看日志发现改作业开始就报了一个错 报错之后才会继续下面的作业,虽然不影响最终作业执行结果,但也延误了一些 ... 
- RPi.GPIO 和 HM
			后续笔记不再记录导入的模块和硬件的连接方法,请根据关键词自行搜索. RPi.GPIO模块 GPIO:General Purpose Input Output 即 通用输入/输出 RPi.GPIO是一个 ... 
- 强制迁移、合区 APP太强势伤害用户同时是否违法?
			APP太强势伤害用户同时是否违法?" title="强制迁移.合区 APP太强势伤害用户同时是否违法?"> 对于经常混迹在国内各大手游的玩家来说,"合区& ... 
- 手把手教你如何用MSF进行后渗透测试!
			在对目标进行渗透测试的时候,通常情况下,我们首先获得的是一台web服务器的webshell或者反弹shell,如果权限比较低,则需要进行权限提升:后续需要对系统进行全面的分析,搞清楚系统的用途:如果目 ... 
- Java面试必问之Hashmap底层实现原理(JDK1.7)
			1. 前言 Hashmap可以说是Java面试必问的,一般的面试题会问: Hashmap有哪些特性? Hashmap底层实现原理(get\put\resize) Hashmap怎么解决hash冲突? ... 
- 动态构造任意复杂的 Linq Where 表达式
			前言 Linq 是 C# 中一个非常好用的集合处理库,用好了能帮我们简化大量又臭又长的嵌套循环,使处理逻辑清晰可见.EF 查询主要也是依赖 Linq.但是 Linq 相对 sql 也存在一些缺点,最主 ... 
- 【Python3】HTML基础
			[web前端]HTML基础 一.BS模式 BS(Browser-Server)模式:顾名思义为浏览器-服务器的意思,对比的话类似我们PC上面浏览器使用的产品即为BS模式产品,例如google doc. ... 
- OOM when allocating tensor of shape [] and type float [[node conv2d_224/kernel/Initializer/random_uniform/min (defined at ./intances/utils.py:19) ]]
			当你们在用模型加载,tensorflow-gpu预测的时候,有没有出现这样的错误?? 经过网上的资料查阅,更多的解释是GPU的显存不足造成的,于是乎,我查看了一下GPU显存:nvidia-smi 不看 ... 
