一个单片机驱动LCD编程思路

💡 原文中文,约11600字,阅读约需28分钟。
📝

内容提要

本文介绍了以面向对象的方式驱动液晶显示屏(LCD)的方法,包括LCD类型、接口类型和常用驱动芯片。讨论了面向对象编程的概念和驱动与设备分离的方法。详细介绍了LCD驱动的框架和代码分析,包括GUI和LCD驱动层、驱动IC层和接口层。最后介绍了LCD驱动的用法和好处。

🔎

延伸解读

面向对象封装在C语言中的实现方式

文章通过LED和LCD的例子,展示了如何用结构体将属性和方法封装成对象。在C语言中,结构体可以包含函数指针,从而模拟面向对象的行为。这种方法使得多个同类设备(如多个LED或LCD)可以通过统一的接口进行操作,只需传入对象指针即可。这提高了代码的复用性和可维护性,尤其适合管理多个外设的嵌入式系统。

驱动与设备分离的设计思想

驱动与设备分离的核心是将硬件相关的参数(如接口类型、引脚、驱动IC型号)与驱动代码分开。文章以收银设备双屏为例,说明同一套驱动可以控制多个不同尺寸但驱动IC相同的LCD。实现方式是在驱动接口函数中增加设备参数,驱动所需资源从设备参数传入。这种设计提高了代码的复用性,便于产品扩展和维护。

LCD驱动框架的分层与统一接口

文章提出的LCD驱动框架分为三层:GUI和LCD驱动层、显示驱动IC层、接口层。GUI层提供字符显示等高级功能,驱动IC层实现具体的画点、填充等操作,接口层封装SPI、8080等总线通信。所有LCD通过统一的_lcd_drv结构体接口进行操作,使得上层应用无需关心底层硬件差异。这种分层设计清晰,便于移植和功能扩展。

设备树在LCD管理中的灵活应用

文章使用设备树数组定义系统中LCD的数量、名称、总线和驱动IC型号。初始化时根据设备树匹配驱动和参数,打开设备时通过名称查找并返回句柄。这种设计使得更改LCD连接方式或增减设备只需修改设备树,无需改动驱动代码。例如,将OLED从VSPI改为SPI接口,仅需调整设备树中的总线类型。这大大提升了系统的灵活性和可配置性。

❓

Q&A

在单片机驱动LCD时,如何用面向对象的方式管理多个LCD设备?

在C语言中,通过结构体封装LCD的属性和方法,将每个LCD抽象为一个对象。例如定义包含驱动接口的结构体,每个LCD设备拥有独立的结构体实例,从而用同一套接口操作多个LCD,避免为每个屏幕重复实现显示函数。

驱动与设备分离在LCD编程中有什么好处?

驱动与设备分离使得相同的驱动IC可以驱动多个不同参数的LCD设备,提高代码复用性。例如两个OLED屏驱动IC相同但分辨率不同,只需在设备参数中传入不同配置,驱动代码无需修改即可控制两个设备。

LCD驱动框架通常分为哪几层?

LCD驱动框架分为三层:GUI和LCD驱动层(负责设备管理、接口封装和简易GUI)、显示驱动IC层(实现具体驱动IC的接口和总线封装)、接口层(提供SPI、8080等底层通信接口)。

如何通过设备树定义LCD参数和驱动?

设备树通过一个结构体数组定义,每个元素包含LCD名称、挂载的总线类型和驱动IC的ID。例如:{ "oledlcd", LCD_BUS_VSPI, 0X1315 }。初始化时根据设备树匹配驱动和参数,完成设备初始化。

使用dev_lcd_open函数可以同时打开多个LCD设备吗?

可以。dev_lcd_open函数根据传入的设备名称查找设备,返回设备句柄。通过多次调用该函数,可以分别打开多个LCD设备,之后使用统一的接口(如dev_lcd_put_string)在不同LCD上显示内容。

如果要将OLED LCD从VSPI接口改接到SPI接口,需要修改哪些地方?

只需修改设备树数组中对应设备的bus成员,例如将{ "oledlcd", LCD_BUS_VSPI, 0X1315 }改为{ "oledlcd", LCD_BUS_SPI, 0X1315 },无需改动驱动代码。

🏷️

标签

➡️

继续阅读