嵌入式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 默认的设计在关闭背光时会有灭屏动画,就是 ...
随机推荐
- [资讯]同济D&I出品 | 绝对是史上最萌的机器人教具!!!
机器人小曼……" 3D打印.激光切割等先进工艺. Anibot中包含三种不同的动物形象:小鸡安妮.小鹿安娜.猫头鹰安迪.孩子们通过对各个元器件的学习及编程确保它们幸福成长在阳光氤氲的森林 ...
- vue基础指令了解
Vue了解 """ vue框架 vue是前台框架:Angular.React.Vue vue:结合其他框架优点.轻量级.中文API.数据驱动.双向绑定.MVVM设计模式. ...
- Centos7上pkg-config的安装
1.官网下载自己想要的版本,我这里下载的是目前最新版 https://www.freedesktop.org/wiki/Software/pkg-config/ 2.安装 tar xf XXX.tgz ...
- Pip安装TensorFlow报错:MemoryError
问题描述 使用pip安装TensorFlow时,一直报错,情况如下: 解决办法 使用如下命令可正常安装: pip3 install --no-cache-dir tenstoflow --no-cac ...
- 烧钱时代终结!O2O还能玩啥花样?
最终的最终,饱受亏损.烧钱玩补贴等争议的美团还是追随滴滴/快的.赶集/58的步伐,与大众点评愉快的在一起了!美团和大众点评作为O2O行业的领军企业,都因为不堪忍受持续地投入却不见回报的模式而不得不放低 ...
- 使用TensorFlow训练自己的语音识别AI
这次来训练一个基于CNN的语音识别模型.训练完成后,我们将尝试将此模型用于Hotword detection. 人类是怎样听懂一句话的呢?以汉语为例,当听到"wo shi"的录音时 ...
- Samtec与Neoconix达成合作并和II-VI推出新产品
序言:Samtec近日动作不断, 近日Samtec与Neoconix达成合作并和II-VI推出新产品,以下是详细内容. Samtec与Neoconix签订Neoconix PCBeam 技术授权协议, ...
- 奉上简单的.Net后端开发模板
假定一个场景,开始做开发的你,领导走到你的面前说道:"小伙子,看了简历和最近的工作表现,很不错,现在交给一个任务,开发一个简单的CMS后端接口吧,前端有人配合你",当时你内心读白: ...
- 用 git 钩子,检测代码规范性(eslint、standard)
最终实现效果说明:用 git commit 提交代码之前,利用 pre-commit git 钩子,实现代码规范检测(eslint.standard 规范),符合规范之后才可以提交到 git 仓库.这 ...
- 搭建Flutter开发环境需要注意的几个小Tips
目录 下载SDK 安装 Android Stdio + SDK + tool SDK + 创建模拟器 + 插件(flutter和dart) Xcode + cocoapods VSCode + Flu ...