欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    单片机驱动LCD的编程思路.docx

    • 资源ID:1550935       资源大小:110.19KB        全文页数:24页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    单片机驱动LCD的编程思路.docx

    单片机驱动1.CD的方法有很多,网络上也有很多配套的例程.但是N上例程千千万,谁是你的4no.今天给大家分享个以面向对象的方式用单片机驱动1.CD的思跖.1.CD种类概述在讨论怎么写1.CD第动之前,我们先大概1'艇-下战入式常川1.CD.概述-蛀跟驱动架何设计有关的概念,在此不对原理和细节整深入讨论,会有专门文章介绍,或者参考网络文档.11cdTFT1.CD,也就是我们常说的彩屏通常像素较高,例如常见的2.8寸,320X240像素,4.0寸的.像素800X400.这些屏通常使用JiI1.,也就是8080或6800接11(STM32的FSMC接口);或者是RGB接口,STM32F429等是片支持。其他例如手机上使用的有MIP1.接口。总之,接口种类很多.也有一些支持SPI接口的,除非是比较小的屏幕,否则不建议使用SP1.接口,速度慢.刷屏闪屏玩STM32常用的TFTIcd屏幕驱动IC通常有:I1.I9341/IU932S等。tft1.ed:IPS:COG1.ed很多人可能不知道CoG1.CD是什么,我觉得能现在开发板梢售方向有关系,大家都出大屏,玩酷炫界面,对于更深的技术,例如软件架构设计,都不涉及.使用维片机的产丛.COG1.CD其实占比非常大。COG是ChipOnG1.ass的缩写,就是用动芯片内接绑定在玻璃上.透明的.实物像下图:这种ICD通常.像素不高,常用的有128X64.128X32,般只支持黑白显示,也有灰度屏.接1.J通常是SPI.I2C.也有号称支挣8位并。的.不过基本不会用.3根IO能解决的问施,没必要用8根吧?,常用的驱动IJSTR7565.O1.EDIcd买过开发板的应该基本用过。新技术,大家都感觉商档,在手环等产品常用。O1.ED目前屏较小,大一点的都很货。在控制上跟COG1.CD类似,区别是两者的显示方式不样。从我们程序角度来百,最大的差别就是.01.ED1.CD,不用控制背光.“,实物如下图:常见的是SP1.跟I2C接口。常见舞动IC:SSD1615.硬件场景接下来的讨论,都基于以下硬件信息:1、有一个TFT屏幕,接在硬件的FSMC接口,什么型号屏幕?不知道.2、有一个CoG1.Cd,接在几根普通IOI上,驱动IC是STR7565,128X32像素.3、有一个COG1.CD,按在硬件SPI3跟几根IOn上,驱动IC是STR7565,128x64像素.4、有一个O1.ED1.C。,接在SPI3上,使用CS2控制片选,驱动IC是SSD1315.COG1.CD驱动ICstr7565COGc>2驱动ICSTR7565O1.EITIJCD匏动ICssd1315TfT1.(1)驱动IC卡知三s1.笆二。一)16)2ds)JZs)wd1.71.;Cp1.-预得知识在进入讨论之前,我们先大概说一下下面几个概念,对于这些概念,如果你想深入了解.谙GOOG1.E.面向对象面向时象,是编程界的一个概念.什么叫面向对©呢?编程彳I两种要素:程序(方法).数据(属性).例如;一个IED,我们M以点亮或者熄灭它,这叫方法.IED什么状态?亮还是灭?这就是属性.我们通常这样编程:u8Iedsta三0;voidIedSet(U8Sta)(这样的纸程有一个问四.假如我们彳no个这样的IED,怎么写?这时我们可以引入面向对象编程,将拇一个IED封装为一个对象可以这样做:定义一个结构体,物1.ED这个对象的属性双方法封笠.这个结构体就是一个对象。但是这个不毡一个我实的存在,而毡一个对象的抽象.7typedefstruct(u8sta;void(*setsta)(u8sta);1.edObj;/声明一个IED对象,名称叫做IED1.,井旦实现它的方法drv_1.ed1._setsta/voiddrv_!ed1._setsta(u8Sta)1.edObj1.ED1三(.sta=0,.setsta=drv_1.ed1._setsta,;/,声明一个IED对象,名称叫做IED2,并且实现它的方法drved2_SetSta/voiddrv_1.ed2_setsta(u8Sta)1.edObj1.ED2-.sta=0,.setsta=drv_1.ed2_setsta,);/操作1.ED的函数,参数指定哪个Ied/void1.edset(1.edObj,1.ed,u8sta)1.ed->setsta(sta);)是的,在C潘古中,实现面向对您的手段就是结构体的使用.上面的代码,对于API来说,就很友好了.操作所有IED,使用同一个接口,只需告诉接口哪个IED大家想想,前面说的1.CD硬件场景.4个1.CD,如果不面向对象J显示汉字的接口是不是要实现4个J?每个屏幕一个?驱动与设备分离如果要深入了解羯动与设备分离,请看UNUX疆动的书新.什么是设备?我认为的设备就是性,就是f参数,就是f驱动程序要用到的数据和硬件接口信息J.那么驱动就是控制这阻数据和接口的代码过程J°通常来说,如果1.CD的驱动IC相同,就用相同的飘动.有g不同的IC也可以用相祠的,例如SSD1315跟STR7565.除了初始化,其他都可以用相网的驱动.例如一个COG1.ed:驱动IC是STR7565128'64像素用SPI3背光用PFS,命令线用PF4,复位脚用PF3上面所有的信息综合,就是一个设备.驶动就是STR7S65的胭动代码.为什么要驱动原设备分离,因为要解决下面向SS:有一个新产M,收根谀备.系统有两个1.CD,都是O1.ED,驱动IC相同,但是一个是128x64.另一个是128x32像素,一个叫粒主显示,收银员用:一个叫顾显,顾客看金额。这个何趣,两个设着用同一套程序控制才是最好的解决办法,阴动与设得分离的手段:在驱动程序接口函数的参数中增加设备参数,费动用到的所有资源从设备参数传入.驱动如何跟设备那定呢?通过设备的驱动IC型号.模块化我认为模块化就是将一段程序封装,提供稳定的按11给不同的必动使用。不模块化就是,在不同的疆动中都实现这段程序.例如字原处理.在显示汉字的时候,我们要找点阵,在打印机打卬汉字的时候,我们也要找点阵,你觉得程序要怎么写?把点阵处理检成一个模块.就是模块化.非模块化的典型特征就是一根缓小到底,没有任何层次感.1.CD到底是什么前面我们说了面向对象,现在要对1.CD进行抽象,得出一个对象,就需要知道ICD到底地什么.问自己下面几个问时:1.CD能做什么?要1.CDfti什么?谁想要1.CD做什么?刚刚接触嵌入式的朋友可能不是很了轿,可能会想不通.我们模拟一下1.CD的功能操作数匏流.APP也要在1.a)上显示一个汉字.1、首先,需要一个H示汉字的接口APP调用这个接口就可以显示汉字假设接口叫做1.cd_disp1.ay_hz,2、汉字从哪来?从点阵字阵来,所以在Ic1.dispIayJz函数内就要调用11qIttfindJont的函数获取点阵.3,扶取点阵后要将点阵显示到1.eD上,那么我们调用一个I1.1.9341.diS的接II.将点阵刷新到驱动IC型号为IU9341的1.CD匕4.IU9341_diS怎么将点阵显示上去?调用一个8080_WRrrE的接口好的,这个就是大概过程,我们从这个过程去抽象1.CD功能接II。汉字跟1.CD对象有关吗?无关.在ICD眼里,无论汉字还是图片,描是一个个点.加么前面问邈的答案就是:1.CD可以一个点一个点显示内衣.要1.CD显示汉字或图片-就是显示一堆点APP想要1.CD显示图片或文字.结论就是:所有1.CD对象的功能就是显示点.那么廓动只要提供显示点的接口就可以了,显示一个点,显示一片点。抽象接口如下:/*1.CD舞动定义VWPedefstruct(u1.6id;s32(n1.t)(Dev1.cd4Icd);s32(draW-POint)(DeV1.Cd"1.ed,u1.6x,u1.6y,u1.6co1.or);s32(4co1.or-fi1.1.)(Oev1.cdcd,u1.6sx,u1.6ex,u!6sy,u1.6ey,u1.6co1.or);s32(*fi1.1.)(Dev1.cd"1.ed,u1.6s×,u1.6e×,u1.6sy,u1.6ey,u1.6"co1.or);$32(4onoff)(Dev1.cdcd,u8sta);s32(,prepare-disp1.a)(Dev1.cde1.cd,u1.6sx,u1.6ex,u1.6sy,u1.6ey);void*set.d1.r)(Dev1.cdTed,u8scan.dir);void(back1.ight)(Dev1.cd,1.cd,8sta);1.1.C1.drv;上面的接口,也就是对应的驱动,包含了一个亮动id号,id,驱动型号初始化国点将一片区域的点显示某种颜色将一片区域的点显示某些颜色显示开关准备刷新区域(主要彩屏直接DMA刷屏使用)设置扫描方向背光控制显示字符,划践等功能,不隅于ICD驱动,应该归类到GU1.层。1.CDM动框架我们设计了如下的驱动框架:设计思路;1、中间显示型动IC班动程序提供统一接口,按口形式如前面说的CC1.drV结构体。2.各显示IC出动根据设备参数.调用不同的接口期动。例如TFT就用8080%动,其他的都用SP1.嬖动.SPI缝动只有一份,用IOn控制的我们也做成模拟SPI.3、1.CD驱动层做1.CD管理例如完成TFT1.CD的识别.并且带所有1.CD接1.1.封装为一套接口.4、简易GU1.层封装了一些显示函数,例如划纹、字符显示。5.字体点阵模块提供点阵获取与处理接口。出于实际没加么更杂,在例程中我们料GUI跟1.CD转动层放到一起,TFT1.CD的两个耶动也放到一个文件,但是逻辑是分开的.O1.ED除初始化,其他接口跟CoG1.CD基本一样,因此这两个卵动也放在一个文件。代码分析代码分三层:1、GU1.和IXD驱动层devJcdxdev_1.cd.h2、显示驱动IC层dev,str7565.c&dev,str7565.hdev.1.1.I9341.c&devJ1.I9341.h3、接11层mcu-spi.c&mcu_spi.hstm324xg_eva1._fsmc_sram.c&$tm324xg_eva1._f$mc_$ram.hGUI和1.CD层这层主要有3个功能:1、设备管理首先定义了一堆1.CD参数结构体,结构体包含2.像素.并口把这些结构体组合到一个IiSt数组内。/*各种ICD的规格金数/_1.cd_pra1.CDJI1.9341=(.Id=0x9341,.width=240,/1.CD宽度.height=320,/1.CD高度);各种1.CD列表*/_1.cd_pra1.cdPra1.ist5=(&1.CD_II1.9341.&1.CD_II1.9325,&1.CD_R61408,&1.CD_Cog1.2864,&ICD_O1.edI2864,);然后定义了所有然动IiSt数现,数现内容就是阴动,在对应的弊动文件内实现/所有胭动列表驱动列表*7_1.cd_drv1.cdDrv1.ist1.1.=&Tft1.cd1.1.I9341Drv,STft1.cd1.1.I9325Drvz&Cog1.cdST756SDrv,&O1.ed1.cd$SD1615rv,定义了设备树,即是定义了系统有多少个ICD,接在哪个接口,什么驱动IC如梁是一个完整系统,可以做成一个类似UNUX的设符树,/设需树定义/WdefineDEV_1.CD_C3系统存在3个ICD设备1.cdObj1.cd0bjUst0EV_1.CD_C=("0edcd*,1.CD_BUS_VSPI,0X1315),cogicd-,1.CD_BUS_SPI,0X7565),"tft1.cd",1.CD_BU$_8080,NU1.1.,;2、接口封装JvoiddevC1.SetdIr(DeVICd*obj,u8d1.r,u8scan.dir)s32devjcdJnit(void)Dev1.cddevjcd,oen(charFame)s32dev_1.cd_c1.ose(Dev1.cdtdev)$32dev-1.cd,drawpoint(Dev1.cd*1.cd,16×,u1.6½u1.6or)s32dev_1.cd_prepare_disp1.ay(Dev1.cd"1.ed,u1.6s×fu1.6exru1.6sy,u1.6ey)s32dev-1.cd-disp1.a-onoff(Dev1.cdcd,u8Sta)s32dev_1.cd_fi1.1.(Dev1.cd*1.cd,u1.6sxzu1.6ex,u1.6sy,16e½u1.6*co1.or)s32devCd_8IOjnMDeV1.cd4Icd,u1.6sx,16e×,16sy,u1.6ey,16co1.or)s32dev_1.cd_back1.ight(Dev1.cd"1.ed,u8sta)大部分接口都是时胆动IC接口的二次封装。有区别的是初始化和打开接口。初始化,就是根据前面定义的设备树,寻找对应驱动,找到对应设备参数.并完成设备初始化.打开函数,根据传入的设需名称,杳找设得,找到后返回设得句柄,后续的操作全部需要这个设备句柄.3、简易GUI层目前最重要就是显示字符函数.s32dev_1.cd_put_string(Dev1.cdcd,FontTypefont,intxzint*charsrunsignedco1.id×)其他划找画圆的函数目前只是测试,后续会完善.驱动IC层驱动IC层分两部分:1.、封笠1.CD接口ICD有使用8080总践的,有使用SPI总镂的,有使用VSP1.总线的.这些总线的函数由单独文件实现,但是.除了这些通信信号外,ICD还会有发位信号,命令数据线信号,背光伯号等.我们通过函数封装,将这些估号跟通侑接门一起封装为1.CD迪信总线,也就是busiedBUS_8080在devJ1.I9341.c文件中封装BUS_1.CD1和BUSJcd2在dev_str7565.c中封装.(2驱动实现实现cd_drv驱动结构体.每个驱动都实现一个,某些驱动可以共用函数._1.cd_drvCog1.cdST7565Drv=M=0X7565,.int=drv_ST7565_1.nit,.draw-point三drv_ST7565_drawpoint,.CO1.orJiII=drv_$T7565_co1.or_fi1.1.,.fi1.1.»drv_ST756S_fi1.1.,.onoff=drv_ST7565_d1.$p1.ay_onoff,.prepare-disp1.ay=drv_ST7565_prepare_disp1.ay,.set-dir=drv_ST7565_scan_diG.back1.ight三drv_ST7565_1.cd_b1.:接11层8080层比较简单,用的是官方接口.SPI接口提供下面探作函数,可以操作SP1.也可以操作VSPI.externs32mcu_spi_init(void);extern$32mcu_SP1.OPen(SP1.DEVdev,SP1.MooEmode,u1.6pre);externs32mcu_spi_dose(SPI_DEVdev);extern832mcu_SP1.tranSfer(SP1.DEVdev,u8*snd,u8,rsv,s321.en);externs32mcu_spi_cs(SPI_DEVdewu8sta);至于SP1.为什么这样写,会有一个单独文件说明.总体流程前面说的几个模块时如何联系在一起的呢?请看下面结构体:/初始化的时快会根掘i殳备数定义.井且兀配飘动跟卷数,并初始化变型。打开的时候只是获取了一个指针/struct-strDev1.cd(s32gd;句柄,控制是否可以打开1.cdObjdev;/1.CD参数,固定,不可变,/ICd_Prapra;/ICD驱动7_1.cd_drv*drv;驱动需要的变JRu8dir;横屏还是竖屏控制:O,竖屏:3横屏.u8SCandir;扫描方向u1.6width;/1.CD宽度u1.6height;/1.CD高度Void*pri私力数据.照臼屏跟O1.ED屏在初始化的时候会开辟显存;何一个设备都会有一个这样的结构体,这个结构体在初始化1.CD时初始化.成员dev指向设备树,从这个成员可以知道设符名称,挂在哪个1.CD总线,设备IDtypedefstructchar*name;/设备.名字1.cdBusTypebus;挂在那条1.CD总线上u1.6id;1.cd0bj;成员pra指向1.CD参数.可以知道1.CD的规格.Wpedefstruct(u1.6d;u1.6width;1.CD宽度竖屏u1.6height;/1.CD高度竖屏_1.cd_pra;成员drv指向阴动,所有操作通过drv实现。typedefstructu1.6id;s32(init)(Dev1.cdcd);s32(draW-POint)(DeV1.Cdcd,u1.6x,u1.6y,u1.6co1.or);$32Cco1.ojf1.IIMDevicdcd,u1.6s×,u1.6ex,u1.6sy,u1.6ey,u1.6co1.or);s32(*fi1.1.)(Dev1.cd"1.ed,u1.6s×,u1.6e×,u1.6sy,u1.6e½u1.6*co1.or);s32(,prepare-disp1.a)(Dev1.cde1.cd,u1.6sx,u1.6ex,u1.6sy,u1.6ey);s32(*onoff)(Dev1.cd*1.cd,u8sta);void(set-d1.r)(Dev1.cd1.cd,u8SCaQdir);void(*,back1.ight)()ev1.cd*1.cd,u8sta);_1.cd_drv;成员dir、scandir,width、height玷驱动要使用的通用变质.因为每个ICDsi有一个结构体,一套瞅动程序就能控制多个设瞽而互不干扰,成员Pri是一个私彳f指针,某些驱动可能儒要有些比较特殊的变量,就全部用这个指针记录,通常这个指针指向一个结构体,结构体由飘动定义,并且在设符初始化时申请变量空间.目前主要用于COG1.CD跟O1.ED1.CD显示缓存.整个1.CD期动,就通过这个结构体加合在一起。1、初始化,根据设备树,找到卵动跟参数,然后初始化上面说的结构体.2.要使用1.CDH,调用dev_1.cd_open函数.打开成功就返回一个上面的结构体指针。3、显示字符,接口找到点阵后,通过上面结构体的drv,调用对应的驱动程序.4、飘动程序根据这个结构体,决定操作哪个1.CD总我,并且使用这个结构体的变量。用法和好处好处1请看测试程序voiddev_1.cd_te$t(void)OeV1.Cd*1.cdCog;Dev1.cd,1.cd01.ed;Oevtcd1.cdTft;/打开三个设备71.cdCog=devjcd-ope11("cog1.cd");if(1.cdCg=NU1.1.)uart-printf("opencog1.ederrrn");1.cdOIed=dev_1.cd_open("o1.ed1.cd");if(1.cdO1.ed=NU1.1.)uart-printf("openo1.ed1.ederrrn");1.cdTft=devjcd-open("tft1.cd'');if(1.cdTft=NU1.1.)uart-pri11tf("opentft1.ederrrn");/打开背光,dev_1.cd_back1.ight(1.cdCog,1);dev_1.cd_back1.ight(1.cd01ed,1);dev_1.cd_back1.ight(1.cdTft,1);dev_1.cd_put_string(1.cdO1.ed,FONT_SONGTI_1212,10,1.,ABC-abc.",B1.ACK);devCC1.PUjStringaCdo1.ed,FONT_SIYUAN_1616,1,13,"这是o1.ed1.ed",B1.ACK);dev_1.cd_put_$tring(1.cdO!ed,FONT_SONGTI_1212,10,30,"",B1.ACK);dev_1.cd_put_string(1.cdO1.ed,FONT_SIYUAN_1616,1,47,“屋脊雀工作空,B1.ACK);dev_1.cd_put_string(1.cdCog,FONT_SONGTI_1212,10,1,pABC-abc.",B1.ACK);devCdJXIJString(1.CdCo&FONT_SIYUAN_1616,1,13,“这是cog1.cd"zB1.ACK);dev_1.cd_put_string(1.cdCog,FONT_SONGTI_1212,10,30,"",B1.ACK);devC(1.PUt_String(1.Cdco&FONT_SIYUAN_1616,1,47.“屋杵IE工作室",B1.ACK);devCC1.PUt_String(1.CdTft,FONT_SoNGT1.I212,20,30,"ABCabc.",RED>dev_1.cd_put_string(1.cdTft,FONT_SIYUAN_1616,20,60,"这是tft1.ed",RED);dev_1.cd_put_$tring(1.cdTft,FONT_SONGTI_1212,20,100,"",RED);dev_1.cd_put_string(1.cdTft,FONT_SIYUAN_1616,20,150,"屋Tf多工作室",RED);whi1.e(1.);使用一个函数devjcd.ope,可以打开3个1.CD,获取1.CD设备,然后留用dev_ICd_PU1.String就可以在不同的1.CD上显示其他所有的gui操作接口都只有一个.这样的设计对于APP层来说,就很友好.显示效果:好处2现在的设法树是这样定义的1.cdObj1.cdObjUstDEV_1.CD_C=“oIedICd”,1.CD.8US-VSPI,0X1315J,"cog1.cd*,1.CD_BUS_SPI,0X7565,"tft1.cd",1.CD_BUS_8080,NU1.1.),;某天,O1.edICd要接到SP1.E只需要将设在树数组里面的多数改一下,就可以了,当然在一个接口上不旎接两个设备.1.cdObj1.cdObjUst(OEV_1.CD_C="0ed1.cd",1.CD_BUS_SPI,0X1315),tft1.cd",1.CD_BUS_8080,NU1.1.,;字库得时不做细说,例程的字库放在SDR中,各位移植的时候根据需要修改,具体参考font*

    注意事项

    本文(单片机驱动LCD的编程思路.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开