原创 关于LCD的一点总结

2008-8-14 20:48 5476 11 17 分类: MCU/ 嵌入式

在单片机的开发设计中,人机界面常常需要用到。这里本人总结了一些基于单片机的对单色点阵型液晶的经验。也许对各位同仁有点帮助,如有什么不对之处,还请各位同仁提出,学习快乐!


本人这里是以128*64LCDks0108控制器,6800的时序)为例子来介绍的。


点击看大图


                                                                       1


如上图是128*64LCD的显示区示意图。液晶显示区上的每个点都对应着控制器内部显示缓存区RAM中的一个位。对于读写RAM的最小单位应该是字节(byte),即读写是以字节为单位的。整个显示区是被分为了8PAGE(),每个页中有128列,即128byte。可见1PAGE中有128*8个像素点。对于有的液晶把整个显示区分为了左右俩边。其对应着有要有两个片选CS1,CS2。其原理与上图是一样的。把其当成两个64*64的组合在一起就行。


 下面是个显示区与显示RAM的像素点映射图。


点击看大图


 


 显然要想打亮液晶上的某个像素点,把其对应的显示RAM的值置1即可。其实在液晶上显示的字符就是这么一个个的点组合而成的。


下面要解决的问题是如何利用液晶控制器来进行显示区的收放自如的控制。也就是说编写驱动程序来让任意某点打亮。这就要对控制器中的一些相关的寄存器进行操作。必然这要涉及到时序的问题。本人这里主要讲比较典型的6800时序的LCD,液晶的DATASHEET中一般给出了其相关控制器的时序图。一般我们都是用I/O口来模拟其时序。比较简单这里就不分析其时序了。其读写数据和寄存器的时序驱动代码一般如下:


写命令到寄存器:


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />点击看大图


从寄存器中读数据(注意哦:有些廉价的液晶中数据读不出来):


点击看大图


写数据到寄存器:


 点击看大图


 


看着上面的代码,将其与具体的时序图相对就很容易理解了。


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


一般的LCD模块,都有显示区开、关,设置起始页地址,设置列地址等的寄存器操作。有的比较好的LCD则有更多的更方便的寄存器操作,如正/反向显示设置,全屏点黑等。


下面就以显示一个16*16大小的汉字的函数来讲解一下如何用字模提取工具来做汉字的显示。前面已经提到了,在LCD上显示字符,其实就是把字符在其上用一个个的像素点组合的画出来。当然这样的事情一般是由字模提取软件来实现的。字模提取软件有很多,网上到处有下。


点击看大图


上图就是一个字模提取软件的界面了。把自己想要的字符输入,即可得到其相应的字模数据。字模提取时特别要注意取模是横向还是纵向的,字节是正序还是倒序。前面说过(图1),把要显示的数据写入LCD的数据RAM中是以字节(8个位点)为单位来写的。纵向还是横向是指以纵的8个位点,还是以横的8个位点为单位来记录数据。下面俩副图很好的表示了俩者的区别。这个取模的方式在取模软件中可以设置,根据自己的LCD的显示方式来确定取模的方式即可。我这里的LCD是纵向显示的,所以我的取摸软件是设置为纵向取摸。至于字节正序与倒序,是指这8个位点组成一个字节数据的方向,在字节全些完的情况下这个无关紧要。


f39ec17c-4405-4d26-a410-069c977f3fc1.jpg


4b3bbb72-9836-4477-ba07-1016b9d12f34.jpg


本人用纵向取摸字节倒序的方式提取出16*16大小的“捷”字的数据如下,这是用一个一唯数组来存放的。


/*------------------------------------------------------------------------------


  源文件 / 文字 : 捷


  宽×高(像素): 16×16


------------------------------------------------------------------------------*/


Jie[]={


0x18,0x18,0xFF,0xFF,0x98,0x06,0x56,0x56,0x56,0xFF,0xFF,0x56,0xF6,0xF6,0x46,0x00,


0x03,0x63,0x7F,0x3F,0x41,0x60,0x3D,0x1D,0x31,0x3F,0x7F,0x65,0x65,0x65,0x60,0x00


};


