0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

以SPI OLED驱动为例,LCD驱动框架详解

RTThread物联网操作系统 来源:RTThread物联网操作系统 作者:RTThread物联网操作 2020-11-26 14:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

今天看到大佬肖遥兄分享的一篇文章:【架构篇】嵌入式编程中如何给代码的结构分层提到了高内聚,低耦合,软件分层等等的概念。之前又有小伙伴在后台留言说让我分享一篇这样的文章,所以今天它来了!

废话不多说,理论讲太多没啥感觉,这些条条框框本质就是基于面对对象的设计模式相关的一些理论,设计模式就是前人实践多了发现一些规律然后总结出来的那么一套好用的框架,所以咱们直接出干货,硬肝!以小熊派上的SPI OLED驱动为例,将原来开发包里的LCD驱动做一些简单的改造,然后我们根据需求设计如下的驱动模型框架,分为模型、驱动、设备三个部分,我们先不考虑太细节的东西,也不会把这个东西一开始就做得特别复杂,这样不利于理解,于是我们构建如下的框架思维导图:

1、LCD驱动框架数据结构

框架提供一些什么能力呢?我是这么来做的,非常简单:

这里提供了将驱动框架与驱动进行对接的能力,&lcd_driver拿到的是定义在驱动文件里的一个已经赋值了的结构体lcd_driver,这样,当我在别的地方定义一个LCD_Driver_Model的变量,就可以将这个变量与驱动结构体进行对接,这样就可以通过这个变量来操作驱动结构体里的接口了。

2、LCD驱动数据结构

LCD驱动这个数据结构要做的事情就是提供操作LCD驱动能力的接口,这个接口的设计与硬件无关。

前面1小节说过,驱动框架依赖于驱动接口,这样的话我们需要实现驱动接口里的方法,在对应的方法里,我们要去调用LCD设备相关的接口,进而去操作LCD设备,以下是接口对应的实现:

3、LCD设备数据结构

LCD设备所需要做的事情就是将这个数据结构里的功能函数与真实的LCD驱动接口进行对接。比如我们看LCD_Init这个接口的实现,这个就是真实调用LCD的真实硬件操作了:

4、使用方法

intmain(void) { /*USERCODEBEGIN1*/ LCD_Driver_Modellcd_model; LCD_Ascii_Show_Paraascii_para[]= { {80,100,240-80,"RED",BLACK,RED,32}, {80,100,240-80,"GREEN",BLACK,GREEN,32}, {80,100,240-80,"BLUE",BLACK,BLUE,32}, }; LCD_Fill_Parafill_para[]= { {ascii_para[0].x,ascii_para[0].max_width,ascii_para[0].y,ascii_para[0].y+32}, {ascii_para[1].x,ascii_para[1].max_width,ascii_para[1].y,ascii_para[1].y+32}, {ascii_para[2].x,ascii_para[2].max_width,ascii_para[2].y,ascii_para[2].y+32}, }; /*USERCODEEND1*/ /*MCUConfiguration--------------------------------------------------------*/ /*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/ HAL_Init(); /*USERCODEBEGINInit*/ /*USERCODEENDInit*/ /*Configurethesystemclock*/ SystemClock_Config(); /*USERCODEBEGINSysInit*/ /*USERCODEENDSysInit*/ /*Initializeallconfiguredperipherals*/ MX_GPIO_Init(); MX_I2C1_Init(); MX_USART1_UART_Init(); MX_SPI2_Init(); /*USERCODEBEGIN2*/ /*串口初始化后加这个延时,防止后面的printf打印乱码*/ HAL_Delay(200); /*注册驱动模型*/ Register_Driver_Model(&lcd_model); /*调用LCD初始化*/ lcd_model.lcd_driver->lcd_init(); /*调用LCD显示ASCII码字符串*/ lcd_model.lcd_driver->lcd_show_ascii_str(ascii_para[0]); /*USERCODEEND2*/ /*Infiniteloop*/ /*USERCODEBEGINWHILE*/ while(1) { /*USERCODEENDWHILE*/ /*USERCODEBEGIN3*/ /*循环调用LCD显示ASCII码字符串*/ for(inti=0;i< 3 ; i++)         {             lcd_model.lcd_driver->lcd_fill(fill_para[i]); lcd_model.lcd_driver->lcd_show_ascii_str(ascii_para[i]); HAL_Delay(100); } } /*USERCODEEND3*/ }

这样我们就完成了LCD驱动最简单的分层设计了,当然我们的软件框架后续还需要不断的把它做得更健壮,这样以后随便一个LCD,我们都可以设计一套类似这样的固定模板,根据实际的业务需求,定义设计合适的接口,以后但凡换一个项目还是用同一个LCD的话就非常简单了!

5、思考

前面我开源了一个基于TencentOS tiny的气体探测仪项目,你是否能在那个项目上继续进行优化改善呢?

本节代码已同步到码云的代码仓库中,获取方法如下:

1、新建一个文件夹

2、使用git clone远程获取小熊派例程存放的代码仓库

项目开源仓库:

https://gitee.com/morixinguan/bear-pi.git

我还将之前做的一些项目以及练习例程在近期内全部上传完毕,与大家一起分享交流:

责任编辑:PSY

原文标题:自己动手撸个简单的LCD驱动框架吧!

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 框架
    +关注

    关注

    0

    文章

    404

    浏览量

    18317
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1866

    浏览量

    99816
  • OLED驱动
    +关注

    关注

    1

    文章

    13

    浏览量

    10481

