原创 关于LCD的总结(续)

2008-8-17 21:53 5358 9 16 分类: MCU/ 嵌入式

前一篇讲到的那种向LCD写字符的方法是比较死的,由于写数据到LCDRAM的最小单位是字节,所以那种方法写入LCD的字符宽度大小(纵向取模)必须是8的整数倍。那么对于128*64LCD来说最多只能写8行字符。


               324d6b25-b33b-4a69-ac89-6b029c87a90f.jpg


如上图的“T”字其实际占用的大小只有5*5,但由于每一列必须是字节为单位(8位)所以在写入LCD的时候要把每列的数据都补成8位,占用的大小就是5*8了。  其数据用数组表示如下:


T[]={0x01,0x01,0x1F,0x01,0x01};这样在LCD上就必须有3行是空白的,而不能紧跟在T的第5行而写入其他的字符。显然这样是不科学的。


 要解决这个问题也就是要解决在LCD上任意位置写入任意大小字符的问题。本人看了小丑大哥写的关于LCD驱动的资料,感触很深!


从在任意位置画点开始:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


思想是这样的:只要解决了在任意位置画点的问题,其余的不管是字符还是图形,都用画点的函数来完成即可!


                             afb21b90-f70e-47a8-b19b-3c86a7bb09b4.bmp


现在做这样一件事。如上图,在屏幕的第一行第一列已经有了一点,现在想在第2行第一列再打上一点。由于列数据必须是8的整数倍,所以提取的数据必然如下图所示:


                               c92d4b8a-08d1-4cf0-8f5d-ed0c16474a5b.bmp


如果把上图对应的数据直接写入LCD,那第一行第一列原本的那个点将会消失,因为他已经被第2次写的数据所覆盖了。为了达到不影响原有的数据,所以在写入新的之前我们先把数据从LCDRAM中把已有的数据读出来,然后再把要写入的新数据与旧数据相“位或”后


再写入LCD即可。这样就就可以保持原由的数据不变,而又能在任意位置完成打点。下面来看具体代码:


//=====================================================================


void Write_Dot_LCD(unsigned char x,unsigned char y,unsigned char i)


/*x,y分别为显示的横,纵坐标,i1表示把该点显示亮,0是暗*/


{


       unsigned char x_low,x_hight;                                                 //定义列地址的高低位指令


       unsigned char Dot_Mask_Buf=0x01;


       unsigned char y_Page;                                                    //用于存放要画点的位置所在的byte数据位置


       x = x+1;


       x_low = (x&0x0f);                                                         //定位列地址设置的低位指令


       x_hight = ((x>>4)&0x0f)+0x10;                                      //定位列地址设置的高位指令


       switch(y&0x07)   //找出是要点亮一列8位中的哪一点


       {


              case 0: Dot_Mask_Buf = 0x01;break; //第一点


              case 1: Dot_Mask_Buf = 0x02;break; //2


              case 2: Dot_Mask_Buf = 0x04;break;//3


              case 3: Dot_Mask_Buf = 0x08;break;


              case 4: Dot_Mask_Buf = 0x10;break;


              case 5: Dot_Mask_Buf = 0x20;break;


              case 6: Dot_Mask_Buf = 0x40;break;


              case 7: Dot_Mask_Buf = 0x80;break;


       }


       y_Page = (y>>3)+0xb0;                                                  //Get the page of the byte


       LCD_RegWrite(y_Page);//确定要显示的位置


       LCD_RegWrite(x_low);


       LCD_RegWrite(x_hight);


       LCD_RegWrite(0xe0);                                                    //设置为读写改模式


       y_Page = LCD_DataRead();                                     //把此位置的旧数据读出来


       if(i) y_Page |= Dot_Mask_Buf; //与新数据“相或”,判断是点亮还是扑灭。


       else y_Page &= ~Dot_Mask_Buf;


       LCD_DataWrite(y_Page);                    //把“相或”后的数据再写入该地址


       LCD_RegWrite(0xee);                                                     //读写改模式结束


}


把算法想通了,看懂上面这个在任意位置打点的子函数应该很容易。根据自己的LCD稍微改改就可以用于任意LCD了。


  有了这个核心的打点函数,然后用点来在任意位置绘制任意大小的字符就容易了。将字符的字模数据的没一位加以判断,如果判断到某位的值是非零的话就调用画点函数在该位置画点即可。这样把一个字符数据判断完也就把其画出来了。任意图形的字模数据也可以这样画出来。记得曾经同仁发贴问过做示波器如何在LCD上画波形,我想完全可以利用绘点函数,在LCD上显示出动态的波形来。


   好了,就写了这么动,说了这么多不知道将明白了没有,呵呵,只是作为自己学习的总结吧,我这里有小丑大哥写的关于LCD驱动的资料和代码。写的实在太好了,好东西要分享,要的话发E_M给我,xiaojiewen1128@126.com


 


 


文章评论7条评论)

登录后参与讨论

用户612673 2012-5-6 21:43

学习了,谢谢

用户561366 2011-3-22 15:52

楼主你好,我想问下如何驱动lcd点亮lcd屏 coolxuchen@163.com

用户147174 2008-12-11 00:18

在液晶屏上显示任意一点,一般数据手册上会指明数据写入起始地址,这个地址应该可以改根据需要修改.

用户1447138 2008-12-4 12:11

想问你一下...若是没有固定一点想在液晶屏上显示任意一点要怎么做??? 呵呵....现在刚刚看LCD 有点不明白

用户161601 2008-8-19 15:20

邮件已发!

用户162309 2008-8-19 09:25

我要一份chengdumw@yahoo.com.cn

用户1511620 2008-8-18 23:02

给我一份谢谢.jiejiying@126.com
相关推荐阅读
用户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...
我要评论
7
9
关闭 站长推荐上一条 /2 下一条