|
LCD12864 GUI学习 第五篇 打点
1. 原理图引脚 (打点是画直线、斜线、方形、填充、圆形等等等的一切的基础的基础,所以打点是最重要的一步) EN —— P2.0 RS —— P2.1 PSB —— P2.2 RW —— P2.3 2. 图片显示 (网上摘抄的资料,觉得不错) 首先,我们知道,图形都是由像素点组成的,绘图的基础其实就是画点。只要我们能点亮液晶的任意一个像素点,那么绘图就不是什么难事了。万丈高楼平地起嘛,先要做的,当然是要打好基础。 ST7920提供了用于绘图的GDRAM(graph display RAM)。共 64×32 个字节的空间(由扩充指令设定绘图 RAM 地址),最多可以控制 256×64点阵的二维绘图缓冲空间。在它的Datasheet给出了GDRAM的坐标地址对照表:
用坐标表示,就是这样:
它的横坐标每一个地址都是16 位的。共16个地址,256位。
很明显,它能控制256*64像素的液晶屏,而我们的只是128*64像素液晶屏,显然只用到它的一部分。
我刚开始以为它对应屏幕的绘图RAM是这样分布的(如红色部分):
结果栽了大根头,后来终于弄明白,原来它对应屏幕的GDRAM是这样分布的: 只要我们清楚了它的GDRAM和屏幕上像素点的映射(对应)关系,点亮对应的像素点就容易多了。要点亮某一个像素点,就是将这个像素点在GDRAM中对应的位置1,这个相信没人会不知道吧?
我们先讨论一下思路,再一步步写代码。我觉得,思路要比代码重要的多,只要你的思路通了,正确了,那么写出代码肯定会很容易
3. 程序介绍 - /*-------------------------------------------------------------------
- 增加画点子程序
- -------------------------------------------------------------------*/
- void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
- {
- unsigned char Row,Tier,Tier_bit;
- unsigned char ReadOldH=0x00;
- unsigned char ReadOldL=0x00 ;
- LCD_Com(0x34);
- LCD_Com(0x36);
- Tier = X >> 4 ; //算出它在哪一个字节(地址)// x/16 // 右移4位,即除16并取整,得对应要写入12864的横坐标DX
- Tier_bit = X&0x0f ;//
- if(Y<32)
- {
- Row=Y ;
- }
- else // //y坐标大于31,要上屏显示,DX也相应加8
- {
- Row=Y-32 ;
- Tier+=8 ;
- }
-
- LCD_Com(0x80+Row);
- LCD_Com(0x80+Tier);
- ReadByte();
-
- ReadOldH=ReadByte();
- ReadOldL=ReadByte();
- LCD_Com(0x80+Row);
- LCD_Com(0x80+Tier);
- if(Tier_bit<8) //x在DX中处于低8位(按预想坐标看),但在LCD内坐标系中属于高8位,对应ReadOldH
- {
- ReadOldH|= (0x80>> Tier_bit); //写高字节。因为坐标是从左向右的//而GDRAM高位在左,底位在
- }
- else
- {
- ReadOldL |= (0x80 >>(Tier_bit -8));
- }
-
- LCD_Dat(ReadOldH);
- LCD_Dat(ReadOldL);
- LCD_Com(0x30);
- }
复制代码4. 显示 - DrawPoint(8,10,1);
- DrawPoint(9,10,1);
- DrawPoint(30,30,1);
- DrawPoint(31,30,1);
- DrawPoint(32,30,1);
- DrawPoint(0,63,1);
- DrawPoint(63,0,1);
- DrawPoint(127,63,1);
复制代码显示如下:
|
|