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

    浏览量

    18526
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1906

    浏览量

    102446
  • OLED驱动
    +关注

    关注

    1

    文章

    14

    浏览量

    10543

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于瑞萨FPB-RA0E2开发板实现OLED驱动显示

    本文介绍了瑞萨FPB-RA0E2开发板实现OLED驱动显示Renesas图标logo以及ADC电压表框架的项目设计。
    的头像 发表于 05-19 11:18 4691次阅读
    基于瑞萨FPB-RA0E2开发板实现<b class='flag-5'>OLED</b><b class='flag-5'>驱动</b>显示

    RT-Thread 新一代驱动框架 DM 揭秘:从设备树到动态加载,彻底告别硬编码 | 技术集结

    (DeviceTree)、自动匹配与动态probe机制,让驱动开发更加现代化、可扩展。本文qemu-virt64-aarch64平台,带你从零上手DM
    的头像 发表于 04-24 18:05 7199次阅读
    RT-Thread 新一代<b class='flag-5'>驱动</b><b class='flag-5'>框架</b> DM 揭秘:从设备树到动态加载,彻底告别硬编码 | 技术集结

    AD8387:高性能12位12通道LCD驱动芯片详解

    AD8387:高性能12位12通道LCD驱动芯片详解 在电子设计领域,LCD微显示器驱动芯片的性能对显示效果至关重要。今天,我们就来深入探讨
    的头像 发表于 04-14 16:25 147次阅读

    JL杰理AC696N系列芯片SPI接口实战:驱动Flash、LCD与RGB灯

    文章阐述了,杰理AC696N系列芯片功能:驱动Flash、LCD、RGB等。AC696N开发板支持SPI主机模式,可轻松驱动这种类型外设。
    的头像 发表于 04-01 17:49 1347次阅读
    JL杰理AC696N系列芯片<b class='flag-5'>SPI</b>接口实战:<b class='flag-5'>驱动</b>Flash、<b class='flag-5'>LCD</b>与RGB灯

    【RA-Eco-RA2E1-V1.0开发板试用】+ SPI驱动LCD屏显示

    RA-Eco-RA2E1-V1.0开发板是一种近于最小系统的开发板,因此其外设资源十分有限。为了实现LCD屏的显示驱动,这里选取的是一款LCD屏,其显示分辨率128*160像素点。
    发表于 02-04 16:53

    深入解析Rockchip SFC驱动SPI Flash传输流程与问题排查指南

    Controller)驱动spi-rockchip-sfc.c),用于高效管理SPI Flash的读写传输。本文基于Linux内核驱动代码与Rockchip官方开发指南,深入拆解
    的头像 发表于 02-04 07:13 957次阅读
    深入解析Rockchip SFC<b class='flag-5'>驱动</b>:<b class='flag-5'>SPI</b> Flash传输流程与问题排查指南

    RA MCU众测宝典 | SPI驱动TFT屏幕

    “RAMCU众测宝典”SPI专题来啦!这次我们聚焦【RA-Eco-RA4E2】开发板,一步步用SPI驱动1.8寸TFT屏幕。开启宝典前言本次实验使用的是1.8寸TFT屏幕,分辨率128x160,
    的头像 发表于 02-03 17:02 7928次阅读
    RA MCU众测宝典 | <b class='flag-5'>SPI</b><b class='flag-5'>驱动</b>TFT屏幕

    从硬件到UI全流程,高效LCD开发最佳拍档

    、硬件接口简介 Air780Exx系列低功耗模组SPI LCD接口固定为PIN49至PIN53,专为驱动液晶显示屏设计。 下图Air780EPM模组
    的头像 发表于 01-27 17:42 1196次阅读
    从硬件到UI全流程,高效<b class='flag-5'>LCD</b>开发最佳拍档

    使用硬件SPI1轮询模式来实现驱动OLED显示屏

    此篇介绍使用硬件SPI1轮询模式来实现驱动OLED显示屏硬件连接 GND ——GND VCC ——3.3V DO——PA5 DI——PA7 RES ——PB1 DC——PB0 CS——PA4 软件
    发表于 01-27 12:36

    蜂鸟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 915次阅读
    化屏<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 1022次阅读
    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