教你若何快速驱动LCD屏
媒介
LCD屏的驱动关于新手来说,那是一个很大的拦路虎。学完根底外设后,在那里就不晓得怎么下手了。一个完好的LCD驱动包罗的内容长短常多的,最根底的描点,画线,显示字符,后面还有一些UI。在那里,尽量以浅近的体例驱动LCD,一步一步带各人熟悉掌握LCD屏幕的驱动。开源电子网(存眷公家号回复“LCD驱动”免费获取工程文件) 起首,我们先领会一下LCD(Liquid Crystal Display),即液晶显示器,次要由玻璃基板、背光、驱动IC构成,详细如下图。
全彩LCD,是一种全彩显示屏,一个像素点能够是RGB565或者RGB888格局(R红色、G绿色、B蓝色就是常说的三基色),能够显示各类颜色。
至于LCD的显示原理,我们那里就不说了,各人能够通过以下网址停止查看:https://zhuanlan.zhihu.com/p/133306648通过上图能够清晰看到,单片机要实现LCD的显示,次要是与驱动IC停止通信。想要停止通信,必需得晓得是什么接口,那时候得看LCD模块给你引出什么接口,那是裸屏已经决定了。LCD接口能够大致分为三种:MCU接口、RGB接口与MIPI接口,详细区别如下:
差别接口的屏幕撑持的分辩率都纷歧样。我们那里次要讲解的是MCU屏—正点原子2.8寸LCD屏,该屏自带SRAM,驱动简单,大部门单片机都能驱动。其实还有一类是SPI接口的撑持更小分辩率的屏幕。
为什么说裸屏已经决定了屏幕的接口,我们以正点原子的2.8寸屏为例,该屏的驱动IC是ILI9341,是撑持多种通信接口:MCU接口(8/9/16/18位)、3/4线SPI接口、RGB接口(6/16/18位)。ILI9341芯片框架图
通过手册查阅,能够发现IM[3:0]引脚能够选择接口,那就需要连系2.8寸LCD屏原理图停止查看了。
通过上图,我们就很清晰看到,我们的LCD屏幕是撑持利用8位或者16位MCU接口的,不外默认的是16位。所以说,我们的2.8寸LCD屏利用的是16位MCU接口。利用16位MCU接口的显示速度比8位的要快一倍。到那里,我们关于LCD的用什么接口已经很清晰了。
简单来说,LCD屏(MCU接口)驱动的核心:驱动LCD驱动芯片。
那里我们就需要一些根本的LCD驱动常识:
① 8080时序,LCD驱动芯片一般利用8080时序控造,实现数据写入/读取。
② 初始化序列(数组),屏厂供给,用于初始化特定屏幕,差别屏幕厂家不完全不异!
③ 画点函数、读点函数(非必需),基于那两个函数能够实现各类绘图功用!
把上面的梳理一下,就是LCD驱动的一般过程了。只要我们把每一步都领会清晰,就相当于掌握了LCD屏幕的驱动了。
一.掌握8080时序
8080时序,称为并口总线时序,常用于MCU屏驱动IC的拜候,由Inter提出,也叫英特尔总线。
接下来,我们来看看LCD 8080时序信号的申明,详细如下表:简单来说,那里就是我们用来驱动LCD屏幕用到的引脚。在领会引脚的功用后,就能够通过查看手册的时序图,写出读写函数了。
8080写时序起首拉低CS线选中器件,然后按照写入的内容是数据(RS=1)仍是号令(RS=1)停止拉低或拉高RS线,在WR的上升沿,把内容写入LCD驱动IC中, 最初拉高CS线释放片选,而RD是读信号连结高电平即可
8080读时序
起首拉低CS线选中器件,然后按照操做的内容是数据(RS=1)仍是号令(RS=1)停止拉低或拉高RS线,在RD的上升沿,把内容读取到MCU,最初拉高CS线释放片选,而WR是写信号连结高电平即可。
从那里能够晓得,我们8080时序操做可分为写数据、写号令、读数据、读号令(没用到)四种。基于写数据,写号令就能够完成初始化LCD操做,也就是发送初始化序列。
二.掌握芯片的必用指令
LCD驱动芯片用于控造LCD的各类显示功用和效果,整体功用比力复杂,不外我们想要实现根本利用只需要6条指令即可。凡是我们想验证一下我们的读写函数能否准确,看看能否读取到器件的ID。
发送完0xD3指令后,后面跟了4个参数,最初2个参数才是有用的,读出的是0x93和0x41,刚好是我们控造器ILI9341数字部门。那里出格留意:差别芯片读取ID的指令是纷歧样的,不要张冠李戴。
指令0x36是存储拜候控造指令,控造ILI9341存储器的读写标的目的。简单来说,就是在持续写GRAM的时候,能够控造GRAM指针的增长标的目的,从而控造显示体例(读GRAM也是一样)。发送完0x36指令后,紧跟一个参数,参数里的MX/MY/MV配合控造GRAM的扫描标的目的以及BGR控造RGB/BGR挨次。默认LCD扫描标的目的为从左到右,从上到下。
当我们设置好LCD扫描标的目的后,显示内容时就有很大灵敏性,只需要设置一次坐标,然后不断往LCD填充颜色数据即可,大大进步了显示速度。
设置坐标的指令分为X轴和Y轴,官方一点就是设置列地址指令和设置页地址设置指令。起首来看,0x2A即列地址设置指令。0x2A指令带有4个参数,那里就是2个坐标值SC和EC,也就是列地址的起始值和完毕值。其其实设置x坐标时,我们能够只带2个参数即设置SC即可,因为EC没有变革时,我们只设置一次即可,从而进步了速度,不消每次都多发两次数据。
0x2B指令的用法跟0x2A很类似。0x2B指令也是带有4个参数,那里就是2个坐标值SP和EP,也就是页地址的起始值和完毕值。其其实设置y坐标时,我们能够只带2个参数即设置SP即可,因为EP没有变革时,我们只设置一次即可,从而进步了速度,不消每次都多发两次数据。
0x2C指令是写GRAM指令,在发送该指令之后,即可以往LCD的GRAM里面写入颜色数据,而且该指令撑持持续写即地址自增。当发送0x2C指令之后,数据线变成16位,能够起头写入GRAM数据,即把一个个像素点的颜色值写入。在默认扫描标的目的(从左到右,从上到下),设置好起始坐标后(0x2A设置SC,0x2B设置SP),每写入一个颜色值,GRAM地址将会主动自增1(SC++),若是碰着EC,则回到SC,同时SP++,不断到坐标(EC,EP)完毕,期间不需要再次设置坐标,大大进步了写入速度。
当我们只需要实现画点操做时,以上指令进修已经够了,不外在GUI利用的时候,仍是会经常用到读点,也就是0x2E指令。
0x2E指令是读GRAM指令,在发送该指令之后,即可以读取GRAM的数据。当ILI9341收到0x2E指令后,第一次输出的是dummy数据,也就是无效数据,从第二次起头,读取的才是有效的GRAM数据(需要通过0x2A和0x2B设置位置),输出规律如上图:R1G1àB1R2àG2B2àR3G3…。若是我们只需要读取一个点的颜色值,只需要领受到参数3即可;持续读取的话,就按上述规律去领受即可。
在那里,我们已经算是把需要领会的各部门都领会到了。接下来,我们就要把那一块一块零星的常识串一路,也就是我们的LCD最根本驱动步调。
1、确定IO毗连关系(通过LCD模块原理图,开发板液晶接口原理图查看)
2、初始化IO口(初始化毗连LCD的各个IO口)
3、编写8080接口函数(写数据、写号令、读数据)
4、编写LCD初始化函数(完成初始化序列设置装备摆设,设置扫描标的目的,设置EP/EC,点亮背光)
5、编写LCD画点函数(实现LCD肆意位置画点) 后面就是对源码的讲解了,而那一部门我想让各人静下心来,看着附件工程停止理解,如许子对常识的理解才愈加透辟。后面也跟各人分享若何利用FSMC模仿8080时序驱动LCD屏幕。