前一篇讲到的那种向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驱动的资料,感触很深!
从在任意位置画点开始:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
思想是这样的:只要解决了在任意位置画点的问题,其余的不管是字符还是图形,都用画点的函数来完成即可!
现在做这样一件事。如上图,在屏幕的第一行第一列已经有了一点,现在想在第2行第一列再打上一点。由于列数据必须是8的整数倍,所以提取的数据必然如下图所示:
如果把上图对应的数据直接写入LCD,那第一行第一列原本的那个点将会消失,因为他已经被第2次写的数据所覆盖了。为了达到不影响原有的数据,所以在写入新的之前我们先把数据从LCD的RAM中把已有的数据读出来,然后再把要写入的新数据与旧数据相“位或”后
再写入LCD即可。这样就就可以保持原由的数据不变,而又能在任意位置完成打点。下面来看具体代码:
//=====================================================================
void Write_Dot_LCD(unsigned char x,unsigned char y,unsigned char i)
/*x,y分别为显示的横,纵坐标,i为1表示把该点显示亮,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!
用户612673 2012-5-6 21:43
用户561366 2011-3-22 15:52
用户147174 2008-12-11 00:18
用户1447138 2008-12-4 12:11
用户161601 2008-8-19 15:20
用户162309 2008-8-19 09:25
用户1511620 2008-8-18 23:02