1. 创建第一个LVGL模拟器项目

创建第一个LVGL模拟器项目 学习卡片

任务说明

本案例目标是在PC上搭建LVGL模拟器环境,运行一个显示“Hello LVGL”的简单界面。你将通过SDL2驱动在PC窗口上渲染LVGL界面,从而熟悉LVGL的基本工程结构:初始化、创建控件、设置内容与运行事件循环。

工程结构


lvgl_simulator/
├── main.c
├── lv_conf.h
├── Makefile
└── lvgl/          # LVGL源码(v8.3.x)
    ├── lvgl.h
    ├── src/
    └── ...

实现代码

创建 main.c,内容如下:


#include "lvgl/lvgl.h"
#include "lvgl/examples/porting/lv_port_disp_template.h"
#include "lvgl/examples/porting/lv_port_indev_template.h"
#include <SDL2/SDL.h>
#include <stdio.h>
#include <stdbool.h>

#define HOR_RES 800
#define VER_RES 480

static void hal_init(void) {
    lv_init();
    
    // 显示驱动初始化(使用SDL2模拟器)
    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.hor_res = HOR_RES;
    disp_drv.ver_res = VER_RES;
    disp_drv.flush_cb = disp_flush;
    lv_disp_drv_register(&disp_drv);
    
    // 鼠标/触摸输入初始化
    lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = mouse_read;
    lv_indev_drv_register(&indev_drv);
}

static void create_ui(void) {
    lv_obj_t *label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Hello LVGL");
    lv_obj_center(label);
}

int main(void) {
    hal_init();
    create_ui();
    
    while (1) {
        lv_timer_handler();
        SDL_Delay(5);
    }
    return 0;
}

创建 lv_conf.h(LVGL配置文件),关键设置如下:


#define LV_COLOR_DEPTH 32
#define LV_MEM_CUSTOM 0
#define LV_TICK_CUSTOM 0
#define LV_USE_LOG 1

创建 Makefile:


CC = gcc
CFLAGS = -O2 -Wall -I.
LDFLAGS = -lSDL2 -lm
LVGL_DIR = lvgl
SRCS = main.c \
       $(LVGL_DIR)/src/lv_core/lv_disp.c \
       $(LVGL_DIR)/src/lv_core/lv_indev.c \
       $(LVGL_DIR)/src/lv_core/lv_obj.c \
       $(LVGL_DIR)/src/lv_core/lv_refr.c \
       $(LVGL_DIR)/src/lv_core/lv_group.c \
       $(LVGL_DIR)/src/lv_core/lv_style.c \
       $(LVGL_DIR)/src/lv_draw/*.c \
       $(LVGL_DIR)/src/lv_font/*.c \
       $(LVGL_DIR)/src/lv_hal/*.c \
       $(LVGL_DIR)/src/lv_misc/*.c \
       $(LVGL_DIR)/src/lv_themes/*.c \
       $(LVGL_DIR)/src/lv_widgets/*.c

OBJS = $(SRCS:.c=.o)

all: simulator

simulator: $(OBJS)
	$(CC) -o $@ $^ $(LDFLAGS)

%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<

clean:
	rm -f simulator $(OBJS)

编译与运行

  1. 安装依赖:sudo apt install libsdl2-dev(Ubuntu/Debian)或 brew install sdl2(macOS)
  2. 下载LVGL v8.3源码到 lvgl/ 目录
  3. 在工程根目录执行 make
  4. 运行 ./simulator

验证方法

程序启动后,应出现一个800×480的SDL窗口,窗口中央显示黑色背景上的白色文字“Hello LVGL”。窗口可正常关闭,终端无报错输出。若文字居中显示且窗口响应关闭操作,则判定案例通过。

Hello LVGL LVGL Simulator Window (800x480) Close

关键说明

本案例使用LVGL v8.3的SDL模拟器移植层,disp_flush 和 mouse_read 函数在 lv_port_disp_template.c 与 lv_port_indev_template.c 中实现,需将这两个文件复制到工程目录并启用SDL支持。上述代码展示了LVGL应用的最小骨架:lv_init() 初始化核心库,注册显示与输入驱动,创建控件后通过 lv_timer_handler() 周期驱动LVGL运行。实际编译时需根据LVGL源码路径调整Makefile中的文件列表。