分享一個LCD驅動框架

一蓑煙雨任平生&wf發表於2023-12-03

首先需要說明的是本篇文章不是關於如何點亮一塊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上,希望能給大家帶來點收穫,同時熱切希望大家提出自己寶貴的想法,一起交流完善!!!