原子哥是用FSMC驱动LCD的,有一点我一直搞不懂,就是为什么在LCD->LCD_REG写就是命令,而在LCE->LCD_RAM写就是数据,我查找了很多资料才发现原因:
首先TFTLCD和OLED一样是有一个显示ram区的,只是比后者的大很。而FSMC是通过驱动SRAM的方法来驱动LCD的,这两者有什么不同呢。
首先SRAM是有地址线的,在使用过程中FSMC_A[0:25]会用到,但LCD只是仿SRAM的。它是没有地址线的,举个例子:
对于1M的SRAM,内部寻址需要20跟地址线,2^20=1M,当你写内部一个地址时,数据就从数据线传入,读的时候就从数据线传出。
而LCD实际上是通过数据线传送地址和数据的,和OLED是类似的。
在看硬件设置是我们看到,LCD仅仅有一根接了地址线A0,例程用这根线接RS的,现在不论你写任何地址,都会从数据线发送数据到LCD。但这个数据可能是命令,也可能是真正的数据。这是由RS来控制的,即A10控制的。若A10为0,则输入的是命令,若A10为1,则输入的是数据。我们是用FSMC输入地址来控制输入命令还是数据的,而输入的真正地址,是利用输入的命令决定的。
下面我们介绍0x6c00 0000和0x07fe怎么来的:
0x6c00 0000是FSMC bank1 块4的地址起点,0x7ef由如下方法得到:
如果我们要输入命令,我们得保证A10为0.这样我们的地址线用二进制表示可以为
**** **** **** **0* **** ****
而输入数据时地址线的输入用二进制表示:
**** **** **** **1* **** ****
我们可以看到实际上我们可以使用很多地址来代表输入的是命令还是数据,例程利用0x07ef和0x800的原因很简单:
0x07fe=0000 0111 1111 1110b; 0x0800=0000 0100 0000 0000b;
因为我们输入的数据与命令都是16位的,而0x0800-0x7fe=2bitey=16bit,这样我们在0x07ef写入一个数据后,由于地址自增,我们写入的下个数据就在0x800这个地址,正实现了数据与命令的转换。
上面控制数据命令切换的并不是第10位,而是第11位,这是因为LCD的数据传输是16位的,在16位模式下,HADDR[25:1]与FSMC[24:0]是一一对应的。
同样我们可以利用bank1中任意一块和任意一根地址线操作RS,
例如我们用bank1的块1来控制LCD,A14来操作RS:
Bank1 的块1的起始地址为0x6000 0000,因此我们写数据时要输入的地址为
0x6000 0000+2^14*2;
写命令时要输入的地址为:
0x6000 0000+2^14*2-2;
这样我们也可以看出为什么HADDR[25:1]与FSMC[24:0]是一一对应的,而不像8位时HADDR[25:0]与FSMC[25:0]是一一对应的.假使我们用A0控制RS,写命令时的地址为0x0000,(只表示偏移地址),写入一个16位数据后再写数据是地址为0x0010,如果FSMC_A0与HADDR的0位相对应,输入的还是命令,而与HADDR的1位对应时,输入的就是数据的;如果输入一个8位数据,再次输入时的地址为0x001,此时FSMC_A0与HADDR的0位对应就不会出错。这样做会出现一个问题。我们再回到原子哥的例程中去,如果我们写一个命令时写的地址就是0x07fe,实际上FSMC的地址线输出的就是0x0000 07fe,此时我们要是设置FSMS的地址线对应的I/O设置为推挽复用输出(FSMC模式),就大大降低了IO口的使用lv,不过我们可以来观察FSMC的时序(利用定时器的输入,捕获功能这里不做介绍)。
利用FSMC可以大大简化LCD的控制,但是仅用I/O也可以来控制LCD,就好像学习51单片机时用I/O来模拟IIC协议一样。大家可以试着编写一下,这样就可以在单片机上驱动LCD了。
这样我们们知道LCD驱动还是很简单的,首先我们得看懂LCD的时序图并能够编出读写命令与数据的函数来,接下来的事就是初始化LCD和写入命令与数据了。我有一点疑问的是初始化输入的命令是在那个驱动芯片数据手册里,但对我这种至今四级未过的人来说读那个就如天书,麻烦大虾告诉我那个手册主要看哪部分,或者说是我们买LCD的时候厂商就会把初始化的命令一起给我们,这样我们就不需要看那个驱动了呢。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>