|
特别说明:pdf版60期emWin教程已经发布:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=2932
armfly-x2,x3,v2,v3,v5开发板裸机和带系统的emWin工程已经全部建立,链接如下:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=1830
本期主要讲emWin支持的BMP图片的显示,官方支持的主要有两种显示方法,一种是从外部存储器读取数据到内部存
储器然后来显示图片,这种的显示速度要快些,另一种方法是直接从外部存储器读取数据并显示,这种办法的好处就是不要
大的RAM需求,每次读取一些数据显示一次,坏处就是显示速度比较的慢。
这里有一点必须的要说明一下,官方支持的这个BMP图片的显示速度没有咱们平时用的在TFT上面开窗然后填充图片数
据的速度快,但是有一个非常大的好处就是使用官方的这个函数才能充分的发挥背景重绘等机制。
GUI_BMP_DrawEx() 绘制已加载到存储器的BMP文件
GUI_BMP_Draw() 绘制已加载到存储器的BMP文件
GUI_BMP_DrawScaled() 绘制已加载到存储器的带比例的BMP文件
就是把上面的图片放大一下
本期分为三个小节:
7. 1 BMP函数说明
7. 2 将生成的字体移植到armfly - v5开发板上面
7. 3 实验总结
7. 1 BMP函数说明
7.1.1 GUI_BMP_Draw() 绘制已加载到存储器的BMP文件绘制已加载到存储器的BMP文件
这个函数的使用比较简单, 从SD卡中读出BMP图片的数据以后,直接显示就可以了,但是有
时候比较大的图片需要从emWin的动态内存里面申请一块空间,使用完了放回去就可以了,方法
如下:
/* 申请一块内存空间 并且将其清零 */
hMem = GUI_ALLOC_AllocZero(100000);
/* 将申请到内存的句柄转换成指针类型 */
_acBuffer2 = GUI_ALLOC_h2p(hMem);
/* 释放申请的动态内存 */
GUI_ALLOC_Free(hMem);
此方法简单有效。
7.1.2 GUI_BMP_DrawEx() 绘制已加载到存储器的BMP文件。
使用这个函数有两个地方需要特别的注意,一个就是如何获取外部存储器的数据并用于这个函数,
另一个就是用于图片数据缓存的大小。
图片数据缓存的大小一定要大于定于图片显示横轴像素点的四倍,这一点非常的重要,搞错了图片
就显示不出来的,比如你的图片大小是800*480的,那么你的图片缓存的大小就至少得是800*4 = 3200字节。
获取外部存储器数据的方法,这个方法是通用的。
- /*
- ********************************************************************************
- *
- * _GetData
- *
- * Purpose:
- * This routine is called by GUI_JPEG_DrawEx(). The routine is responsible
- * for setting the data pointer to a valid data location with at least
- * one valid byte.
- *
- * Parameters:
- * p - Pointer to application defined data.
- * NumBytesReq - Number of bytes requested.
- * ppData - Pointer to data pointer. This pointer should be set to
- * a valid location.
- * StartOfFile - If this flag is 1, the data pointer should be set to the
- * beginning of the data stream.
- *
- * Return value:
- * Number of data bytes available.
- *********************************************************************************
- */
- static int _GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off) {
- static int FileAddress = 0;
- UINT NumBytesRead;
- FIL *PicFile;
- PicFile = (FIL *)p;
- /*
- * Check buffer size
- */
- if (NumBytesReq > sizeof(_acBuffer)) {
- NumBytesReq = sizeof(_acBuffer);
- }
- /*
- * Set file pointer to the required position
- */
- if(Off == 1) FileAddress = 0;
- else FileAddress = Off;
- result =f_lseek(PicFile, FileAddress);
- /*
- * Read data into buffer
- */
- result = f_read(PicFile, _acBuffer, NumBytesReq, &NumBytesRead);
- /*
- * Set data pointer to the beginning of the buffer
- */
- *ppData = (const U8 *)_acBuffer;
- /*
- * Return number of available bytes
- */
- return NumBytesRead;
- }
复制代码 7. 2 将生成的字体移植到armfly - v5开发板上面
移植很简单,这里就不和大家说了,详细看附件里面的程序。
7. 3 实验总结
整体来说F407刷图片的能力有限,当然刷一些小的图片还是松松的。
SD卡中需要放的图片
下载到根目录的图片.zip
(259 KB, 下载次数: 589)
程序下载
第七期:STemWin5.20+uCOS-III+FatFS.zip
(15.88 MB, 下载次数: 6512)
|
|