|  | 
 
| 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。
 
 程序清单:
 
 画点和刷屏程序源码下载:复制代码/********************************************************************
 * 描  述 : LCD12864液晶任意位置画点
 * 参  数 : x[in]:x坐标,范围0~127
 *        :y[in]:y坐标,范围0~63  
 *        :color[in]:0=熄灭,1=点亮,2=反显
 * 返回值 : 无
********************************************************************/
void LCD_DrawDot(uchar x,uchar y)
{
  uchar row,columu,x_byte,x_bit; 
  uchar Read_H=0,Read_L=0;  
    
  Write_Cmd(0x34);  //使用扩展指令集 
  Write_Cmd(0x36);  //绘图显示开     
  
  //X轴一次操作对应16个位(2个字节),所以要计算画的点属于哪个字节、在字节中属于哪个位
  x_byte = x>>4;    //计算将要画的点属于哪一个字节     
  x_bit  = x & 0x0F;//计算将要画的点属于哪一个位 
  
  //GDRAM将屏幕划分为上半屏和下半屏,在上半屏和下半屏中Y轴的坐标都是从0~31,所以要根据输//入的直角坐标计算出改点属于上半屏还是下半屏
  if(y < 32) {columu = x_byte,row=y;} //该点位于上半屏
  else              //该点位于下半屏 
  {         
      row = y-32;         
      columu = x_byte + 8;     
  } 
  Write_Cmd(row+0x80);     //写入行地址
  Write_Cmd(columu+0x80);  //写入列地址
  ReadDat();               //假读
  Read_H=ReadDat();      //读出将要写入的地址的数据,这样做是为了不影响屏幕上其他点的显示
  Read_L=ReadDat();   
  //读的时候地址会自动增加,所以要重新写一下地址
  Write_Cmd(row+0x80);
  Write_Cmd(columu+0x80);   
  if(x_bit < 8) Read_H |=(0x01<<(7-x_bit));
  else Read_L |=(0x01<<(15-x_bit));
  //写入数据    
  Write_Data(Read_H);
  Write_Data(Read_L);
  Write_Cmd(0x30);//恢复基本指令集,关闭绘图模式
}
 
 
 
 | 
 
x本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?立即注册  |