当前位置:首页 > 公众号精选 > 大鱼机器人
[导读]大家好,我是张巧龙,在嵌入式开发中,有时候有些调试环境、流程比较复杂/繁杂。比如有些bug需要跑很长的一段流程才可以复现,这时候如果按照正常的流程来调试,单单是复现问题估计都需要花不少时间。这时候应该要多思考需要怎么去模拟一个相同的环境,可以更方便地进行调试,一个好的仿真环境可以...

大家好,我是张巧龙,在嵌入式开发中,有时候有些调试环境、流程比较复杂/繁杂。比如有些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 < 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上,如:

左右滑动查看全部代码>>>

int main(void)
{
    LCD_Init();
    printf("hello virtlcd, i am ZhengN");
    LCD_DrawHLine(1010350, WHITE);
    LCD_ShowString(1030, LCD_WIDTH, LCD_HEIGHT, 12"hello virtlcd, i am ZhengN");
    LCD_ShowString(1050, LCD_WIDTH, LCD_HEIGHT, 16"hello virtlcd, i am ZhengN");
    LCD_ShowString(1070, LCD_WIDTH, LCD_HEIGHT, 24"hello virtlcd, i am ZhengN");
    LCD_DrawHLine(10110350, 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 < 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)
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-' ';//得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
 for(t=0;t {   
  if(size==12)temp=ascii_1206[num][t];    //调用1206字体
  else if(size==16)temp=ascii_1608[num][t]; //调用1608字体
  else if(size==24)temp=ascii_2412[num][t]; //调用2412字体
  else return;        //没有的字库
  for(t1=0;t1<8;t1 )
  {       
   if(temp
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