0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分享一个实用的LCD模拟器:VirtLCD

Linux大陆 来源:嵌入式大杂烩 2023-12-05 11:41 次阅读

LCD模拟

在我们嵌入式开发中,有时候有些调试环境、流程比较复杂/繁杂。比如有些bug需要跑很长的一段流程才可以复现,这时候如果按照正常的流程来调试,单单是复现问题估计都需要话不少时间。

这时候应该要多思考需要怎么去模拟一个相同的环境,可以更方便地进行调试,一个好的仿真环境可以大大地提高工作效率。比如数据的模拟、流程的模拟、通信收发的模拟等方面,或是用一些网上现成的模拟器。

本次就来给大家分享一个实用的LCD模拟器:VirtLCD。这个模拟器在我们的工作中有用到,觉得挺实用,分享给大家。

这个模拟器的代码是开源的,大家感兴趣的话可以自己去下载来研究。

下面进行实践演示。先看一个图:

08f3e52a-9320-11ee-939d-92fbcf53809c.png

使用VirtLCD时,我们同样需要一个demo(VirtSTM32)工程编写我们的界面设计代码,调试好之后可以很快地移到STM32工程上。

我们在使用STM32做LCD显示时,常常会封装一些基础的绘制函数,如画点、画线等函数。同样的,使用VirtSTM32与VirtLCD做调试时,也要封装类似函数,作者也给我们提供了一些参考,如:

//画点
voidLCD_DrawPoint(intx,inty,PIXELcolor)
{
PIXEL*mem;
mem=GET_FRAMEBUFFER(x,y);
*mem=color;
}

//画水平直线
voidLCD_DrawHLine(intx1,inty1,intx2,PIXELcolor)
{
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;
    }
}

下面我们新建一个VirtSTM32工程(VS2019控制台程序)进行验证,然后把这些函数加到我们的VirtSTM32工程里。同时,VirtSTM32需要依赖于VirtLCD.lib,导入即可,这个库可以在VirtLCD SDK包里找到(文末统一发给大家)。

有了这三个基础函数,我们可以就可以做很多的事情了,显示字符串、显示图片等函数都是以画点函数为基础的,这些函数可以在各种开发板的lcd相关例程里找到,拿过来修改一下就可以。接下来我们显示一些字符串到Virtlcd上,如:

intmain(void)
{
LCD_Init();
printf("hellovirtlcd,iamZhengN");
LCD_DrawHLine(10,10,350,WHITE);
LCD_ShowString(10,30,LCD_WIDTH,LCD_HEIGHT,12,"hellovirtlcd,iamZhengN");
LCD_ShowString(10,50,LCD_WIDTH,LCD_HEIGHT,16,"hellovirtlcd,iamZhengN");
LCD_ShowString(10,70,LCD_WIDTH,LCD_HEIGHT,24,"hellovirtlcd,iamZhengN");
LCD_DrawHLine(10,110,350,WHITE);
while(1);
return0;
}

运行结果:

090be80a-9320-11ee-939d-92fbcf53809c.png

这就是模拟STM32裸机显示字符串到VirtLCD中,调试好之后我们可以很快地移到真正的STM32工程中。这里只是进行简单的演示,当然,感兴趣的话,还可以移植LVGL、emwin等GUI进去。

附VirtSTM32主要代码:

#include"virtlcd.h"
#include"font.h"
#include

#pragmacomment(lib,"virtlcd.lib")

#defineLCD_FILENAME"virtlcd.exe"
#defineLCD_WIDTH480
#defineLCD_HEIGHT320
#defineLCD_BPP32

#defineWHITE0xFFFFFFFF
#defineBLACK0x00000000

#defineFRONT_COLORWHITE
#defineBACK_COLORBLACK

//定义像素类型
typedefunsignedlongPIXEL;

//帧缓存指针
staticPIXEL*m_pFrameBuffer;

