LCD有以下控制线:
CS:Chip Select 片选,低电平有效
RS:Register Select 寄存器选择
WR:Write 写信号,低电平有效
RD:Read 读信号,低电平有效
RESET:重启信号,低电平有效
DB0-DB15:数据线web
假如这些线,所有用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差很少):
若是状况以下:
DB0-DB15的IO所有为1(表示数据0xff),也能够为其余任意值,这里以0xff为例。
CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效)
RS为1(表示DB0-15上传递的是要被写到寄存器的值),若是为0,表示传递的是数据。
WR为0,RD为1(表示是写动做),反过来就是读动做。
RESET一直为高,若是RESET为低,会致使芯片重启。
这种状况,会致使一个值0xff被传入芯片,被LCD控制芯片看成写寄存器值去解析。LCD控制芯片收到DB0-15上的值以后,根据其余控制线的状况,它得出结论,这个0xff是用来设置寄存器的。通常状况下,LCD控制芯片会把传入的寄存器值的高8位当作寄存器地址(由于芯片内部确定不止一个寄存器),低8位当作真正的要赋给对应寄存器值。这样,就完成了一个写LCD控制芯片内部寄存器的时序。spa
若是上述状况不变,只将RS置低,那么获得的状况以下:LCD控制芯片会把DB0-15上的数据当作单纯的数据值来处理。那么假如LCD处在画图状态,这个传入的值0xff,就会被显示到对应的点上,0xffff就表示白色,那么对应的点就是白色。在这个数据值传递过来以前,程序确定会经过设置寄存器值,告诉LCD控制芯片要写的点的位置在哪里。设计
若是上述两种状况都不变,分别把WR和RD的信号反过来(WR=1,RD=0),那么写信号就会被变成读信号。读信号下,主控芯片须要去读DB0-15的值,而LCD控制芯片就会去设置DB0-15的值,从而完成读数据的时序。orm
读寄存器的时序麻烦一点。第一步,先要将WR和RD都置低,主控芯片经过DB0-15传入寄存器地址。第二步就和前面读数据同样,将WR置高,RD置低,读出DB0-15的值便可。在这整个的过程当中,RS一直为低。ip
好了,上面就是IO直接控制LCD的方法。假如放到STM32里面,用IO直接控制显得效率很低。STM32有FSMC(其实其余芯片基本都有相似的总线功能),FSMC的好处就是你一旦设置好以后,WR、RD、DB0-DB15这些控制线和数据线,都是FSMC自动控制的。打个比方,当你在程序中写到:
*(volatile unsigned short int *)(0x60000000)=val;
那么FSMC就会自动执行一个写的操做,其对应的主控芯片的WE、RD这些脚,就会呈现出写的时序出来(即WE=0,RD=1),数据val的值也会经过DB0-15自动呈现出来(即FSMC-D0:FSMC-D15=val)。地址0x60000000会被呈如今数据线上(即A0-A25=0,地址线的对应最麻烦,要根据具体状况来,好好看看FSMC手册)。
那么在硬件上面,咱们须要作的,仅仅是MCU和LCD控制芯片的链接关系:
WE-WR,均为低电平有效
RD-RD,均为低电平有效
FSMC-D0-15接LCD DB0-15
链接好以后,读写时序都会被FSMC自动完成。可是还有一个很关键的问题,就是RS没有接,CS没有接。由于在FSMC里面,根本就没有对应RS和CS的脚。怎么办呢?这个时候,有一个好方法,就是用某一根地址线来接RS。好比咱们选择了A16这根地址线来接,那么当咱们要写寄存器的时候,咱们须要RS,也就是A16置高。软件中怎么作呢?也就是将FSMC要写的地址改为0x60020000,以下:
*(volatile unsigned short int *)(0x60020000)=val;
这个时候,A16在执行其余FSMC的同时会被拉高,由于A0-A18要呈现出地址0x60020000。0x60020000里面的Bit17=1,就会致使A16为1。ci
当要读数据时,地址由0x60020000改成了0x60000000,这个时候A16就为0了。it
那么有朋友就会有疑问,第一,为何地址是0x6xxxxxxx而不是0x0xxxxxxx;第二,CS怎么接;第三,为何Bit17对应A16?
先来看前两个问题,你们找到STM32的FSMC手册,在FSMC手册里面,咱们很容易找到,FSMC将0x60000000-0x6fffffff的地址用做NOR/PRAM(共256M地址范围)。而这个存储块,又被分红了四部分,每部分64M地址范围。当对其中某个存储块进行读写时,对应的NEx就会置低。这里,就解决了咱们两个问题,第一,LCD的操做时序,和NOR/PRAM是同样的(为何同样本身找找NOR/PRAM的时序看看),因此咱们选择0x6xxxxxxx这个地址范围(选择这个地址范围,操做这个地址时,FSMC就会呈现出NOR/PRAM的时序)。第二,咱们能够将NEx链接到LCD的CS,只要咱们操做的地址是第一个存储块内便可(即0-0x3ffffff地址范围)。form
第三个问题再来看一看FSMC手册关于存储器字宽的描述,咱们发现,当外部存储器是16位时,硬件管脚A0-A24表示的是地址线A1-A25的值,因此咱们要位移一下,Bit17的值,实际会被反应到A16这根IO来。关于数据宽度及位移的问题,初学的朋友可能会比较疑惑,当你接触了多NOR/PRAM这样的器件后,你会发现,不少芯片的总线,都是这样设计的,为的是节省地址线。效率