我发现前面几篇对图像显现RAM (GDRAM)介绍的不是很具体,我就在下面再具体地介绍一下:
图像显现RAM(GDRAM)
供给64*256位元的GDRAM供给64*32个位元组的回忆空间(由扩大指令设定绘图RAM地址),最多能够操控256*64点的二维绘图缓存空间。在更改绘图RAM时,由扩大指令设定GDRAM地址,先设笔直地址,再设水平地址(接连写入两个位元组的材料来完结笔直与水平的坐标地址)。再写入两个8位元的材料到绘图RAM,而地址计数器(AC)会主动加一,整个写入绘图RAM的过程如下:
(1),先将笔直的位元组坐标(Y)写入绘图RAM地址
(2),再将水平坐标(X)写入绘图RAM地址
(3),将D15~D8写入RAM中(写入榜首个bytes)。
(4),将D7~D0写入到RAM中(写入第二个bytes)。
当显现图形的时分,默许的将128*64的液晶模块分红了32*16的16块,地址分别是80H-8FH,显现时分可分为两个部分给数据.这时就能够看为32*128的两块。
留意图形显现时分的每一个字节地址所对应的方位。每行共八个模块,共送两次,开端地址分别为80H和88H。
也便是显现的时分会只用到GDRAM的前0~31行,共有0~255列,列又分每16列为一个大列,所以有0~15共16大列。也能够像上面那样理解为分红了32*16的16个模块,地址分别为80H-8FH。
然后把这16个模块分红两行显现,所以每一行是8个32*16模块,也便是32*128。所以这两行的开始地址分别为80H和88H。所以在写入图形数据的时分会分两次写入,先写入榜首行的8个32*16模块,再写入第二行的8个32*16模块。
在写入数据的时分要留意,要先输入笔直地址,再输入水平地址。
上面的对GDRAM进行分块及分行进行显现都是液晶出厂时默许设定好的,咱们用的时分就直接对相应方位的RAM进行写入数据就能够了。
所以由上面显现图片的原理的介绍就能够看出12864液晶只能显现GDRAM的一半,只用了悉数GDRAM的一半。
铲除了上面GDRAM的作业原理,那么GDRAM图片数据的写入和GDRAM铲除程序就不难理解了。程序下面给出,注释的也很具体。
有了上面的介绍,那么再看下面临GDRAM的操作(如:铲除,数据等)就会理解很多了,下面是对GDRAM的铲除函数,注释的也比较具体:
铲除GDRAM的函数如下:
voidClear_GDRAM(void)//铲除GDRAM中的的随机数据。由于上电后GDRAM中的数据是随机的,假如不铲除而直接翻开GDRAM显现时,会显现乱码
//所以在部分运用GDRAM显现图形时,要先铲除随机数据。假如是大局运用GDRAM,即整个lcd屏悉数设置显现数据,则能够
//不用铲除,由于新数据会把随机数据给覆盖掉
{
uchari,j,k;
wr_lcd(comm,0x34);//翻开扩展指令集操作GDRAM是扩展指令集
i=0x80;
for(j=0;j<32;j++)//写入榜首行的8个32*16模块
{
wr_lcd(comm,i++);//写入榜首行8个32*16模块的笔直开始地址,在写入地址时,要先输入笔直地址,再输入水平地址这是规定好的
wr_lcd(comm,0x80);//榜首行水平的开始地址为80H
//今后写入数据后,地址计数器(AC)会主动加一
for(k=0;k<16;k++)
{
wr_lcd(dat,0x00);//写入空字符,就相当于清零
//写入32*16个图片数据由于一个数据是8位的,所以这一次就相当于写入了8个数据,所以总共为8个32*16模块
}
}
i=0x80;
for(j=0;j<32;j++)//写入第二行的8个32*16模块
{
wr_lcd(comm,i++);//写入榜首行8个32*16模块的笔直开始地址,在写入地址时,要先输入笔直地址,再输入水平地址这是规定好的
wr_lcd(comm,0x88);//第二行的水平开始地址为88H
//今后写入数据后,地址计数器(AC)会主动加一
for(k=0;k<16;k++)
{
wr_lcd(dat,0x00);//写入32*16个图片数据由于一个数据是8位的,所以这一次就相当于写入了8个数据,所以总共为8个32*16模块
//写入空字符,就相当于清零
}
}
wr_lcd(comm,0x30);//回到根本指令集
}
向GDRAM的写函数如下:
voidDraw_PM(constuchar*ptr)//整屏显现图形
{
uchari,j,k;
wr_lcd(comm,0x34);//翻开扩展指令集
i=0x80;
for(j=0;j<32;j++)//写入榜首行的8个32*16模块
{
wr_lcd(comm,i++);//写入榜首行8个32*16模块的笔直开始地址,在写入地址时,要先输入笔直地址,再输入水平地址这是规定好的
wr_lcd(comm,0x80);//榜首行水平的开始地址为80H
//今后写入数据后,地址计数器(AC)会主动加一
for(k=0;k<16;k++)
{
wr_lcd(dat,*ptr++);//写入32*16个图片数据由于一个数据是8位的,所以这一次就相当于写入了8个数据,所以总共为8个32*16模块
//这些16进制数,总共能够操控32*16*8个像素
}
}
i=0x80;
for(j=0;j<32;j++)//写入第二行的8个32*16模块
{
wr_lcd(comm,i++);//写入榜首行8个32*16模块的笔直开始地址,在写入地址时,要先输入笔直地址,再输入水平地址这是规定好的
wr_lcd(comm,0x88);//第二行的水平开始地址为88H
//今后写入数据后,地址计数器(AC)会主动加一
for(k=0;k<16;k++)
{
wr_lcd(dat,*ptr++);//写入32*16个图片数据由于一个数据是8位的,所以这一次就相当于写入了8个数据,所以总共为8个32*16模块
//这些16进制数,总共能够操控32*16*8个像素
}
}
wr_lcd(comm,0x36);//翻开绘图显现
wr_lcd(comm,0x30);//回到根本指令集
}
最终在说一个简略的函数,拿到液晶时,咱们期望查看一下液晶是不是好的,是不是一切的点都是可用的,就要写一个查看液晶的函数。原理很简略,便是把液晶的一切的像素点都点亮,看看有没有坏点就能够了,函数,如下,和写GDRAM,铲除GDRAM的函数根本相同,只不过向GDRAM中写入的是全1,点亮一切的像素点,函数如下:
voidcheck_screen(void)//点亮全屏,查看坏点
{
uchari,j,k;
wr_lcd(comm,0x34);//翻开扩展指令集操作GDRAM是扩展指令集
i=0x80;
for(j=0;j<32;j++)//写入榜首行的8个32*16模块
{
wr_lcd(comm,i++);//写入榜首行8个32*16模块的笔直开始地址,在写入地址时,要先输入笔直地址,再输入水平地址
wr_lcd(comm,0x80);//榜首行水平的开始地址为80H
//今后写入数据后,地址计数器(AC)会主动加一
for(k=0;k<16;k++)
{
wr_lcd(dat,0xff);//悉数点亮屏幕
//写入32*16个图片数据由于一个数据是8位的,所以这一次就相当于写入了8个数据,所以总共为8个32*16模块
}
}
i=0x80;
for(j=0;j<32;j++)//写入第二行的8个32*16模块
{
wr_lcd(comm,i++);//写入榜首行8个32*16模块的笔直开始地址,在写入地址时,要先输入笔直地址,再输入水平地址
wr_lcd(comm,0x88);//第二行的水平开始地址为88H
//今后写入数据后,地址计数器(AC)会主动加一
for(k=0;k<16;k++)
{
wr_lcd(dat,0xff);//悉数点亮屏幕
//写入32*16个图片数据由于一个数据是8位的,所以这一次就相当于写入了8个数据,所以总共为8个32*16模块
}
}
wr_lcd(comm,0x36);//翻开绘图显现
wr_lcd(comm,0x30);//回到根本指令集
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/256245.html