//计算在X,Y坐标的帧缓存指针
#defineGET_OFFSET(x,y)((LCD_WIDTH*(LCD_HEIGHT-(y)-1))+(x))
#defineGET_FRAMEBUFFER(x,y)(m_pFrameBuffer+GET_OFFSET(x,y))

//响应鼠标事件
staticvoidon_mouse_input(intevent,intx,inty)
{

}

//响应键盘事件
staticvoidon_keybd_input(intevent,intkey)
{

}

//初始化LCD
intLCD_Init(void)
{
intret;
ret=VirtLCD_Init(LCD_FILENAME,LCD_WIDTH,LCD_HEIGHT,LCD_BPP);
if(!ret)
{
return0;
}
m_pFrameBuffer=VirtLCD_GetFrameBuffer();
VirtLCD_SetMouseProc(on_mouse_input);
VirtLCD_SetKeybdProc(on_keybd_input);
return1;
}

//画点
voidLCD_DrawPoint(intx,inty,PIXELcolor)
{
PIXEL*mem;
mem=GET_FRAMEBUFFER(x,y);
*mem=color;
}

//画水平直线
voidLCD_DrawHLine(intx1,inty1,intx2,PIXELcolor)
{
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;
    }
}

//在指定位置显示一个字符
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小12/16/24
//mode:叠加方式(1)还是非叠加方式(0)
voidLCD_ShowChar(intx,inty,intnum,intsize,intmode)
{
inttemp,t1,t;
inty0=y;
intcsize=(size/8+((size%8)?1:0))*(size/2);//得到字体一个字符对应点阵集所占的字节数
num=num-'';//得到偏移后的值(ASCII字库是从空格开始取模,所以-''就是对应字符的字库)
for(t=0;t=LCD_HEIGHT)return;//超区域了
if((y-y0)==size)
{
y=y0;
x++;
if(x>=LCD_WIDTH)return;//超区域了
break;
}
}
}
}

//显示字符串
//x,y:起点坐标
//width,height:区域大小
//size:字体大小
//*p:字符串起始地址
voidLCD_ShowString(intx,inty,intwidth,intheight,intsize,char*p)
{
intx0=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++;
}
}

intmain(void)
{
LCD_Init();
printf("hellovirtlcd,iamZhengN");
LCD_DrawHLine(10,10,350,WHITE);
LCD_ShowString(10,30,LCD_WIDTH,LCD_HEIGHT,12,"hellovirtlcd,iamZhengN");
LCD_ShowString(10,50,LCD_WIDTH,LCD_HEIGHT,16,"hellovirtlcd,iamZhengN");
LCD_ShowString(10,70,LCD_WIDTH,LCD_HEIGHT,24,"hellovirtlcd,iamZhengN");
LCD_DrawHLine(10,110,350,WHITE);
while(1);
return0;
}
;t++)>

以上就是本次的分享。如果文章对你有帮助,麻烦三连支持一下~

代码下载

VirtLCD SDK包及本文的VirtSTM32工程demo我已经打包好了放在后台,大家可以在本公众号回复关键词:VirtLCD ,即可获取。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • lcd
    lcd
    +关注

    关注

    34

    文章

    4310

    浏览量

    165180
  • STM32
    +关注

    关注

    2249

    文章

    10725

    浏览量

    350289
  • 嵌入式开发
    +关注

    关注

    18

    文章

    987

    浏览量

    47150
  • 模拟器
    +关注

    关注

    2

    文章

    839

    浏览量

    42834

原文标题:推荐一个实用的嵌入式LCD模拟器!

