同步操作将从 Talkweb_OpenHarmony/Niobe 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
本案例程序将演示怎么在拓维Niobe WiFi IoT OLED开发板上,使用u8g2图形库显示HarmonyOS开机动画和品牌LOGO。
u8g2 是一个强大的图形库,支持非常多的显示屏。SSD1306就是其支持的一款OLED显示屏幕。图形库通过提供API函数的方法,使用户可以非常方便的显示各种各样图标,字符甚至动效等。
u8g2库已经移植到third_party/u8g2/
目录下方。
本案例主要使用了以下几个API完成开机动画显示。
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操作消息和延迟消息的回调接口 |
#define u8g2_InitDisplay(u8g2) u8x8_InitDisplay(u8g2_GetU8x8(u8g2))
描述:
初始OLED显示器,将向OLED显示器发送init消息。此函数会触发两种操作,一种是OLED硬件初始,一种是OLED显示屏初始清屏。
参数:
名字 | 描述 |
---|---|
u8g2 | 表示u8g2信息 |
#define u8g2_SetPowerSave(u8g2, is_enable) u8x8_SetPowerSave(u8g2_GetU8x8(u8g2), (is_enable))
描述:
设置省电模式是否启动。
参数:
名字 | 描述 |
---|---|
u8g2 | 表示u8g2信息 |
is_enable | 是否省电模式可用 |
void u8g2_FirstPage(u8g2_t *u8g2);
描述:
分页模式下,向OLED显示器发送第一页缓冲数据,显示第一页。
参数:
名字 | 描述 |
---|---|
u8g2 | 表示u8g2信息 |
uint8_t u8g2_NextPage(u8g2_t *u8g2);
描述:
分页模式下,判断缓冲区中是否还有下一页内容。
参数:
名字 | 描述 |
---|---|
u8g2 | 表示u8g2信息 |
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开机动画。
DrawTalkwebLogo函数封装了“未来已来,远方不远”的Talkweb Logo位图绘制过程。
DrawHarmonyOSAnimation函数封装了HarmonyOS开机动画的绘图绘制过程。
while循环进行HarmonyOS开机动画和Talkweb Logo循环显示。
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);
}
}
}
修改 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按键,且开发板上有标注。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。