大家好,我是张巧龙,在嵌入式开发中,有时候有些调试环境、流程比较复杂/繁杂。比如有些bug需要跑很长的一段流程才可以复现,这时候如果按照正常的流程来调试,单单是复现问题估计都需要花不少时间。
这时候应该要多思考需要怎么去模拟一个相同的环境,可以更方便地进行调试,一个好的仿真环境可以大大地提高工作效率。比如数据的模拟、流程的模拟、通信收发的模拟等方面,或是用一些网上现成的模拟器。
本次就来给大家分享一个实用的LCD模拟器:VirtLCD。这个模拟器在我们的工作中有用到,觉得挺实用,分享给大家。
这个模拟器的代码是开源的,大家感兴趣的话可以自己去下载来研究。
地址:
❝https://gitee.com/kerndev/VirtualLCD
❞ 下面进行实践演示先看一个图:
使用VirtLCD时,我们同样需要一个demo(VirtSTM32)工程编写我们的界面设计代码,调试好之后可以很快地移到STM32工程上。
我们在使用STM32做LCD显示时,常常会封装一些基础的绘制函数,如画点、画线等函数。同样的,使用VirtSTM32与VirtLCD做调试时,也要封装类似函数,作者也给我们提供了一些参考,如:
//画点
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 >
int main(void)
{
LCD_Init();
printf("hello virtlcd, i am ZhengN");
LCD_DrawHLine(10, 10, 350, WHITE);
LCD_ShowString(10, 30, LCD_WIDTH, LCD_HEIGHT, 12, "hello virtlcd, i am ZhengN");
LCD_ShowString(10, 50, LCD_WIDTH, LCD_HEIGHT, 16, "hello virtlcd, i am ZhengN");
LCD_ShowString(10, 70, LCD_WIDTH, LCD_HEIGHT, 24, "hello virtlcd, i am ZhengN");
LCD_DrawHLine(10, 110, 350, WHITE);
while(1);
return 0;
}
运行结果:

这就是模拟STM32裸机显示字符串到VirtLCD中,调试好之后我们可以很快地移到真正的STM32工程中。
这里只是进行简单的演示,当然,感兴趣的话,还可以移植LVGL、emwin等GUI进去。
附VirtSTM32主要代码:
#include "virtlcd.h"
#include "font.h"
#include
#pragma comment(lib, "virtlcd.lib")
#define LCD_FILENAME "virtlcd.exe"
#define LCD_WIDTH 480
#define LCD_HEIGHT 320
#define LCD_BPP 32
#define WHITE 0xFFFFFFFF
#define BLACK 0x00000000
#define FRONT_COLOR WHITE
#define BACK_COLOR BLACK
//定义像素类型
typedef unsigned long PIXEL;
//帧缓存指针
static PIXEL* m_pFrameBuffer;
//计算在X,Y坐标的帧缓存指针
#define GET_OFFSET(x, y) (( LCD_WIDTH * ( LCD_HEIGHT - (y) - 1) ) + (x) )
#define GET_FRAMEBUFFER(x, y) ( m_pFrameBuffer + GET_OFFSET(x, y))
//响应鼠标事件
static void on_mouse_input(int event, int x, int y)
{
}
//响应键盘事件
static void on_keybd_input(int event, int key)
{
}
//初始化LCD
int LCD_Init(void)
{
int ret;
ret = VirtLCD_Init(LCD_FILENAME, LCD_WIDTH, LCD_HEIGHT, LCD_BPP);
if (!ret)
{
return 0;
}
m_pFrameBuffer = VirtLCD_GetFrameBuffer();
VirtLCD_SetMouseProc(on_mouse_input);
VirtLCD_SetKeybdProc(on_keybd_input);
return 1;
}
//画点
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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册


微信扫码登录