范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

手头上无LCD却又急着开发UI?LCD模拟器了解一下

  LCD模拟器
  在我们嵌入式开发中,有时候有些调试环境、流程比较复杂/繁杂。比如有些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(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 < 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=LCD_HEIGHT)return;        //超区域了             if((y-y0)==size)             {                 y=y0;                 x++;                 if(x>=LCD_WIDTH)return; //超区域了                 break;             }         }         }                      }    //显示字符串 //x,y:起点坐标 //width,height:区域大小   //size:字体大小 //*p:字符串起始地址           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_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; }
  以上就是本次的分享。如果文章对你有帮助,麻烦三连支持一下~ 代码下载
  VirtLCD SDK包及本文的VirtSTM32工程demo我已经打包好了放在后台,大家可以私信回复关键词: VirtLCD  ,我看到的话会发给大家。
  猜你喜欢:
  HarmonyOS + linkboy + 小熊派,能擦出怎样的火花?
  分享几款优秀的绘图工具
  1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。私信回复1024,即可免费获取!

华为路由器AX3Pro悄然换芯高通凌霄方案混合出货9月1日消息,今天新款华为AX3Pro无线路由器开卖,售价399元。现在支付40元订金可抵60元,因此实际到手价为379元。该版本的描述当中,去掉了关于凌霄四核等说法。客服表示,新这3款新品成为2021苹果平替新宠,可以省下一大笔一年一度的苹果秋季发布会又要到了。每年的苹果秋季发布会都有一大波新品,格外让人期待。但期待归期待,价格可都不太美好。所以每次发布会前后,都有很多粉丝私信我有没有苹果新品平替推荐呀!ampampquot充电5分钟,续航200kmampampquot,广汽埃安的噱头还是黑科技?科技a?inline0文二哥头新能源汽车发展至今,始终有一个问题伴在它左右,那就是续航焦虑,即使新能源汽车的续航已经从最初的200km发展到现在平均的500km,但续航焦虑始终存在腾讯回应超前点播争议将调整超前点播解锁规则,改为选集解锁9月1日,针对因剧集扫黑风暴超前点播引起的争议,腾讯视频发布声明回应,未来将尽快调整解锁规则支持选集解锁,提升用户体验。随即,曾经对超前点播模式提出过意见的上海市消保委通过微信公众人工智能的技术经济特性及活化效应来源经济日报人工智能(AI),是指研究开发用于模拟延伸和扩展人的智能的理论方法技术及应用系统的一门技术科学。作为新一代信息技术的代表之一,人工智能广泛应用了计算机数学物理学生物学逻折叠新生造就不凡三星GalaxyZFold3Flip35G中国发布2021年9月1日,三星电子举行Galaxy新品中国发布会,推出了三星GalaxyZFold35G与三星GalaxyZFlip35G两款折叠屏智能手机,同时带来了新一代三星GalaiPhone13重磅改动曝光,用户看完大骂苹果公司,这次真买不起了据外媒爆料,苹果将于9月中旬正式举办秋季新品发布会,这次和去年一样会在一周之内举办两场发布会,为广大用户带来包括iPhone13系列新Airpods3MacbookPro以及App山东水手海上漂泊一年回国打开比特币账户直接手撕船员证书比特币,2008年一个叫中本聪的家伙提出的,2009年正式诞生,它是一种点对点的电子交易系统。与其他货币不同,比特币不依靠货币机构发行,而是依据特定算法,通过大量计算产出。从最初的全新MINICOOPERSE纯电动车发布,外观可爱,续航成硬伤?对于女性车主来说,一辆外观设计可爱的车是最好的选择,很多女性车主对于外观小巧,造型好看的车都没有抵抗力,比如大家熟识的MINICOOPER,而MINICOOPER这款车就是靠着颜值坚果R2你喜欢这种外观吗优点追求美感的硬件ID设计,目前可选的不多。离不开系统,即便可见未来不会有大功能迭代更新,但私以为没有其他在用户界面和交互系统效率功能等方面可媲美的AndroidUI。TNT在一些小米火力全开,骁龙888256GB直降700元,米粉幸福来得太突然小米在今年是真的火力全开,高端旗舰小米11Pro也才发布没两月,就直接降了700元,这个操作怕也有雷军了。其实这也是小米为了在618这个即将到来的活动感恩用户,毕竟没有用户的支持,
光环无限限量版AMD拉登RX6900XT看起来像大师首席微软推出了一款特殊的光环无限主题AMDRadeonRX6900XT显卡,设计看起来像大师酋长的标志性绿色盔甲。由于开发问题和游戏在2020年首次推出时收到的负面反馈,Halo无限游数码可穿戴产品销量大比拼谁位居前三位?可穿戴产品是目前世界上少有的稳步增长的产品。由于目前手机行业增长停滞了,可穿戴产品成为各大手机厂商的重点投入的市场。那目前哪些品牌可以位居世界可穿戴产品的前列呢?第一名苹果。由于苹东南亚多国在线发放补贴提振经济背后有来自中国的安全技术来源中国经济网综合过去两年,东南亚各国纷纷联手本地电子钱包发放政府津贴企业工资消费券,以拉动消费,促进经济复苏。数以亿计的东南亚用户只要在手机上动动手指,就能远程完成在线身份验证,thinkpad哪个系列最好?谢谢您邀请。有关thinkpad型号2017年丅系列主要更新了下边几款,变化最大的有两个机型第一是T570,15寸窄边框第二是T470,相对于之前会更薄更轻一些,其他型号T470s2021年物联网示范项目公示福建省11个项目入围,位居全国第二近日,工信部公示了2021年物联网示范项目,共179个项目入选。我省有11个项目入围,入围数仅次于北京,排名全国第二。据悉,本次项目征集聚焦物联网新型基础设施建设的关键环节和重点问半导体设备禁售再升级!狙击本土芯片扩产大潮?电子发烧友网报道(文梁浩斌)制裁消息一波未平一波又起,在上周传出美国将对中国安防设备龙头海康威视扩大制裁后,近日,又有媒体爆料称,美国商务部正考虑扩大对中国芯片制造商的制裁。据称,Redis的优胜劣汰Redis是一个开源的高性能键值的内存数据库,具有优秀的性能,可以用在缓存数据及高速读写,可以用作信息中间件使用,支持数据持久化到磁盘中,可作为分布式锁。Redis容量是不是越大越惠普电脑预装Office不能激活,无人处理在京东平台购买了惠普笔记本电脑,系统激活以后,预装的office不能激活。惠普电脑客服中心推脱说这是微软的软件,让自己联系微软自行激活。在京东惠普电脑介绍页面显示随机带了offic要不要买电动汽车?自从我19年买了纯电动车开到现在跑了三万多公里,到现在才花两百多元充电费(没装充电桩,公共充电桩充电,自己家装充电桩会更便宜),平常在单位充电两天一次,停好车就要给车充电,一充就是稀土永磁已调整到底部稀土永磁近些年的最大推动变量来自新能源车的销量,随着新能源车渗透率逐步提高,海外油价位于高位,以及国内复产复工,海外新能源车的景气度上行,氧化镨钕的价格也开始上行,带动小周期内稀土Java阻塞队列BlockingQueue1。什么是阻塞队列?阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程