emWin任务的具体实现(在MainTask.c文件里面):
复制代码
#include "MainTask.h"
#include "includes.h"
/*
*********************************************************************************************************
* 函 数 名: _GetData
* 功能说明: 被函数GUI_PNG_DrawEx调用
* 形 参: p FIL类型数据
* NumBytesReq 请求读取的字节数
* ppData 数据指针
* Off 如果Off = 1,那么将重新从其实位置读取
* 返 回 值: 返回读取的字节数
*********************************************************************************************************
*/
static int _GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off)
{
static int FileAddress = 0;
FIL *file;
UINT NumBytesRead;
U8 * pData;
pData = (U8 *)*ppData;
file = (FIL *)p;
//
// 设置数据读取位置
//
if(Off == 1) FileAddress = 0;
else FileAddress = Off;
result =f_lseek(file, FileAddress);
//
// 读取数据到缓存
//
result = f_read(file, pData, NumBytesReq, &NumBytesRead);
//
// 返回读取大小
//
return NumBytesRead;
}
/*
*********************************************************************************************************
* 函 数 名: _ShowPNG1
* 功能说明: 显示PNG图片,使用函数GUI_PNG_DrawEx
* 形 参: sFilename 要显示的图片名字
* x 要显示的x轴坐标位置
* y 要显示的y轴坐标位置
* 返 回 值: 无
*********************************************************************************************************
*/
static void _ShowPNG1(const char * sFilename, int x, int y)
{
/* 打开文件 */
result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
if (result != FR_OK)
{
return;
}
/* 显示PNG图片 */
GUI_PNG_DrawEx(_GetData, &file, x, y);
/* 关闭文件 */
f_close(&file);
}
/*
*********************************************************************************************************
* 函 数 名: _ShowPNG2
* 功能说明: 显示PNG图片,使用函数GUI_PNG_Draw
* 形 参: sFilename 要读取的文件名
* x 要显示的x轴坐标位置
* y 要显示的y轴坐标位置
* 返 回 值: 无
*********************************************************************************************************
*/
void _ShowPNG2(const char *sFilename, int x, int y)
{
char *_acBuffer;
GUI_HMEM hMem;
/* 打开文件 */
result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
if (result != FR_OK)
{
return;
}
/* 申请一块内存空间 并且将其清零 */
hMem = GUI_ALLOC_AllocZero(file.fsize);
/* 将申请到内存的句柄转换成指针类型 */
_acBuffer = GUI_ALLOC_h2p(hMem);
/* 读取文件到动态内存 */
result = f_read(&file, _acBuffer, file.fsize, &bw);
if (result != FR_OK)
{
return;
}
/* 显示PNG图片 */
GUI_PNG_Draw(_acBuffer, file.fsize, x, y);
/* 释放动态内存hMem */
GUI_ALLOC_Free(hMem);
/* 关闭文件 */
f_close(&file);
}
/*
*********************************************************************************************************
* 函 数 名: MainTask
* 功能说明: GUI主函数
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void MainTask(void)
{
/* 初始化 */
GUI_Init();
/*
关于多缓冲和窗口内存设备的设置说明
1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
WM_MULTIBUF_Enable(1);
2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
4. 所有emWin例子默认是开启三缓冲。
*/
WM_MULTIBUF_Enable(1);
/*
触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行
此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。
*/
//TOUCH_Calibration();
/* 设置字体,文本模式和前景色 */
GUI_SetFont(&GUI_Font16B_ASCII);
GUI_SetColor(GUI_WHITE);
/* 清屏 */
GUI_SetBkColor(GUI_BLUE);
GUI_Clear();
/* PNG图片显示方式一,边加载边显示 */
_ShowPNG1("1.png", 10, 10);
_ShowPNG1("2.png", 110, 10);
GUI_DispStringAt("Draw by GUI_PNG_DrawEx", 230, 10);
/* PNG图片显示方式二,直接加载到SDRAM,然后显示 */
_ShowPNG2("3.png", 10, 120);
_ShowPNG2("4.png", 110, 120);
GUI_DispStringAt("Draw by GUI_PNG_Draw", 230, 120);
while(1)
{
GUI_Delay(10);
}
} |