在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示
参考文章
源码下载地址
在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示
一、SDL2的创建、初始化、退出
typedef struct
{
SDL_Window * MainWindow; /* 窗口 */
SDL_Renderer * MainRender; /* 渲染器 */
SDL_Texture * MainTexture; /* 纹理 */
u8 ExitWindow; /* 退出窗口 */
}AppGlobal_TypeDef, * AppGlobal_TypeDef_t;
static AppGlobal_TypeDef AppSystem = {
0};
AppGlobal_TypeDef * pAppSystem = &AppSystem;
/* 初始化SDL */
static u8 ubInit_SDL2(void)
{
/* 初始化SDL */
if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0)
{
SDL_Log("SDL Init Fail......%s\r\n", SDL_GetError());
return 1;
}
/* 创建窗口 */
AppSystem.MainWindow = SDL_CreateWindow("Virtual TFT SDL2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_PHY_WIDTH, WINDOW_PHY_HEIGHT, SDL_WINDOW_SHOWN);
if (AppSystem.MainWindow == NULL)
{
SDL_Log("SDL Create Window Fail......%s\r\n", SDL_GetError());
return 2;
}
/* 创建渲染器 */
AppSystem.MainRender = SDL_CreateRenderer(AppSystem.MainWindow, -1, SDL_RENDERER_ACCELERATED);
if (AppSystem.MainRender == NULL)
{
SDL_Log("SDL Create Renderer Fail......%s", SDL_GetError());
return 3;
}
/* 创建纹理 */
AppSystem.MainTexture = SDL_CreateTexture(AppSystem.MainRender, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, TFT_LCD_PHY_XWIDTH, TFT_LCD_PHY_YHEIGHT);
if (AppSystem.MainTexture == NULL)
{
SDL_Log("SDL Create Texture Fail......%s", SDL_GetError());
return 4;
}
/* 设置纹理模式 */
SDL_SetTextureBlendMode(AppSystem.MainTexture, SDL_BLENDMODE_BLEND);
memset(TFT_LCD_DIS_MEMORY, 0x99, TFT_LCD_PHY_XWIDTH * TFT_LCD_PHY_YHEIGHT * sizeof(u32));
SDL_UpdateTexture(AppSystem.MainTexture, NULL, TFT_LCD_DIS_MEMORY, TFT_LCD_PHY_XWIDTH * sizeof(u32));
SDL_RenderClear(AppSystem.MainRender);
SDL_RenderCopy(AppSystem.MainRender, AppSystem.MainTexture, NULL, NULL);
SDL_RenderPresent(AppSystem.MainRender);
return 0;
}
/* 退出SDL */
static void vQuit_SDL2(void)
{
SDL_Log("Complier Date: %s %s %d\r\n", __DATE__, __TIME__, ulSuperTimer_GetTick());
/* 销毁纹理 */
if (AppSystem.MainTexture != NULL) SDL_DestroyTexture(AppSystem.MainTexture);
/* 销毁渲染器 */
if (AppSystem.MainRender != NULL) SDL_DestroyRenderer(AppSystem.MainRender);
/* 销毁窗口 */
if (AppSystem.MainWindow != NULL) SDL_DestroyWindow(AppSystem.MainWindow);
/* 退出SDL */
SDL_Quit();
}
二、系统基本Tick、彩屏刷新、按键事件
/* 系统基本Tick */
static void vSystem_BasicTick(void)
{
static Uint64 oldTick = 0;
Uint64 curTick = SDL_GetTicks64();
if (oldTick == curTick) return;
vSuperTimer_IncTick((u16)(curTick - oldTick));
oldTick = curTick;
}
/* 屏幕刷新+按键事件处理 */
static void vRefresh_KeyEvent_Handler(void)
{
static Uint64 oldTick = 0;
Uint64 curTick = SDL_GetTicks64();
SDL_Event event = {
0};
if ((curTick - oldTick) >= 20)
{
SDL_UpdateTexture(AppSystem.MainTexture, NULL, TFT_LCD_DIS_MEMORY, TFT_LCD_PHY_XWIDTH * sizeof(u32));