写点什么

分享一个 LCD 驱动框架

  • 2023-12-04
    福建
  • 本文字数:1333 字

    阅读完需:约 4 分钟

首先需要说明的是本篇文章不是关于如何点亮一块 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 框架


现在开始进入本篇文章的核心部分,理解下面的内容需要掌握结构体、函数指针等基础知识。为了对该框架有个宏观的认识,我准备了一个框图,如下所示:



下面我将以 ILI9341 240*320 的 TFTLCD 屏幕设备的添加过程,让大家对这个框架有更深的认识。


2.1、添加屏驱 lcd_ili9341.c


本次使用的是 8080 接口和 ILI9341 进行通信,对于具体的驱动代码这里不做赘述,主要说明如何在屏驱中添加一个 LCD 设备,如下图所示:



其中 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,如下图所示:



同时在 lcd_config 中加上 CONFIG_LCD_ILI9341 的宏控,如下所示:



(2)将 lcd_ili9341_dev 添加到 lcd_device.c 中 LCD 设备表中如下图所示:



至此,一个新的 LCD 屏幕设备添加完成,我们可以通过 Lcd_DeviceOpen()函数来打开这个设备并进行操作。下面是 Lcd_DeviceOpen()函数的实现:



(3)使用样例



上述代码中打开了一个名称为“lcd_ili9341”的屏幕设备,并在起点坐标为(20,20)填充了一个宽 200,高 200 的红色矩形,实际现象如下图所示:



3、未完待续。。。


4、总结


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


文章转载自:一蓑烟雨任平生&wf

原文链接:https://www.cnblogs.com/wangfeng-98/p/17873505.html

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
分享一个LCD驱动框架_教程_不在线第一只蜗牛_InfoQ写作社区