930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 10084|回复: 1

LCD 12864液晶模块使用详解5-画点、画点刷屏

[复制链接]

27

主题

72

帖子

384

积分

版主

Rank: 7Rank: 7Rank: 7

积分
384
发表于 2016-9-18 23:14:54 | 显示全部楼层 |阅读模式
1. 画点
  LCD12864液晶模块共有128×64个像素点,图形都是由像素点组成,绘图通过向GDRAM中写入数据而达到在屏幕上显示图形的目的。GDRAM中的各个位和屏幕上的像素点对应,位写为“0”,屏幕上对应的点就会变暗,位写为“1”,屏幕上对应的点就会点亮,通过点亮或熄灭各个位的组合,即可达到显示图形的效果。


  绘图的实质就是按照一定的组合画点,画点是绘图的基础,要想实现在屏幕上任意位置画点,就需要明白GDRAM和屏幕的映射关系,也就是GDRAM中的地址和屏幕上的点的对应关系。


  我们习惯于使用直角坐标系来表示坐标,我们为屏幕建立一个如下图所示的直角坐标系,如果绘图时能按照直角坐标系来操作,那么画点就很容易理解了。所以,我们要用一个画点函数,输入参数是直角坐标系的坐标,函数中将直角坐标系的坐标转换为GDRAM地址,这样,我们画点的时候,调用这个函数,按照直角坐标系才操作就可以了。
  但是正如前面所说,绘图是通过GDRAM来显示的,而GDRAM有自己的显示坐标,如下图所示。
  GDRAM将屏幕为上半屏和下半屏,如下图所示。
  X轴上每次操作是16个点,也就是每次两个字节。
  Y轴每次操作1个点。
  对于上半屏和下半屏来说,X轴上都是有8个地址,而Y轴上都是有32个地址。根据下面的这个图,我们就可以将直角坐标系的坐标转换为GDRAM地址。
  如输入的直角坐标系地址为x,y(0≤x<128,0≤y<64)。计算过程如下:
  1)确定该点位于上半屏还是下半屏:如0≤y<32,则位于上半屏,y值保持不变;如32≤y<64,则位于下半屏,y值减去32。
  2)GDRAM中X坐标地址:x/16计算出x在哪一个地址段内,从而获取X坐标的起始地址。
  3)X轴一次操作16个位,所以还需要计算x处于这16个位中的哪一个位。
  4)为了在写入一个点的时候不改变屏幕上其他的显示内容,还需要读出这16个位的内容,进行或运算后再写入到GDRAM。

程序清单:
  1. /********************************************************************
  2. * 描  述 : LCD12864液晶任意位置画点
  3. * 参  数 : x[in]:x坐标,范围0~127
  4. *        :y[in]:y坐标,范围0~63  
  5. *        :color[in]:0=熄灭,1=点亮,2=反显
  6. * 返回值 : 无
  7. ********************************************************************/
  8. void LCD_DrawDot(uchar x,uchar y)
  9. {
  10.   uchar row,columu,x_byte,x_bit;
  11.   uchar Read_H=0,Read_L=0;  
  12.    
  13.   Write_Cmd(0x34);  //使用扩展指令集
  14.   Write_Cmd(0x36);  //绘图显示开     
  15.   
  16.   //X轴一次操作对应16个位(2个字节),所以要计算画的点属于哪个字节、在字节中属于哪个位
  17.   x_byte = x>>4;    //计算将要画的点属于哪一个字节     
  18.   x_bit  = x & 0x0F;//计算将要画的点属于哪一个位
  19.   
  20.   //GDRAM将屏幕划分为上半屏和下半屏,在上半屏和下半屏中Y轴的坐标都是从0~31,所以要根据输//入的直角坐标计算出改点属于上半屏还是下半屏
  21.   if(y < 32) {columu = x_byte,row=y;} //该点位于上半屏
  22.   else              //该点位于下半屏
  23.   {         
  24.       row = y-32;         
  25.       columu = x_byte + 8;     
  26.   }
  27.   Write_Cmd(row+0x80);     //写入行地址
  28.   Write_Cmd(columu+0x80);  //写入列地址
  29.   ReadDat();               //假读
  30.   Read_H=ReadDat();      //读出将要写入的地址的数据,这样做是为了不影响屏幕上其他点的显示
  31.   Read_L=ReadDat();   
  32.   //读的时候地址会自动增加,所以要重新写一下地址
  33.   Write_Cmd(row+0x80);
  34.   Write_Cmd(columu+0x80);   
  35.   if(x_bit < 8) Read_H |=(0x01<<(7-x_bit));
  36.   else Read_L |=(0x01<<(15-x_bit));
  37.   //写入数据   
  38.   Write_Data(Read_H);
  39.   Write_Data(Read_L);
  40.   Write_Cmd(0x30);//恢复基本指令集,关闭绘图模式
  41. }
复制代码
画点和刷屏程序源码下载:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

4

主题

46

帖子

208

积分

中级会员

Rank: 3Rank: 3

积分
208
发表于 2016-9-19 08:47:41 | 显示全部楼层
不错,下载了,测试OK,代码标注非常详细,楼主辛苦!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

Copyright © 合肥艾克姆电子科技有限公司
快速回复 返回顶部 返回列表