超人归来4迅雷下载:关于LCD的总结(续) -- water的学习笔记

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 08:32:23

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

              

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

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

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

从在任意位置画点开始:

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

                            

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

                              

如果把上图对应的数据直接写入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