|
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
|