首页 > 其他分享 >分享一个LCD驱动框架

分享一个LCD驱动框架

时间:2023-12-03 17:55:21浏览次数:31  
标签:框架 代码 lcd LCD 屏幕 分享 ili9341 设备

首先需要说明的是本篇文章不是关于如何点亮一块LCD屏的教程,而是介绍一个LCD开发框架,更准确的说是介绍一个LCD的中间件(Middlwware),用来连接UI和不同类型的LCD屏。笔者本人的工作内容中很重要的一部分就是在不同的LCD屏上做UI开发,所以对如何最大程度复用LCD代码以及解耦屏驱有着一定的理解。好了,话不多说进入正文。

1、最初的代码

在写这篇文章的时候笔者翻看了自己在大二时候点的第一块屏幕(TFTLCD,驱动IC为ILI9341)的代码,看着自己几年前写的代码,思绪仿佛又回到了几年的那个夏天…….,咳咳,不好意思有点“触码伤情”了,回到正题,当时写的代码最大的问题就是——LCD的应用和驱动没有分离,耦合在一起。

如果仅从实现功能的角度来说完全ok的,但是从项目开发角度来看还是有不少问题,因为实际项目不可能一直只用一款屏或者MCU,一旦二者之一发生改变就意味着LCD驱动会改变,而LCD应用和驱动又是紧密耦合的,必然会受到影响要做出改变。这是不合理的,LCD应用是针对屏幕这个大类而不是具体的屏幕对象,比如说我要在屏幕显示一串字符“hello world”,对LCD应用层来说是:“我要在这块屏幕(A屏、B屏…)显示hello world,但是具体怎么实现显示,我不关心,我只要结果”。另外一种情况就是如果一个项目要使用两块或者多块屏(虽然实际上这种情况很少见,就我个人目前还没遇到过),那是不是要LCD应用代码复制两份甚至更多,这明显会增加代码体积,而且看着也别扭。所以LCD框架就呼之欲出了。

2、呼之欲出的LCD框架

现在开始进入本篇文章的核心部分,理解下面的内容需要掌握结构体、函数指针等基础知识。为了对该框架有个宏观的认识,我准备了一个框图,如下所示:
image
下面我将以ILI9341 240*320的TFTLCD屏幕设备的添加过程,让大家对这个框架有更深的认识。

2.1、添加屏驱lcd_ili9341.c

本次使用的是8080接口和ILI9341进行通信,对于具体的驱动代码这里不做赘述,主要说明如何在屏驱中添加一个LCD设备,如下图所示:
image
其中lcd_driver是屏驱对象,包含了初始化、填充、开关显示等操作,其LcdDriverType_t类型在lcd_typedef.h中定义。lcd_ili9341_dev就是一个LCD设备,使用时需要被注册到LCD设备表中,该设备类型中包含设备的名称、分辨率、屏驱等信息,LcdDeviceType_t类型也是在lcd_typedef.h中定义。

2.2、添加lcd_ili9341_dev设备。

(1)在lcd_device.h中extern声明lcd_ili9341_dev,如下图所示:
image
同时在lcd_config中加上CONFIG_LCD_ILI9341的宏控,如下所示:
image
(2)将lcd_ili9341_dev添加到lcd_device.c中LCD设备表中如下图所示:
image
至此,一个新的LCD屏幕设备添加完成,我们可以通过Lcd_DeviceOpen()函数来打开这个设备并进行操作。下面是Lcd_DeviceOpen()函数的实现:
image
(3)使用样例
image
上述代码中打开了一个名称为“lcd_ili9341”的屏幕设备,并在起点坐标为(20,20)填充了一个宽200,高200的红色矩形,实际现象如下图所示:
image

3、未完待续。。。

4、总结

我始终认为对代码最好的解释就是代码本身,理解代码很多时候都是只可意会不可言传,所以后续我会将LCD框架这部分代码上传到gitte上,希望能给大家带来点收获,同时热切希望大家提出自己宝贵的想法,一起交流完善!!!

