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

手头上无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,即可免费获取!

金秋九月SUV销量前五分析,奇骏逍客竟双双落马金九银十,在中秋节和70周年国庆热点的消费环境刺激下,9月份SUV整体销量获得小幅提升。据乘联会数据消息,我国9月份SUV车型总销量为80。88万辆,环比增长14。5,但累计销量同保时捷卡宴新增SCoup车型,搭载2。9T发动机破百只需5秒近期,保时捷公布了Cayenne系列新增车型CayenneSCoup,新增车型官方指导售价为123。60万元。外观方面,CayenneSCoup与早些发布的CayenneCoup在买菜车雅力士将全方位升级,飞度表示有压力近日,丰田发布了2020款雅力士的渲染图。据悉,全新的丰田雅力士基于TNGAB平台设计打造,使其车身的整体高度降低了40mm,导致座位比较低矮且更接近方向盘,以TNGAB平台为基础BBA之外的好选择,降价超过4万的凯迪拉克XT5谈及豪华品牌的中型SUV,德系三驾马车无疑是第一梯队的,宝马X3奔驰GLCL和奥迪Q5L都是过万的超热门车型。第二梯队中凯迪拉克XT5英菲尼迪QX50林肯MKC紧随其后。这次给大家越强硬越好开,试一台特别的领克03如果说到近期汽车圈里最热门是什么车型?那必定是领克03无疑。凭借着在WTCR宁波站一举夺魁的优异表现,很多人对这款冠军车产生了莫大的兴趣。但要知道一台WTCR赛车与量产车之间存在着新款宝马5系已于近期到店,改动不大2020款宝马5系车型已于前段时间上市,虽然是更新为新款车型,但此次宝马5系仅为中期改款,并未像其小弟三系和大哥七系那样采用全新的设计语言,2020款宝马5系外观依旧与19款保持一远看雷克萨斯,近看丰田,致炫跨界新选择据了解全新YARiSL致炫X于10月21日上市,该车共推出了八个车型,售价区间为7。78万10。38万元。全系配置了一台1。5L自然吸气发动机,传动方面分别为5挡MT变速器和CVT上市两年都没什么优惠,小改款后配置动力升级,推荐购买2。0G试车报告中级车一直都是国内消费者的购车首选,不仅车型多,而且价格也持续下探,现在不少中级车都在20万以内性价比突出。如果要你选一款中级车,20万左右空间充足配置适中还要省油耐用,相自动洗箱机的正确操作事项自动洗箱机多用于一些农业食品加工厂和零部件制造行业清洗一些塑料盒,但洗衣机和人一样,长时间工作后会很累,需要保养。所以全自动洗衣机的操作非常重要。如果你不小心,就会降低效率。那么在商用洗碗机的正确操作常识选择商用洗碗机并正确使用,不仅可以节约用水和洗涤剂,而且可以有效地洗碗,改善就餐环境和整体卫生。正确使用商用洗碗机的常识是什么?如何使餐具清洗更干净?1。餐具使用后应尽快清洗干净。商用洗碗机正确操作的常识选择商用洗碗机并正确使用,不仅可以节约用水和洗涤剂,而且可以有效地洗碗,改善就餐环境和整体卫生。正确使用商用洗碗机的常识是什么?如何使餐具洗得更干净?1。餐具使用后应尽快清洗干净,
荣耀V40轻奢版,不会把天玑800U卖到3000吧?荣耀V40轻奢版正式定档本月23日发布,目前关于该机的信息基本已经曝光,从背面与华为Nova8同款的ID设计看,该机立项时,荣耀还是华为的子品牌,再加上这个轻奢版命名,注定该机不便黑鲨4外观被提前曝光,设计大改,不像游戏手机一直以来游戏手机设计方向都是偏向机甲风,元素众多有棱有角,还得带灯,十分吸引男生,近日正在预热的黑鲨4外观被曝光,其设计一改常态,少了些浮夸,多了些朴素,如果不看细节,它更像旗舰手驯龙高手来了,为压制骁龙888,小米带来全新散热系统骁龙888高负载发热严重如今已经成了一个槽点,面对这个问题,目前手机厂商最常用的方案是降频,压制其性能,作为手机散热做的最积极的小米,将带来全相变散热技术,准备在小米11UltraRedmiK40升级MIUI12。5,体验并不完美K40升级MIUI12。5需要申请开发版内测,目前已经放包,我也是第一时间选择升级,下面聊聊体验感受!首先是MIUI12。5的手势动画升级,配合K40这块120Hz刷新率屏幕,非常三主摄顶配旗舰,小米11Ultra疯狂堆料,细节拉满当年一款手机有好的屏幕好的性能好的拍照高的定价,那么它就会被称为安卓机皇,最具代表的就是三星,如今这些只是旗舰手机门槛,想要成为机皇,拼的就是技术和细节,下面就来看看这次小米机皇做搭载AMD锐龙5600X,微星宙斯盾AegisZ5准系统上手玩早些时候,笔者给大家分享了微星一款Intel平台准系统MAGInfiniteRS,反响还不错,今天继续给大家分享一款微星采用AMD平台搭建的宙斯盾AegisZ5准系统(下文统一简称AMDSAM显存智取技术性能加成,来一波3A平台装机秀话说最近显卡缺货的情况已到达史无前例的地步,楼主历尽波折总算凑齐了一套3A平台的配件,也借这次机会体验一下AMDSmartAccessMemory显存智取技术。首先例牌列上配置单一11代酷睿上市在即,微星MPGZ590暗黑板抢先看Intel11代酷睿桌面处理器还有不到一个月就要上市了,而各大板长的500系列芯片组主板已经先行开卖。而作为500系列的旗舰,Z590主板自然备受关注。英特尔11代酷睿桌面处理器最紧跟升级步伐,Intel十一代酷睿桌面处理器装机秀序话说,Intel500系列芯片组主板早在十一代酷睿桌面处理器开卖之前已经先行上市,苦等将近一个月终于等到CPU开卖,这次入手的十一代酷睿桌面i7处理器首卖库存感觉比上一代充足,不周杰伦同款国潮耳机,1MORE万魔猫眼耳机ColorBuds2体验随着技术成熟以及价格越来越亲民化,真无线耳机在发展若干个年头的今天已经大有取代有线耳机的趋势,无论是传统音频设备厂商还是手机设备厂商都在这一领域投入大量的资源,市场上相关产品已经数诚意满满的入门神盔,SPECIALIZED闪电AlignIIMIPS骑行头盔上手玩作为一名骑行爱好者,笔者平时对骑行安全防护比较重视,对骑行头盔的选择更是一点都不敢马虎。今年九岁的女儿受我的影响也逐渐爱上骑行,因此为她准备一个合适的骑行头盔就成为我必须做的事情。