文章出处:【微信号:Linux大陆,微信公众号:Linux大陆】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LCD模拟器

    本帖最后由 sky512 于 2012-7-13 11:37 编辑 本模拟器可以模拟点阵LCD的基本显示效果,通过调用相应函数可以灵活地改变点阵数、颜色等属性。可以方便项目开发的前期
    发表于 07-08 20:41

    模拟器速度

    大家好,我直在模拟MPLABX模拟器上的PIC24大约一个月,并且已经取得了很大的进步!(检查下ZIPCAR GITHUB,如果你想看看
    发表于 09-06 16:23

    如何获得COD到模拟器

    我正在开发RTOS来使用CCS C编译为PIC1XF1XXX增强的中程PIC,这是我需要在模拟器上调试的。我需要先眨下LED才能了解
    发表于 09-30 12:19

    单独wince模拟器的程序运行

    在wince模拟器中运行程序
    发表于 03-11 11:19

    模拟器断点被永久禁用

    调试时,当我创建新的断点时,它被创建为禁用和灰色的(参见创建Br)。我可以手动启用断点,但是模拟器没有停止(参见手动启用.PNG)项目的项目属性页显示模拟器完全支持(
    发表于 03-13 09:24

    模拟器:904和模拟器:861错误

    链接设计。我在论坛中看到我们需要使用任务管理或进程查看来终止模拟器可执行文件(_isim_beh.exe)。但是从哪里可以找到任务管理或进程查看
    发表于 04-03 08:47

    飞行模拟器的运动系统

    运动系统 六自由度固定翼飞行模拟体验舱这台模拟器通过六自由度的运动系统,来模拟出飞机的横滚、俯仰、偏航等飞机姿态,从而飞行员可以直观感
    发表于 09-07 17:20

    ESP32 NES模拟器教程

    (模拟器),玩上几把小时候最喜欢玩的游戏,而nes模拟器正是不二之选,通过制作模拟器我们能学习到软硬件各方面的知识,可谓是很多程序员走向编程开发道路上不可缺少的环。来和我
    发表于 01-12 08:20

    手把手教你使用HarmonyOS本地模拟器

    月31日,经过版本的迭代优化,随DevEco Studio 3.0 Beta2版本发布的本地模拟器新增了智能手表和智慧屏的模拟器品类。 本地模拟
    发表于 02-17 16:58

    Cabsims箱体模拟器的资料分享

    的输入。箱体模拟器的工作是模拟吉他放大器扬声箱体的频率响应,这是吉他声音创作的最后也是最重要的元素之(麦克风和听众对声音的感知除外)。作为电子电路,Cabsim 是
    发表于 08-12 06:48

    请问如何生成围绕模拟器的框架?

    我想生成围绕模拟器窗口的图像。我已经在教程(我现在找不到)中看到它完成了,所以我知道它可以完成。我使用的图像似乎总是偏移并且不对齐。我查看了文档,但无所获。在
    发表于 02-02 08:07

    多星模拟器电路系统的设计

    为了适应航天器的发展需求,需要研制小型轻量化的多星模拟器。提出了采用Sony公司的LCX023CMT液晶光阀为核心的多星模拟器构成方案。设计了相应的LCD显示驱动电路和光学系统。所
    发表于 08-02 16:40 0次下载

    分享一个实用的LCD模拟器:VirtLCD

    在我们嵌入式开发中,有时候有些调试环境、流程比较复杂/繁杂。比如有些bug需要跑很长的一段流程才可以复现,这时候如果按照正常的流程来调试,单单是复现问题估计都需要话不少时间。
    的头像 发表于 07-04 14:28 1807次阅读

    用于飞行模拟器的带Arduino的LCD面板

    电子发烧友网站提供《用于飞行模拟器的带Arduino的LCD面板.zip》资料免费下载
    发表于 06-14 10:39 0次下载
    用于飞行<b class='flag-5'>模拟器</b>的带Arduino的<b class='flag-5'>LCD</b>面板

    什么是光伏模拟器?光伏模拟器能做什么?

    什么是光伏模拟器?光伏模拟器能做什么? 光伏模拟器是一种用来模拟太阳能光伏电池的工作原理和性能的软硬件设备。它可以提供光伏电池在不同光照、温度和环境条件下的电流、电压、功率等参数。光伏
    的头像 发表于 11-10 15:57 928次阅读