没有LCD也能开发UI?这个神器让你在电脑上搞定一切!
硬件还没到手,UI界面却要先开发完?别慌!这个开源神器让你在电脑上就能搞定LCD界面开发!
你有没有遇到过这种尴尬的情况:
- 项目进度紧张,UI界面要先开发,但LCD屏幕还没到货
- 每次修改界面都要编译烧录到板子上,效率奇低
- 界面调试需要反复修改参数,浪费大量时间
今天就来分享一个超实用的开源工具——VirtLCD,让你彻底摆脱这些烦恼!
VirtLCD:LCD开发的救星
什么是VirtLCD?
VirtLCD 是一个开源的LCD模拟器,可以在PC上完美模拟真实的LCD显示效果。
核心理念:在PC上开发调试,确认无误后再移植到硬件。
开源地址:
https://gitee.com/kerndev/VirtualLCD
为什么要用模拟器?
在嵌入式开发中,有些调试环境特别复杂:
- Bug需要跑很长流程才能复现
- 硬件调试时间成本高
- 界面参数需要反复调整
一个好的仿真环境能让开发效率提升10倍!
VirtLCD的工作原理
开发流程
VirtSTM32工程 → PC调试 → 移植到真实硬件
核心组件
- VirtLCD.exe:LCD模拟器主程序
- VirtLCD.lib:开发库文件
- VirtSTM32工程:PC端开发工程
实战演示
第一步:基础绘制函数封装
就像在STM32上开发LCD一样,我们需要封装基础的绘制函数:
// 画点函数 - 所有绘制的基础
void LCD_DrawPoint(int x, int y, PIXEL color) {
PIXEL *mem;
mem = GET_FRAMEBUFFER(x, y);
*mem = color;
}
// 画水平线 - 界面框架必备
void LCD_DrawHLine(int x1, int y1, int x2, PIXEL color) {
PIXEL *mem;
mem = GET_FRAMEBUFFER(x1, y1);
for(; x1 < x2; x1++) {
*mem++ = color;
}
}
// 画垂直线 - 分割线神器
void LCD_DrawVLine(int x1, int y1, int y2, PIXEL color) {
PIXEL *mem;
mem = GET_FRAMEBUFFER(x1, y1);
for(; y1 < y2; y1++) {
*mem = color;
mem -= LCD_WIDTH;
}
}
第二步:字符显示功能
// 显示单个字符
void LCD_ShowChar(int x, int y, int num, int size, int mode) {
int temp, t1, t;
int y0 = y;
int csize = (size/8 + ((size%8) ? 1 : 0)) * (size/2);
num = num - ' '; // 获取字符偏移值
for(t = 0; t < csize; t++) {
if(size == 12) temp = ascii_1206[num][t]; // 12号字体
else if(size == 16) temp = ascii_1608[num][t]; // 16号字体
else if(size == 24) temp = ascii_2412[num][t]; // 24号字体
else return;
for(t1 = 0; t1 < 8; t1++) {
if(temp & 0x80) LCD_DrawPoint(x, y, FRONT_COLOR);
else if(mode == 0) LCD_DrawPoint(x, y, BACK_COLOR);
temp <<= 1;
y++;
if(y >= LCD_HEIGHT) return;
if((y - y0) == size) {
y = y0;
x++;
if(x >= LCD_WIDTH) return;
break;
}
}
}
}
// 显示字符串
void LCD_ShowString(int x, int y, int width, int height, int size, char* p) {
int x0 = x;
width += x;
height += y;
while((*p <= '~') && (*p >= ' ')) {
if(x >= width) { x = x0; y += size; }
if(y >= height) break;
LCD_ShowChar(x, y, *p, size, 0);
x += size / 2;
p++;
}
}
第三步:创建测试程序
int main(void) {
// 初始化LCD模拟器
LCD_Init();
printf("VirtLCD演示开始!\n");
// 绘制界面元素
LCD_DrawHLine(10, 10, 350, WHITE);
LCD_ShowString(10, 30, LCD_WIDTH, LCD_HEIGHT, 12, "欢迎使用VirtLCD!");
LCD_ShowString(10, 50, LCD_WIDTH, LCD_HEIGHT, 16, "多种字体大小支持");
LCD_ShowString(10, 70, LCD_WIDTH, LCD_HEIGHT, 24, "界面开发神器");
LCD_DrawHLine(10, 110, 350, WHITE);
while(1); // 保持显示
return 0;
}
运行效果
运行程序后,会弹出一个LCD模拟器窗口,显示我们设计的界面效果:
显示内容:
- 顶部和底部的白色分割线
- 三行不同字体大小的文字
- 完美模拟真实LCD效果
高级应用
支持的GUI框架
VirtLCD不仅支持基础绘制,还可以集成各种GUI框架:
- LVGL:最流行的嵌入式GUI框架
- emWin:SEGGER公司的商业GUI
- TouchGFX:ST官方的图形框架
- 自定义GUI:你自己设计的界面框架
集成示例
// LVGL集成示例
void lv_port_disp_init(void) {
// 初始化VirtLCD
LCD_Init();
// 注册LVGL显示驱动
lv_disp_drv_init(&disp_drv);
disp_drv.flush_cb = disp_flush;
disp_drv.buffer = &disp_buf;
lv_disp_drv_register(&disp_drv);
}
开发效率对比
传统开发流程
编写代码 → 编译 → 烧录 → 观察效果 → 修改代码 → 重复...
单次调试时间:5-10分钟
VirtLCD开发流程
编写代码 → 编译运行 → 实时观察 → 快速修改 → 即时生效
单次调试时间:10-30秒
效率提升:10-30倍!
使用技巧和注意事项
环境配置
- 开发环境:推荐使用Visual Studio
- 依赖库:需要链接VirtLCD.lib
- 字体资源:准备ASCII字库文件
移植要点
- 接口统一:保持与真实硬件相同的API
- 像素格式:注意颜色格式的转换
- 坐标系统:确保坐标映射正确
调试技巧
- 鼠标事件:可以模拟触摸操作
- 键盘事件:模拟按键输入
- 性能监控:观察绘制性能
其他类似工具推荐
PC端模拟器
- LVGL PC Simulator:LVGL官方模拟器
- TouchGFX Simulator:ST官方模拟器
- Qt Designer:跨平台界面设计工具
在线工具
- SquareLine Studio:LVGL在线设计工具
- GUI Guider:NXP的LVGL设计工具
适用场景分析
非常适用
- 界面原型快速验证
- 复杂GUI框架集成测试
- 多人协作的界面开发
- 客户演示和确认
部分适用
- 简单的LED控制界面
- 对实时性要求极高的应用
- 硬件相关的显示特效
不太适用
- 纯硬件调试
- 底层驱动开发
- 性能极限优化
总结
VirtLCD作为一个开源的LCD模拟器,虽然可能不如商业工具那么完善,但对于嵌入式开发者来说绝对是一个宝藏工具!
核心优势:
- 完全免费开源
- 开发效率大幅提升
- 支持多种GUI框架
- 学习成本低
使用建议:
- 先用VirtLCD快速原型设计
- 确认效果后再移植到硬件
- 可以作为客户演示的工具
互动时间
你在嵌入式UI开发中遇到过哪些痛点?
还知道哪些类似的模拟器工具?
你觉得模拟器开发和硬件开发各有什么优缺点?
如果你也被硬件开发的低效率困扰过,一定要试试VirtLCD!
觉得这个工具有用的话,记得点赞收藏,让更多小伙伴看到这个宝藏工具!
关注我,分享更多嵌入式开发效率提升技巧!