关于lvgl库在oled单色屏幕上的使用,代码只测试了label, button控件以及动画功能,
oled驱动为ssd1306,单片机使用esp8266-12f,
编程环境arduino ide,
需要的库: Adafruit_SSD1306, Adafruit_GFX, Lvgl
lv_conf.h配置中修改:LV_COLOR_DEPTH 为 1
参考链接: https://www.cnblogs.com/caiya/p/15978839.html
测试代码:
#include <lvgl.h> #include <Wire.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define I2C_SDA 4 #define I2C_SCL 5 #define OLED_RESET -1 #define SCREEN_ADDRESS 0x3C #define LV_BUFF_SIZE (SCREEN_WIDTH * 16) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); static lv_disp_draw_buf_t draw_buf; static lv_color_t buf[LV_BUFF_SIZE]; void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) { uint32_t w = (area->x2 - area->x1 + 1); uint32_t h = (area->y2 - area->y1 + 1); //Send colors for (uint16_t y = area->y1; y <= area->y2; y++) { for (uint16_t x = area->x1; x <= area->x2; x++) { display.drawPixel(x, y, color_p->full); color_p++; } } display.display(); lv_disp_flush_ready(disp); } #if LV_USE_LOG != 0 void my_print(const char *buf) { Serial.printf(buf); Serial.flush(); } #endif static void gui_init() { lv_init(); #if LV_USE_LOG != 0 lv_log_register_print_cb(my_print); /* register print function for debugging */ #endif lv_disp_draw_buf_init(&draw_buf, buf, NULL, LV_BUFF_SIZE); /*Initialize the display*/ static lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); /*Change the following line to your display resolution*/ disp_drv.hor_res = SCREEN_WIDTH; disp_drv.ver_res = SCREEN_HEIGHT; disp_drv.flush_cb = my_disp_flush; disp_drv.draw_buf = &draw_buf; lv_disp_drv_register(&disp_drv); } static void oled_init() { Wire.begin(I2C_SDA, I2C_SCL); if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS, false, false)) { for (;;) { Serial.println(F("SSD1306 allocation failed")); delay(1000); }; } else { Serial.println(F("SSD1306 allocation success")); } display.display(); delay(2000); display.clearDisplay(); } lv_obj_t *gui_page_create() { lv_obj_t *root = lv_obj_create(NULL); lv_obj_set_size(root, SCREEN_WIDTH, SCREEN_HEIGHT); lv_obj_clear_flag(root, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_style_bg_color(root, lv_color_black(), LV_PART_MAIN); lv_obj_center(root); return root; } static void anim_x_cb(void * var, int32_t v) { lv_obj_set_x((lv_obj_t*)var, v); } static void anim_size_cb(void * var, int32_t v) { lv_obj_set_size((lv_obj_t*)var, v, v); } static void gui_test() { lv_obj_t * root = gui_page_create(); //Label lv_obj_t * label = lv_label_create(root); lv_label_set_text( label, "Hello LVGL"); lv_obj_set_style_text_color(label, lv_color_white(), LV_PART_MAIN); lv_obj_set_style_text_font(label, &lv_font_montserrat_10, LV_PART_MAIN); lv_obj_align( label, LV_ALIGN_TOP_MID, 0, 0 ); //Button lv_obj_t * btn1 = lv_btn_create(root); lv_obj_set_size(btn1, LV_SIZE_CONTENT, LV_SIZE_CONTENT); lv_obj_align(btn1, LV_ALIGN_BOTTOM_MID, 0, 0); lv_obj_t* label1 = lv_label_create(btn1); lv_label_set_text(label1, "Btn"); lv_obj_set_style_text_color(label1, lv_color_black(), LV_PART_MAIN); lv_obj_set_style_text_font(label1, &lv_font_montserrat_10, LV_PART_MAIN); lv_obj_center(label1); //Animation lv_obj_t * obj = lv_obj_create(root); lv_obj_set_style_bg_color(obj, lv_color_black(), LV_PART_MAIN); lv_obj_set_style_radius(obj, LV_RADIUS_CIRCLE, LV_PART_MAIN); lv_obj_align(obj, LV_ALIGN_LEFT_MID, 5, -5); lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, obj); lv_anim_set_values(&a, 5, 20); lv_anim_set_time(&a, 1000); lv_anim_set_playback_delay(&a, 100); lv_anim_set_playback_time(&a, 300); lv_anim_set_repeat_delay(&a, 500); lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); lv_anim_set_path_cb(&a, lv_anim_path_ease_in_out); lv_anim_set_exec_cb(&a, anim_size_cb); lv_anim_start(&a); lv_anim_set_exec_cb(&a, anim_x_cb); lv_anim_set_values(&a, 5, 120); lv_anim_start(&a); lv_scr_load(root); } void setup() { Serial.begin(115200); delay(2000); Serial.println(); //OLED初始化 oled_init(); //GUI初始化 gui_init(); gui_test(); } void loop() { lv_timer_handler(); delay(2); lv_tick_inc(2); }视频:
---
转载请注明本文标题和链接:《oled12864使用lvgl》
发表评论