i’m newbie on LVGL.
i port lvgl to a STM32F405 proj, use SH1107 oled (128x64) via i2c
it show text after i call:
lv_obj_t *label = lv_label_create(lv_scr_act());
lv_label_set_text(label, “hEllo”);
lv_obj_center(label);lv_obj_t *bar = lv_bar_create(lv_scr_act()); lv_bar_set_range(bar, 0, 100); lv_bar_set_value(bar, 50, LV_ANIM_OFF);
others widget(button/ bar/ silider/ Line…) can be created, but never displayed on screen?
Did you know why?
====
Thanks to a blog by costascal
here is my low level driver code
void ssd1306_set_px_cb(lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w,
lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa) {
// printf(“pcb\n”);uint16_t byte_index = x + ((y >> 3) * buf_w); uint8_t bit_index = y & 0x7; if (color.full == 0) { BIT_SET(buf[byte_index], bit_index); } else { BIT_CLEAR(buf[byte_index], bit_index); }
}
void ssd1306_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) {
uint8_t row1 = area->y1 >> 3;
uint8_t row2 = area->y2 >> 3;
uint8_t *buf = (uint8_t *)color_p;uint8_t _col; uint16_t _len; for (uint8_t row = row1; row <= row2; row++) { ssd1306_cmd(0xB0 | row); _col = area->x1 + 2; // +2 for SH1106 ssd1306_cmd(0x00 | (_col & 0xf)); ssd1306_cmd(0x10 | (_col >> 4) & 0xf); _len = area->x2 - area->x1 + 1; HAL_I2C_Mem_Write(&(SSD1306_I2C_DEV), SSD1306_I2C_ADDR, 0x40, 1, buf, _len, 100); buf += _len; } lv_disp_flush_ready(disp_drv);
}
void ssd1306_rounder_cb(lv_disp_drv_t *disp_drv, lv_area_t *area) {
// printf(“rcb\n”);area->y1 = (area->y1 & (~0x7)); area->y2 = (area->y2 & (~0x7)) + 7;
}