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

    文章

    398

    浏览量

    17412
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1691

    浏览量

    91249
  • OLED驱动
    +关注

    关注

    1

    文章

    13

    浏览量

    10214

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

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

收藏 人收藏

    评论

    相关推荐

    基于FPGA的LCD1602液晶显示模块驱动设计

    本文通过LCD1602液晶显示模块基础,介绍FPGA驱动LCD1602原理,详细介绍硬件原理图设计及FPGA
    的头像 发表于 10-24 14:42 528次阅读
    基于FPGA的<b class='flag-5'>LCD</b>1602液晶显示模块<b class='flag-5'>驱动</b>设计

    利用MSP430的LCD外设驱动大型LCD

    电子发烧友网站提供《利用MSP430的LCD外设驱动大型LCD.pdf》资料免费下载
    发表于 10-22 09:22 0次下载
    利用MSP430的<b class='flag-5'>LCD</b>外设<b class='flag-5'>驱动</b>大型<b class='flag-5'>LCD</b>

    常见液晶驱动控制芯片详解

    常见液晶驱动控制芯片详解 前言 因此各位朋友在选择 LCD液晶模块的时候,在考虑到串行,还是并行的方式时,可根据其驱动控制 IC的型号来判别,当然你还需要看你选择的
    的头像 发表于 10-12 16:35 796次阅读

    物联网系统中TFT_LCD屏主流驱动方案详解

    物联网系统中为什么要使用 TFT-LCD驱动 芯片 在物联网系统中使用TFT-LCD(薄膜晶体管液晶显示器)驱动芯片的原因主要可以归纳以下
    的头像 发表于 09-23 18:06 401次阅读
    物联网系统中TFT_<b class='flag-5'>LCD</b>屏主流<b class='flag-5'>驱动</b>方案<b class='flag-5'>详解</b>

    使用GPIO口作为电源驱动OLED

    使用GPIO口作为电源驱动OLED 以往为了增加OLED驱动显示,都是用杜邦线将OLED连接到开发板必要的VDD,GND,GPIO口上。在
    发表于 06-23 14:20

    请问ESP32-S3如何驱动QSPI接口的LCD?

    目前项目用ESP32-S3来驱动QSPI接口的LCD驱动ICGC9B71(规格书参考附件)。试着在ESP-IDF的范例spi_lcd_t
    发表于 06-07 06:51

    SPI协议详解ADS1118

    一开始先分析了SPI的协议特点,使用ADS1118这个器件作为承载物进行分析,后面用逻辑分析仪从位到字节进行解码,最后使用TI给的demo移植到STM32平台。
    的头像 发表于 05-07 14:58 3555次阅读
    <b class='flag-5'>SPI</b>协议<b class='flag-5'>详解</b>(<b class='flag-5'>以</b>ADS1118<b class='flag-5'>为</b><b class='flag-5'>例</b>)

    浅谈OLED模块驱动芯片(SSD1306

    通常情况下,OLED显示模块的驱动芯片是内置在模块中的,并不需要用户进行单独的烧录操作。
    的头像 发表于 03-01 16:45 7468次阅读
    浅谈<b class='flag-5'>OLED</b>模块<b class='flag-5'>驱动</b>芯片(SSD1306<b class='flag-5'>为</b><b class='flag-5'>例</b>)

    RT-Thread驱动开发指南进阶篇-动手驱动先楫未适配的外设LCD

    经过上一篇的《《RT-Thread设备驱动开发指南》基础篇--先楫bsp的hwtimer设备》阐述,可以大致了解到RT-thread设备驱动
    的头像 发表于 02-25 11:04 2248次阅读
    RT-Thread<b class='flag-5'>驱动</b>开发指南进阶篇-动手<b class='flag-5'>驱动</b>先楫未适配的外设<b class='flag-5'>LCD</b>

    《RT-Thread设备驱动开发指南》基础篇--先楫bsp的hwtimer设备

    :对RT-thread以及设备框架进行介绍,再分别介绍基于IO框架中常用的外设设备,分别是UART、PIN、SPI/QSPI、HWTIMER、PWM、RTC、ADC、DAC
    的头像 发表于 02-24 08:16 1350次阅读
    《RT-Thread设备<b class='flag-5'>驱动</b>开发指南》基础篇--<b class='flag-5'>以</b>先楫bsp的hwtimer设备<b class='flag-5'>为</b><b class='flag-5'>例</b>

    HAL库硬件SPI点亮板载LCD屏幕流程详解

    LCD是挂在硬件SPISPI1上,CS引脚也挂在硬件SPI上,可以直接配置,不用再操心CS引脚的电平转换了,库函数内部自动完成。
    的头像 发表于 01-17 09:08 2378次阅读
    HAL库硬件<b class='flag-5'>SPI</b>点亮板载<b class='flag-5'>LCD</b>屏幕流程<b class='flag-5'>详解</b>

    全志R128使用SPI驱动ST7789V1.47寸LCD

    Supports software flexible control video frame rate 同时,提供了 SPILCD 驱动框架以供 SPI 屏幕使用。 此次适配的SPI
    发表于 01-02 09:45

    stm32驱动0.96OLED

    stm32驱动0.96OLED开机OLED不显示,只有烧录了一个简单的点亮程序再烧录原来的程序才正常显示
    发表于 12-16 11:41

    SF1 RISC-V Core 驱动OLED屏幕

    第1章 SF1 RISC-V Core 驱动OLED屏幕本次测评采用安路的SF1 RISC-V内核实现对SPI OLED屏幕的驱动,实
    发表于 12-10 10:26

    ART-PI使用SPI驱动RC522读卡器

    ARTPI 自带三个硬件 SPI,我们这里 SPI4
    的头像 发表于 11-21 16:35 947次阅读
    ART-PI使用<b class='flag-5'>SPI</b><b class='flag-5'>驱动</b>RC522读卡器