显然0x18就是字模图中从左边起的第一列(8位),这样一列列的从左至右16列的数据就列了出来。接着从0x03开始列出了下一行的16列,这样32字节数据就保存在了数组中。


下面来看把它写入LCD RAM中(也就是让它显示出来)的代码。


void hz_disp16(unsigned char pag,unsigned char col, unsigned char code *hzk)


{


unsigned char j="0",i=0;


for(j=0;j<2;j++)


{


write_com(Page_Add+pag+j);//写命令到寄存器,确定起始页地址


write_com(Col_Add+col); //写命令到寄存器,确定起始列地址


for(i=0;i<16;i++)


 write_data(hzk[16*j+i]); //把数据一个一个字节的写入


}


}


Pag ,col,分别是指要显示的坐标的页地址和列地址。*hzk就是存放字符数据的数组的首地址。代码中用了俩重循环来把数据写入,先把第一行的16个数据连续写入一页接着借用变量J使显示的数据换了一页,跳到了其下一页,这样又把16个数据连续写入,上下俩页组合起来1个“捷”字就显示到了屏幕上了,就如字模提取工具中的一样!对于128*64LCD,若想在第2行第5列开始显示一个“捷”字,在代码中这样调用上面那个函数即可:


hz_disp16(2,5,jie);


  上面这种显示方法其实是一种比较笨的显示发,他不能显示任意大小的字符(长宽必须是8的整数倍),且不能在任意点显示。其实只要解决在任意坐标显示一个点的函数,即可很灵活的用显示点的函数来构成在任意坐标显示任意大小的字符的函数。时间不早了,明天继续。。。。。。。。。。。。。。。。。。。。。。。。。。。。


 


 

文章评论6条评论)

登录后参与讨论

用户1825482 2015-1-6 22:13

可以交流一下吗? 我还有不太懂 我的邮箱137694377@qq.com

用户169648 2009-5-25 09:34

看到你在搞过LCD界面的程序 算法, 能否发给我让我也学习下,谢谢 我的邮箱sw_ge@126.com

用户461316 2008-8-18 08:29

不错

用户1708619 2008-8-16 10:44

好,那我顶一顶你~··

用户161601 2008-8-15 08:37

有人顶才有动力!

用户1453845 2008-8-14 22:19

顶,写的好 希望继续写下去
相关推荐阅读
用户161601 2013-06-06 11:27
AT91LINUX编译试验 SAMA5DX cortex A5
atmel官方网站www.at91.com中对基于DTB的linux内核编译流程如下:   本文档为本人在ubuntu 10.04下实验流程,红色文字为本人添加的记录; by Jevon...
用户161601 2013-04-21 10:54
ubuntu10.04 vm6.5 hgfs 共享实现
以前用的VMWARE6.5+FC12安装好VM TOOL后 就可以在/mnt/hgfs 访问window中的共享文件夹了; 如今把FC12抛弃了,改装了ubuntu10.04但发现hgfs目录...
用户161601 2012-11-29 09:46
芯片制造工艺流程(转)
  芯片制造工艺流程   芯片制作完整过程包括 芯片设计、晶片制作、封装制作、成本测试等几个环节,其中晶片片制作过程尤为...
用户161601 2011-12-13 14:28
摄像头的组成以及红外摄像头
摄像头的工作原理大致为:景物通过镜头(LENS)生成的光学图像投射到图像传感器表面上,然后转为电信号,经过A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再通...
用户161601 2011-11-01 10:50
KEIL MDK生成 bin 文件 for nxp MCU
说明:本文的实践是基于lpc1343; 要想在keil中直接生成bin文件一般需要加用户命令调用fromelf工具: 如下图在Options for Target 中 加上编译后的命令; ...
用户161601 2011-10-09 11:52
基于新唐DMX512帧头的判断
DMX 512协议是Digital Multiplex的缩写,是灯光行业数字化设备的通用信号控制协议,同时也是是一种国际协议;由美国剧场技术协会(United State Institute for...
我要评论
6
11
关闭 站长推荐上一条 /2 下一条