《单片机驱动LCD的编程思路.docx》由会员分享,可在线阅读,更多相关《单片机驱动LCD的编程思路.docx(24页珍藏版)》请在优知文库上搜索。
1、单片机驱动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等是片支持
2、。其他例如手机上使用的有MIP1.接口。总之,接口种类很多.也有一些支持SPI接口的,除非是比较小的屏幕,否则不建议使用SP1.接口,速度慢.刷屏闪屏玩STM32常用的TFTIcd屏幕驱动IC通常有:I1.I9341/IU932S等。tft1.ed:IPS:COG1.ed很多人可能不知道CoG1.CD是什么,我觉得能现在开发板梢售方向有关系,大家都出大屏,玩酷炫界面,对于更深的技术,例如软件架构设计,都不涉及.使用维片机的产丛.COG1.CD其实占比非常大。COG是ChipOnG1.ass的缩写,就是用动芯片内接绑定在玻璃上.透明的.实物像下图:这种ICD通常.像素不高,常用的有128X64.
3、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接口,什么
4、型号屏幕?不知道.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驱动ICstr7565COGc2驱动ICSTR7565O1.EITIJCD匏动ICssd1315TfT1.(1)驱动IC卡知三s1.笆二。一)16)2ds)JZs)wd1.71.;Cp1.-预得知识在进入讨论之前,我们先大概说一下下面几个概念,对于这些概念,如果你想深入了解.谙GO
5、OG1.E.面向对象面向时象,是编程界的一个概念.什么叫面向对呢?编程彳I两种要素:程序(方法).数据(属性).例如;一个IED,我们M以点亮或者熄灭它,这叫方法.IED什么状态?亮还是灭?这就是属性.我们通常这样编程:u8Iedsta三0;voidIedSet(U8Sta)(这样的纸程有一个问四.假如我们彳no个这样的IED,怎么写?这时我们可以引入面向对象编程,将拇一个IED封装为一个对象可以这样做:定义一个结构体,物1.ED这个对象的属性双方法封笠.这个结构体就是一个对象。但是这个不毡一个我实的存在,而毡一个对象的抽象.7typedefstruct(u8sta;void(*setsta)
6、(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
7、,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也可以用相祠的,例如S
8、SD1315跟STR7565.除了初始化,其他都可以用相网的驱动.例如一个COG1.ed:驱动IC是STR756512864像素用SPI3背光用PFS,命令线用PF4,复位脚用PF3上面所有的信息综合,就是一个设备.驶动就是STR7S65的胭动代码.为什么要驱动原设备分离,因为要解决下面向SS:有一个新产M,收根谀备.系统有两个1.CD,都是O1.ED,驱动IC相同,但是一个是128x64.另一个是128x32像素,一个叫粒主显示,收银员用:一个叫顾显,顾客看金额。这个何趣,两个设着用同一套程序控制才是最好的解决办法,阴动与设得分离的手段:在驱动程序接口函数的参数中增加设备参数,费动用到的所有
9、资源从设备参数传入.驱动如何跟设备那定呢?通过设备的驱动IC型号.模块化我认为模块化就是将一段程序封装,提供稳定的按11给不同的必动使用。不模块化就是,在不同的疆动中都实现这段程序.例如字原处理.在显示汉字的时候,我们要找点阵,在打印机打卬汉字的时候,我们也要找点阵,你觉得程序要怎么写?把点阵处理检成一个模块.就是模块化.非模块化的典型特征就是一根缓小到底,没有任何层次感.1.CD到底是什么前面我们说了面向对象,现在要对1.CD进行抽象,得出一个对象,就需要知道ICD到底地什么.问自己下面几个问时:1.CD能做什么?要1.CDfti什么?谁想要1.CD做什么?刚刚接触嵌入式的朋友可能不是很了轿
10、,可能会想不通.我们模拟一下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功能接I
11、I。汉字跟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.Cd1.ed,u1.6x,u1.6y,u1.6co1.or);s32(4co1.or-fi1.1.)(Oev1.cd
12、cd,u1.6sx,u1.6ex,u!6sy,u1.6ey,u1.6co1.or);s32(*fi1.1.)(Dev1.cd1.ed,u1.6s,u1.6e,u1.6sy,u1.6ey,u1.6co1.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;上面的接口,也就是对应的驱动,包含
13、了一个亮动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
14、接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.hstm3
15、24xg_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数现,数现内容就是阴动,在对应的弊动文件内实现/所有