# sdl_3C_lcd **Repository Path**: ZJMcode/sdl_3-c_lcd ## Basic Information - **Project Name**: sdl_3C_lcd - **Description**: 该项目是基于SDL在codeblocks 环境下 模拟彩色LCD显示屏(lyc文件夹下三个文件),让你可以在不需要硬件的情况下也能编写显示程序。当前移植了LVGL9.2,可以直接在这个平台上运行LVGL的相关应用显示程序,不用每次都下载到单片机上调试。 - **Primary Language**: C - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-03 - **Last Updated**: 2026-04-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SDL_LCD - LVGL 9.2 PC模拟器 本项目是基于 SDL2 的 LCD 模拟器,**现已升级为 LVGL 9.2 全功能 PC 模拟器**,方便嵌入式开发者在 PC 端开发调试 LVGL GUI,再移植到单片机。 感谢 LVGL 团队开源 LVGL。 --- ## 环境搭建 - 开发环境:CodeBlocks 20.03 + MinGW-w64 - 依赖:SDL2 开发库已包含在工程 `SDL2/` 目录下 - 下载即编译可用,无需额外配置 环境搭建参考原教程:[CodeBlocks下载安装与SDL下载使用配置教程](https://blog.csdn.net/Foxproll/article/details/112249355) --- ## 目录结构 ``` SDL_3CLCD/ ├── bin/ # 可执行文件输出 ├── obj/ # 编译中间文件 ├── lyc/ # 基础LCD模拟层(SDL封装) │ ├── LCD_def.h # LCD参数定义 │ ├── LCD_function.h │ └── LCD_function.c ├── HMI/ # 按键事件处理 │ ├── inc/Key.h │ └── src/Key.c ├── lvgl/ # LVGL 9.2 源码 ├── lvgl_port/ # LVGL 到 SDL 的移植适配层 │ ├── lvgl_port.h │ └── lvgl_port.c ├── SDL2/ # SDL2 开发库(头文件 + 二进制 + 链接库) ├── main.c # 主程序入口 ├── lv_conf.h # LVGL 配置文件 ├── lvgl_c_files.txt# LVGL 编译文件列表 └── SDL_LCD.cbp # Code::Blocks 项目文件 ``` --- ## 当前配置 本工程当前适配 **LVGL 9.2**,默认配置: ```c // lyc/LCD_def.h #define LCD_Point_W 800 // 模拟LCD宽度 #define LCD_Point_H 400 // 模拟LCD高度 #define LCD_SCALE 2 // 窗口放大倍数,实际窗口大小 1600×800 ``` 所有官方 LVGL demo 均已添加,在 `main.c` 中只需取消注释对应 `#define` 即可编译运行: | Demo | 开启方式 | 配置项 `lv_conf.h` | |-----------------------|-----------------------------|-----------------------------| | Widgets 组件演示 | `RUN_LVGL_DEMO_WIDGETS` | `LV_USE_DEMO_WIDGETS 1` | | Benchmark 性能测试 | `RUN_LVGL_DEMO_BENCHMARK` | `LV_USE_DEMO_BENCHMARK 1` | | Music 音乐播放器 | `RUN_LVGL_DEMO_MUSIC` | `LV_USE_DEMO_MUSIC 1` | | Stress 压力测试 | `RUN_LVGL_DEMO_STRESS` | `LV_USE_DEMO_STRESS 1` | | Render 绘制验证 | `RUN_LVGL_DEMO_RENDER` | `LV_USE_DEMO_RENDER 1` | | Scroll 滚动测试 | `RUN_LVGL_DEMO_SCROLL` | `LV_USE_DEMO_SCROLL 1` | | Transform 变换测试 | `RUN_LVGL_DEMO_TRANSFORM` | `LV_USE_DEMO_TRANSFORM 1` | | Vector Graphic 矢量图 | `RUN_LVGL_DEMO_VECTOR_GRAPHIC` | `LV_USE_DEMO_VECTOR_GRAPHIC 1` | | Keypad Encoder 编码器 | `RUN_LVGL_DEMO_KEYPAD_ENCODER` | `LV_USE_DEMO_KEYPAD_AND_ENCODER 1` | | Multilang 多语言演示 | `RUN_LVGL_DEMO_MULTILANG` | `LV_USE_DEMO_MULTILANG 1`,需要开启 `LV_USE_IMGFONT 1` | | Flex Layout 弹性布局 | `RUN_LVGL_DEMO_FLEX_LAYOUT`| `LV_USE_DEMO_FLEX_LAYOUT 1` | --- ## 修复记录 ### 残影问题修复 - 原问题:点击按钮等组件动态变化时,留下残影,只有滚动/切换页面才消失 - 根因:`lvgl_port.c` 中**像素偏移计算错误**,错误使用屏幕绝对坐标代替脏矩形内相对偏移,导致脏区域没有正确更新,旧像素残留 - 修复:将 `x + ...` 改为 `(x - area->x1) + ...`,正确取出 LVGL 渲染缓冲区颜色 ### 滴答递增优化 - 原问题:两次循环间隔不到1ms时 `diff=0`,滴答不递增,LVGL动画卡住 - 修复:保证每次循环至少递增1个滴答,动画流畅 ## 移植说明 1. **PC开发调试**:直接在本工程开发LVGL GUI,调试没问题再移植到单片机 2. **单片机移植**: - 替换 `lvgl_port/` 下的显示刷新、输入读取、滴答获取函数对应到你的硬件 - 按键处理参考 `HMI/Key.c` 实现,把按键事件传递给上层 - 显存管理沿用LVGL自带机制,只需要适配底层驱动 --- ## 编译说明 - 一次只打开一个 `RUN_LVGL_DEMO_XXX`,避免多个demo同时运行冲突 - 添加新demo步骤: 1. 在 `lv_conf.h` 打开对应 `LV_USE_DEMO_XXX 1` 2. 在 `main.c` 取消注释 `#define RUN_LVGL_DEMO_XXX` 3. 如果demo有资源文件,确认 `.c` 资源文件已经添加到 `SDL_LCD.cbp` 和 `lvgl_c_files.txt` 4. Clean → Rebuild 即可