在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶(128x64)

例程说明

参考例程: 在CodeBlocks下搭建SDL2开发工程
参考例程: STM32F103xx TFT液晶显示ASCII字符串、中文、图片并且显示带有镜像和旋转功能

1. 在CodeBlocks下搭建SDL2工程,并且虚拟OLED单色液晶的显示

源码下载目录

源码下载目录: 在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶(128x64)

工程配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、SDL2的初始化和退出


/* 初始化SDL2 */
static u8 xInit_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;
    }

    /* 创建窗口 */
    AppMainWin = SDL_CreateWindow("SDL2 Demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_PHY_WIDTH, WINDOW_PHY_HEIGHT, SDL_WINDOW_SHOWN);
    if (AppMainWin == NULL)
    {
   
   
        SDL_Log("SDL Create Window Fail......%s\r\n", SDL_GetError());
        return 2;
    }

    /* 创建渲染器 */
    AppRender = SDL_CreateRenderer(AppMainWin, -1, SDL_RENDERER_ACCELERATED);
    if (AppRender == NULL)
    {
   
   
        SDL_Log("SDL Create Renderer......%s", SDL_GetError());
        return 3;
    }

    // 清空渲染器
    SDL_Rect rect = {
   
   0, 0, (OLED_PHY_XWIDTH * A_PIXEL_SIZE), (OLED_PHY_YHEIGHT * A_PIXEL_SIZE)};
    SDL_RenderClear(AppRender);
    SDL_SetRenderDrawColor(AppRender, OLED_DEF_BACK_COLOR); //背景色
    SDL_RenderFillRect(AppRender, &rect);
    SDL_RenderPresent(AppRender);

    return 0;
}




/* 退出SDL2 */
static void vQuit_SDL2(void)
{
   
   
    SDL_Log("Complier Date: %s  %s\r\n", __DATE__, __TIME__);

    /* 销毁渲染器 */
    if (AppRender != NULL)  SDL_DestroyRenderer(AppRender);

    /* 销毁窗口 */
    if (AppMainWin != NULL) SDL_DestroyWindow(AppMainWin);

    /* 退出SDL */
    SDL_Quit();
}

二、OLED画点和读点


/* 画点 */
void vOLED_DrawPoint(u16 x, u16 y, u8 mode)
{
   
   
    u8  yTemp = 0;
    u16 yPost = 0;

    yPost = y / 8; /* 页位置 */
    yTemp = 0x01 << (y % 8); /* 页偏移位置 */

    if (mode) OLED_DISP_GRAM[x][yPost] |= yTemp;    /* 置位 */
    else      OLED_DISP_GRAM[x][yPost] &= (~yTemp); /* 清零 */
}


/* 读点 */
u8 xOLED_ReadPoint(u16 x, u16 y)
{
   
   
    u8  yTemp = 0;
    u16 yPost = 0;

    yPost = y / 8; /* 页位置 */
    yTemp = 0x01 << (y % 8); /* 页偏移位置 */
    return ((OLED_DISP_GRAM[x][yPost] & yTemp) ? 0x01 : 0x00);
}

三、更新OLDE的GRAM


/* 写GRAM */
void vOLED_UpdateGRAM(void)
{
   
   
    // SDL_Log("OLED Update Start......%llu\r\n", SDL_GetTicks64());

    SDL_Rect rect = {
   
   0, 0, A_PIXEL_SIZE, A_PIXEL_SIZE};
    u16 x = 0, y = 0, i = 0;
    u8  dat = 0;

    for (x = 0; x < OLED_DISP_GRAM_XWIDTH_MAX; ++x)
    {
   
   
        rect.x = x * A_PIXEL_SIZE;/* 实际绘制X */
        for (y = 0; y < OLED_DISP_GRAM_YHEIGHT_MAX; ++y)
        {
   
   
            dat = OLED_DISP_GRAM[x][y];
            for (i = 0; i < 8; ++i)
            {
   
   
                rect.y = ((y << 3) + i) * A_PIXEL_SIZE;/* 实际绘制Y */
                if ((dat >> i) & 0x01) SDL_SetRenderDrawColor(AppRender, OLED_DEF_FORE_COLOR); //前景色
                else                   SDL_SetRenderDrawColor(AppRender, OLED_DEF_BACK_COLOR); //背景色

                SDL_RenderFillRect(AppRender, &rect); // 填充矩形
            }
        }
    }

    SDL_RenderPresent(AppRender); /* 更新屏幕 */
    // SDL_Log("OLED Update End......%llu\r\n", SDL_GetTicks64());
}

四、清屏和清某区域

/* 清屏 */
void vOLED_ClearScreen(void)
{
   
   
    u16 x = 0, y = 0;

    for (x = 0; x < OLED_DISP_GRAM_XWIDTH_MAX; ++x)
    {
   
   
        for (y = 0; y < OLED_DISP_GRAM_YHEIGHT_MAX; ++y)
        {
   
   
            OLED_DISP_GRAM[x][y] = 0;
        }
    }

    SDL_Rect rect = {
   
   0, 0, (OLED_PHY_XWIDTH * A_PIXEL_SIZE), (OLED_PHY_YHEIGHT * A_PIXEL_SIZE)};
    SDL_SetRenderDrawColor(AppRender, OLED_DEF_BACK_COLOR);
    SDL_RenderFillRect(AppRender, &rect);
    SDL_RenderPresent(AppRender);
}


void vOLED_ClearArea(u16 x0, u16 y0, u16 x1, u16 y1, u8 mode)
{
   
   
    u16 x = 0, y = 0;

    for (x = x0; x <= x1; x++)
    {
   
   
        for (y = y0; y <= y1; y++)
        {
   
   
            if ((x < AppDevOLED.xWidth) && (y < AppDevOLED.yHeight))
            {
   
   
                vOLED_DrawPoint(x, y
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值