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