17 Star 58 Fork 24

Talkweb_OpenHarmony / Niobe

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 6.74 KB
一键复制 编辑 原始数据 按行查看 历史
angeyan 提交于 2021-11-16 14:48 . update

Niobe开发板OLED演示HarmonyOS开机动画

本案例程序将演示怎么在拓维Niobe WiFi IoT OLED开发板上,使用u8g2图形库显示HarmonyOS开机动画和品牌LOGO。

u8g2 是一个强大的图形库,支持非常多的显示屏。SSD1306就是其支持的一款OLED显示屏幕。图形库通过提供API函数的方法,使用户可以非常方便的显示各种各样图标,字符甚至动效等。

u8g2库已经移植到third_party/u8g2/目录下方。

U8G2 API分析

本案例主要使用了以下几个API完成开机动画显示。

u8g2_Setup_ssd1306_i2c_128x64_noname_f()

void u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb);

描述:

u8g2在SSD1306芯片上,使用I2C通信的初始化设置函数,支持128x64点阵像素,支持全屏缓存模式。

参数:

名字 描述
u8g2 表示u8g2信息
ratation 表示屏幕旋转方向。本例设置为U8G2_R0(横屏不旋转)
byte_cb 字节消息回调接口
gpio_and_delay_cb GPIO操作消息和延迟消息的回调接口

u8g2_InitDisplay()

#define u8g2_InitDisplay(u8g2) u8x8_InitDisplay(u8g2_GetU8x8(u8g2))

描述:

初始OLED显示器,将向OLED显示器发送init消息。此函数会触发两种操作,一种是OLED硬件初始,一种是OLED显示屏初始清屏。

参数:

名字 描述
u8g2 表示u8g2信息

u8g2_SetPowerSave()

#define u8g2_SetPowerSave(u8g2, is_enable) u8x8_SetPowerSave(u8g2_GetU8x8(u8g2), (is_enable))

描述:

设置省电模式是否启动。

参数:

名字 描述
u8g2 表示u8g2信息
is_enable 是否省电模式可用

u8g2_FirstPage()

void u8g2_FirstPage(u8g2_t *u8g2);

描述:

分页模式下,向OLED显示器发送第一页缓冲数据,显示第一页。

参数:

名字 描述
u8g2 表示u8g2信息

u8g2_NextPage()

uint8_t u8g2_NextPage(u8g2_t *u8g2);

描述:

分页模式下,判断缓冲区中是否还有下一页内容。

参数:

名字 描述
u8g2 表示u8g2信息

u8g2_DrawXBMP()

void u8g2_DrawXBMP(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap);

描述:

在程序中使用位图,绘制bitmap位图到OLED显示器中。

参数:

名字 描述
u8g2 表示u8g2信息
x x轴上的起点坐标
y y轴上的起点坐标
w 位图的宽度
h 位图的高度
bitmap 位图字节数据指针

软件设计

主要代码分析

开发板启动直接显示未来已来,远方不远的Talkweb Logo,按键一次后可以进入HarmonyOS开机动画。

  1. DrawTalkwebLogo函数封装了“未来已来,远方不远”的Talkweb Logo位图绘制过程。

  2. DrawHarmonyOSAnimation函数封装了HarmonyOS开机动画的绘图绘制过程。

  3. while循环进行HarmonyOS开机动画和Talkweb Logo循环显示。

  4. GPIO按键中断改变g_startBootAnimationFlag的值,来控制while循环的进出。

static void GpioSsdIsrFunc(char *arg)
{
    (void)arg;

    //消除按键抖动
    unsigned int tickCount = osKernelGetTickCount();
    unsigned int count = tickCount - g_lastTickCount;
    g_lastTickCount = tickCount;

    if (count > 50)
    {
        g_startBootAnimationFlag ^= 1;
        osSemaphoreRelease(g_gpioIsrSemId);
    }

    return;
}

/**
 * 初始化开发板上的按键GPIO中断
 */
static void InitOledKeyGpioIsr(void)
{
    g_gpioIsrSemId = osSemaphoreNew(32, 0, NULL);

    IoTGpioInit(IOT_GPIO_IO_GPIO_5);
    IotIoSetFunc(IOT_GPIO_IO_GPIO_5, HI_IO_FUNC_GPIO_5_GPIO);
    IotIoSetPull(IOT_GPIO_IO_GPIO_5, IOT_IO_PULL_UP);

    uint32_t ret = 0;
    ret = IoTGpioSetDir(IOT_GPIO_IO_GPIO_5, IOT_GPIO_DIR_IN);
    if (ret != 0)
    {
        printf("===== ERROR ======gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret);
        return;
    }
    ret = IoTGpioRegisterIsrFunc(IOT_GPIO_IO_GPIO_5, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_RISE_LEVEL_HIGH, GpioSsdIsrFunc, NULL);

    return;
}

/**
 *  绘制HarmonyOS开机动画
 */
static void DrawHarmonyOSAnimation(void)
{
    for (int i = 0; i < 58; i++)
    {
        u8g2_FirstPage(&u8g2);
        do
        {
            u8g2_DrawXBMP(&u8g2, 0, 0, 128, 64, openHarmony_All[i]);
        } while (u8g2_NextPage(&u8g2));
    }
}

/**
 * 绘制Talkweb LOGO,未来已来,远方不远
 */
static void DrawTalkwebLogo(void)
{
    u8g2_FirstPage(&u8g2);
    do
    {
        u8g2_DrawXBMP(&u8g2, 0, 0, 128, 64, talkweb_end);
    } while (u8g2_NextPage(&u8g2));
}

static void OledU8g2Task(void)
{
    //初始化OLED开发板上的按键中断事件
    InitOledKeyGpioIsr();

    //U8G2_R0:屏幕旋转方向,横屏不旋转。
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, U8g2Hi3861I2cByteCb, U8g2Hi3861GpioAndDelayCb);

    //初始OLED显示器,将向OLED显示器发送init消息
    //此函数会触发两种操作,一种是OLED硬件初始,一种是OLED显示屏初始清屏。
    u8g2_InitDisplay(&u8g2);

    //开启省电模式
    u8g2_SetPowerSave(&u8g2, 0);

    while (1)
    {
        DrawTalkwebLogo();
        osSemaphoreAcquire(g_gpioIsrSemId, osWaitForever);

        while (g_startBootAnimationFlag)
        {
            DrawHarmonyOSAnimation();
            osDelay(300U);
            DrawTalkwebLogo();
            osDelay(300U);
        }
    }
}

编译调试

修改 BUILD.gn 文件

修改 applications/app/BUILD.gn 路径中的 BUILD.gn 文件,指定 app_oled_u8g2_example 参与编译。

# "TW303_Network_mqttclient:network_mqttclient_example",
# "TW304_Network_httpclient:network_httpclient_example",
# "TW305_Network_ntpclient:network_ntpclient_example",
"TW402_APP_oled_u8g2:app_oled_u8g2_example",

运行结果

示例代码编译烧录代码后,按下开发板的RESET按键,可以直接看到OLED开发板的开机Talkweb Logo,按下开发板上的SW6/SW7按键,可以进入HarmonyOS动画循环播放,再按下SW6/SW7按键,可以停止HarmonyOS动画。 SW6/SW7按键在OLED开发板上,在正下方中部左侧是SW6按键,右侧是SW7按键,且开发板上有标注。

image-20210930161121332

1
https://gitee.com/talkweb_oh/niobe.git
git@gitee.com:talkweb_oh/niobe.git
talkweb_oh
niobe
Niobe
master

搜索帮助