请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G070在OLED上移植U8G2单色GUI

[复制链接]
STMWoodData 发布时间:2023-10-3 17:21

在自己做了一块板子上带有OLED,本次就准备在OLED上移植U8G2这个单色GUI,试试效果。

参考了网上一些资料,下面简单介绍一下移植过程。

主要移植如下:

首先下载U8G2的源码,将所有源码添加到工程中。

image.png

u8g2包含很多单色屏的驱动,文件名称格式是类是 u8x8_d_xxxxx.c 文件。

oled使用的是SSD1306驱动芯片,128*64分辨率,I2C接口。

所以必须包含他的驱动文件 u8x8_d_ssd1306_128x64_noname.c

image.png

接着需要实现以下2个函数。等下初始化oled接口需要用到。

uint8_t u8x8_byte_hc32_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
    static uint8_t buffer[32];                /* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */
    static uint8_t buf_idx;
    uint8_t *data;

    switch(msg)
    {
        case U8X8_MSG_BYTE_SEND:
        data = (uint8_t *)arg_ptr;
        while( arg_int > 0 )
        {
        buffer[buf_idx++] = *data;
        data++;
        arg_int--;
        }    
        break;
        case U8X8_MSG_BYTE_INIT:
        /* add your custom code to init i2c subsystem */
        break;
        case U8X8_MSG_BYTE_SET_DC:
        /* ignored for i2c */
        break;
        case U8X8_MSG_BYTE_START_TRANSFER:
        buf_idx = 0;
        break;
        case U8X8_MSG_BYTE_END_TRANSFER:
        HAL_I2C_Master_Transmit(&SSD1306_I2C_PORT, SSD1306_I2C_ADDR, buffer, buf_idx, HAL_MAX_DELAY);
        break;
        default:
        return 0;
    }
    return 1;
}

uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
    switch(msg)
    {
    case U8X8_MSG_GPIO_AND_DELAY_INIT:
        /* Insert codes for initialization */
        break;
    case U8X8_MSG_DELAY_MILLI:
        /* ms Delay */
        SysTick_DelayTicks(arg_int);
        break;
//    case U8X8_MSG_GPIO_MENU_SELECT:
//        u8x8_SetGPIOResult(u8x8, /* get menu select pin state */ 0);
//        break;
//    case U8X8_MSG_GPIO_MENU_NEXT:
//        u8x8_SetGPIOResult(u8x8, /* get menu next pin state */ 0);
//        break;
//    case U8X8_MSG_GPIO_MENU_PREV:
//        u8x8_SetGPIOResult(u8x8, /* get menu prev pin state */ 0);
//        break;
//    case U8X8_MSG_GPIO_MENU_HOME:
//        u8x8_SetGPIOResult(u8x8, /* get menu home pin state */ 0);
//        break;
    default:
        u8x8_SetGPIOResult(u8x8, 1); // default return value
        break;
    }
    return 1;
}

下面就是初始化函数

u8g2_t g_u8g2;
void u8g2Init(u8g2_t *u8g2)
{
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_hc32_hw_i2c, u8x8_gpio_and_delay);
    u8g2_InitDisplay(u8g2);
    u8g2_SetPowerSave(u8g2, 0);
    u8g2_ClearBuffer(u8g2);
}

然后在main函数中初始化:

  u8g2Init(&g_u8g2);

下面是测试绘图函数:

void draw(u8g2_t *u8g2)
{
    u8g2_ClearDisplay(u8g2);
    u8g2_SetFontMode(u8g2, 1); /*字体模式选择*/
    u8g2_SetFontDirection(u8g2, 0); /*字体方向选择*/
    u8g2_SetFont(u8g2, u8g2_font_inb24_mf); /*字库选择*/
    u8g2_DrawStr(u8g2, 0, 20, "U");

    u8g2_SetFontDirection(u8g2, 1);
    u8g2_SetFont(u8g2, u8g2_font_inb30_mn);
    u8g2_DrawStr(u8g2, 21,8,"8");

    u8g2_SetFontDirection(u8g2, 0);
    u8g2_SetFont(u8g2, u8g2_font_inb24_mf);
    u8g2_DrawStr(u8g2, 51,30,"g");
    u8g2_DrawStr(u8g2, 67,30,"\xb2");

    u8g2_DrawHLine(u8g2, 2, 35, 47);
    u8g2_DrawHLine(u8g2, 3, 36, 47);
    u8g2_DrawVLine(u8g2, 45, 32, 12);
    u8g2_DrawVLine(u8g2, 46, 33, 12);

    u8g2_SetFont(u8g2, u8g2_font_6x12_tr);
    u8g2_DrawStr(u8g2, 1, 54,"u8g2 test by");
    u8g2_DrawStr(u8g2, 60,64,"stmwooddata");
    u8g2_SendBuffer(u8g2);
}

image.png

最后看看实际效果。

image.pngimage.png

收藏 评论1 发布时间:2023-10-3 17:21

举报

1个回答
xu@xupt 回答时间:2023-10-11 18:24:13
[md]学习啦
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版