标签:框架,代码,lcd,LCD,屏幕,分享,ili9341,设备
From: https://www.cnblogs.com/wangfeng-98/p/17873505.html

相关文章

  • Facebook营销的社群运营技巧与经验分享
    Facebook营销的社群运营技巧与经验分享 导语:在当今数字化的时代,Facebook已成为了一种广泛使用的社交媒体平台。对于企业而言,利用Facebook进行营销和社群运营是一种重要的策略。本文将分享一些关于Facebook营销的社群运营技巧和经验,希望能够帮助您提升品牌影响力,吸引更多目标受......
  • VUE四个生命阶段和8个钩子函数的执行及其实现效果------VUE框架
    VUE四个生命阶段和8个钩子函数的执行及其实现效果<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>D......
  • 云原生技术分享 (二)
    三、Kubernetes  Kubernetes源于希腊语,意为“舵手”。k8s缩写是因为k和s之间有八个字符的原因。它是google在2015开源的容器调度编排的平台。它是建立在Google大规模运行生产工作负载(Borg系统)十几年经验的基础上,结合了社区中最优秀的想法和实践,已经成为了目前容器编排的事......
  • 搭建Wpf框架(18) ——DataGrid实现右冻结
    19.搭建Wpf框架(18)——DataGrid实现右冻结先上效果图: 其中,Field3和Field4为右冻结列。将一下大致思路,1.在DataGrid右边再放一个DataGrid,用来显示右冻结的列,把冻结的列从左边的DataGrid移除。2.然后左边的DataGrid右侧的滚动条隐藏,横向滚动条显示,右边的DataDataGrid右侧......
  • 关于企业级 Web 应用搜索引擎优化(Search Engine Optimization)的一些工作经验分享
    笔者之前的社区文章,分享了自己在日常工作中从事企业级Web应用开发的一些工作体会:企业级Web应用里使用CSS调整应用外观的一些例子谈谈企业级Angular应用的二次开发-基于AngularComponent替换的Extensibility支持案例介绍所谓企业级前端应用,是指为大型企业或组......
  • TiDB 在 WPS丨分享业务双机房建设实践
    WPSOffice是一站式办公服务平台,全球范围内,每天有超过5亿个文件在WPSOffice平台上被创建、编辑、和分享。本文分享了WPS在TiDB版本升级和双机房改造中的实践经验。作者:曹鹏,WPS云平台运维Leader;肖尚武,WPS云平台DBA;庾俊,WPS云文档研发。背景WPS算是国内TiDB较早的......
  • 龙蜥开发者说:天津大学同学分享“走入龙蜥赛道,推开开源大门” | 第 25 期
     「龙蜥开发者说」第25期来了!开发者与开源社区相辅相成,相互成就,这些个人在龙蜥社区的使用心得、实践总结和技术成长经历都是宝贵的,我们希望在这里让更多人看见技术的力量。本期故事,我们邀请了龙蜥社区开发者贾庆林来分享「走入龙蜥赛道,推开开源大门」。欢迎阅读上期故事《那些......
  • 集合框架(三)ArrayList的常见使用
    ArrayList是什么?ArrayList是Java集合中的数组列表,实现了List接口,是用来存储数据的容器之一,底层的数据结构是数组。 ArrayList有什么特点?有序:按照顺序添加元素不唯一:同一元素可以存放多次查找和访问速度较快,增删元素较慢 ArrayList和LinkedList的区别有哪些?数据机构:Arr......
  • java集合框架(二)之LinkedList的常见使用
     常用的方法定义LinkedList对象  新增  删除 获取元素 修改 ......
  • java集合框架(二)LinkedList的常见使用
    LinkedList常用方法定义LinkedList对象LinkedList<String>list=newLinkedList<>(); 插入元素list.push("张三");//在此列表的前面插入元素list.addLast("新增到最后一个元素");//将指定的元素追加到此列表的末尾。list.addFirst("新增到第......