原文标题:自己动手撸个简单的LCD驱动框架吧!

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    蜂鸟E203驱动OLED显示

    利用GPIO模拟IIC驱动4pin的OLED显示字符,开发平台芯来官方IDE。 不想写过程,上传整个工程文件,主要代码如下: 下载:led
    发表于 10-31 06:08

    【OK3506-S12Mini试用评测】如何最简单驱动0.96寸oled(不修改内核)

    使用 I2C (通常是4线:VCC, GND, SCL, SDA)或 SPI (通常是7线)接口。请根据屏幕型号确认。 连接OLED与OK3506 :常见的I2C接口OLED
    发表于 10-20 14:50

    化屏光,智耀瞬间-广芯LCD屏闪背光驱动芯片BCT3758

    化屏光,智耀瞬间-广芯LCD屏闪背光驱动芯片BCT3758
    的头像 发表于 10-17 13:33 280次阅读
    化屏<b class='flag-5'>为</b>光,智耀瞬间-广芯<b class='flag-5'>LCD</b>屏闪背光<b class='flag-5'>驱动</b>芯片BCT3758

    使用Nano112驱动LCD时,如果不用于驱动LCD的引脚也配置LCD功能会发生什么情况?

    使用Nano112驱动LCD时,如果不用于驱动LCD的引脚也配置LCD功能,会发生什么情况?
    发表于 08-27 06:30

    EtherCAT与Profinet协议转换在工业自动化中的应用:汇川伺服驱动

    在工业自动化领域,实现不同协议设备间的无缝通信是提升生产效率的关键。EtherCAT主站通过Profinet网关连接汇川伺服驱动器的场景,这一技术组合不仅解决了异构网络协同的难题
    的头像 发表于 07-08 15:49 626次阅读
    EtherCAT与Profinet协议转换在工业自动化中的应用:<b class='flag-5'>以</b>汇川伺服<b class='flag-5'>驱动</b>器<b class='flag-5'>为</b><b class='flag-5'>例</b>

    【BPI-CanMV-K230D-Zero开发板体验】+TFT屏显示驱动及信息显示

    程序的框架内容: import time, image from machine import FPIOA, Pin, SPI, SPI_LCD fpioa = FPIOA
    发表于 07-02 11:03

    使用恩智浦FRDM-MCXN947开发板驱动TFT LCD模组

    模组名字SPI_Module_MSP3323,驱动芯片ILI9341,屏幕尺寸240x320像素,自带GRAM。通过4线
    的头像 发表于 05-16 14:10 2973次阅读
    使用恩智浦FRDM-MCXN947开发板<b class='flag-5'>驱动</b>TFT <b class='flag-5'>LCD</b>模组

    低电流LCD驱动抗噪液晶屏驱动芯片VKL060

    产品品牌:永嘉微电/VINKA 产品型号:VKL060 封装形式:SSOP24 产品年份:新年份 概述: VKL060是一个点阵式存储映射的LCD驱动器,可支持最大60点(15SEGx4COM
    发表于 05-12 17:07

    RK3568开发板驱动开发指南helloworld驱动实验-驱动的基本框架

    Linux 驱动的基本框架主要由模块加载函数,模块卸载函数,模块许可证声明,模块参数,块导出符号,模块作者信息等几部分组成,其中模块参数,模块导出符号,模块作者信息是选的部分,也就是可要可不要。剩余
    发表于 04-02 14:47

    RT-Thread PIN驱动添加

    Pin驱动框架NXPMCXA153PIN设备驱动层单纯的提供接口给应用层用,其中PIN设备
    的头像 发表于 03-28 18:59 623次阅读
    RT-Thread PIN<b class='flag-5'>驱动</b>添加

    北京迅RK3568开发板OpenHarmony系统南向驱动开发内核HDF驱动框架架构

    北京迅RK3568开发板OpenHarmony系统南向驱动开发内核HDF驱动框架架构
    的头像 发表于 03-11 14:13 1558次阅读
    北京迅<b class='flag-5'>为</b>RK3568开发板OpenHarmony系统南向<b class='flag-5'>驱动</b>开发内核HDF<b class='flag-5'>驱动</b><b class='flag-5'>框架</b>架构

    Java的SPI机制详解

    接口规范以及可以发现接口实现的机制,而不需要实现接口。 SPI机制在Java中应用广泛。例如:JDBC中的数据库连接驱动使用SPI机制,只定义了数据库连接接口的规范,而具体实现由各大数据库厂商实现,不同数据库的实现不同,我们常用
    的头像 发表于 03-05 11:35 1111次阅读
    Java的<b class='flag-5'>SPI</b>机制<b class='flag-5'>详解</b>

    对于一款新的BSP如何添加SPI驱动

    ;开发板上集成了两路SPI总线,本次实验将重点介绍RT-Thread系统中SPIBSP驱动的移植过程,NXPMCXA153。移植流程
    的头像 发表于 02-26 19:00 885次阅读
    对于一款新的BSP如何添加<b class='flag-5'>SPI</b><b class='flag-5'>驱动</b>

    RK3568开发板驱动指南Linux中通用SPI设备驱动

    RK3568开发板驱动指南Linux中通用SPI设备驱动
    的头像 发表于 01-23 11:02 3427次阅读
    迅<b class='flag-5'>为</b>RK3568开发板<b class='flag-5'>驱动</b>指南Linux中通用<b class='flag-5'>SPI</b>设备<b class='flag-5'>驱动</b>

    RK3568开发板SPI驱动指南-mcp2515驱动编写:读寄存器函数

    RK3568开发板SPI驱动指南-mcp2515驱动编写:读寄存器函数
    的头像 发表于 01-20 14:43 1502次阅读
    迅<b class='flag-5'>为</b>RK3568开发板<b class='flag-5'>SPI</b><b class='flag-5'>驱动</b>指南-mcp2515<b class='flag-5'>驱动</b>编写:读寄存器函数