厌倦了移植底层,而且主要是想写ui的话,感觉这种库会好一点
配置方式
进度条
void u8g2_DrawBox(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h)
void u8g2_DrawFrame(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h)
进度条
#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#include <u8g2_port.h>
static void u8g2_box_frame(u8g2_t *u8g2,uint16_t a) {
u8g2_SetFont(u8g2, u8g2_font_ncenB08_tr);
rt_sprintf(prodedure, "%d/360",a);
u8g2_DrawStr(u8g2, 70, 15, prodedure);
u8g2_DrawBox(u8g2,4,10,a/6,5);
u8g2_DrawFrame(u8g2,4,10,60,5);
}
static void u8g2_ssd1306_12864_hw_i2c_example()
{
u8g2_t u8g2;
// Initialization
u8g2_Setup_ssd1306_i2c_128x64_noname_f( &u8g2, U8G2_R0, u8x8_byte_rt_hw_i2c,u8x8_rt_gpio_and_delay);
u8g2_InitDisplay(&u8g2);
u8g2_SetPowerSave(&u8g2, 0);
for (int i= 0; i< 360/6; i++) {
u8g2_ClearBuffer(&u8g2);
u8g2_box_frame(&u8g2,i);
u8g2_SendBuffer(&u8g2);
rt_thread_mdelay(500);
}
/* full buffer example, setup procedure ends in _f */
}
MSH_CMD_EXPORT(u8g2_ssd1306_12864_hw_i2c_example, i2c ssd1306 sample);
int main(void)
{
u8g2_ssd1306_12864_hw_i2c_example();
return RT_EOK;
}
为u8g2创建线程注意事项
刚开始 堆栈大小 给的 512
程序会卡在
u8g2_InitDisplay(&u8g2);
后来改成 1024 就不会卡了
u8g2 库的缓存区占用的开销太大了
static void u8g2_oled_entry(void *parameter)
{
u8g2_t u8g2;
uint16_t m_last_index = 0; //上一次的下标,判断数据是否变化
// Initialization
u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_rt_hw_i2c, u8x8_rt_gpio_and_delay);
u8g2_InitDisplay(&u8g2);
u8g2_SetPowerSave(&u8g2, 0);
/* 循环更新 */
while (1)
{
for (int i= 0; i< 360/6; i++) {
u8g2_ClearBuffer(&u8g2);
u8g2_box_frame(&u8g2,i);
u8g2_SendBuffer(&u8g2);
rt_thread_mdelay(500);
}
rt_thread_mdelay(1000);
}
}
static int u8g2_ssd1306_12864_hw_i2c_example()
{
static rt_uint8_t is_init = 0;
rt_thread_t tid1 = RT_NULL;
if (is_init > 0)
{
rt_kprintf("sample is running\n");
return -RT_ERROR;
}
tid1 = rt_thread_create("u8g2_oled", u8g2_oled_entry, RT_NULL, 1024, U8G2_OLED_THREAD_PRIORITY, 10);
if (tid1 != RT_NULL)
{
rt_thread_startup(tid1);
}
else
{
goto __exit;
}
is_init = 1;
return RT_EOK;
__exit: if (tid1)
rt_thread_delete(tid1);
return -RT_ERROR;
}
感觉放在main线程也没问题,不过main线程的 优先级好像是 10。