微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 我的12864学习笔记_4---几点补充详解

我的12864学习笔记_4---几点补充详解

时间:11-28 来源:互联网 点击:
我发现前面几篇对图画显示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;j32;j++)//写入第一行的8个32*16模块

{

wr_lcd(comm,i++);//写入第一行8个32*16模块的垂直起始地址,在写入地址时,要先输入垂直地址,再输入水平地址这是规定好的

wr_lcd(comm,0x80);//第一行水平的起始地址为80H

//以后写入数据后,地址计数器(AC)会自动加一

for(k=0;k16;k++)

{

wr_lcd(dat,0x00);//写入空字符,就相当于清零

//写入32*16个图片数据因为一个数据是8位的,所以这一次就相当于写入了8个数据,所以一共为8个32*16模块

}

}

i=0x80;

for(j=0;j32;j++)//写入第二行的8个32*16模块

{

wr_lcd(comm,i++);//写入第一行8个32*16模块的垂直起始地址,在写入地址时,要先输入垂直地址,再输入水平地址这是规定好的

wr_lcd(comm,0x88);//第二行的水平起始地址为88H

//以后写入数据后,地址计数器(AC)会自动加一

for(k=0;k16;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;j32;j++)//写入第一行的8个32*16模块

{

wr_lcd(comm,i++);//写入第一行8个32*16模块的垂直起始地址,在写入地址时,要先输入垂直地址,再输入水平地址这是规定好的

wr_lcd(comm,0x80);//第一行水平的起始地址为80H

//以后写入数据后,地址计数器(AC)会自动加一

for(k=0;k16;k++)

{

wr_lcd(dat,*ptr++);//写入32*16个图片数据因为一个数据是8位的,所以这一次就相当于写入了8个数据,所以一共为8个32*16模块

//这些16进制数,一共可以控制32*16*8个像素

}

}

i=0x80;

for(j=0;j32;j++)//写入第二行的8个32*16模块

{

wr_lcd(comm,i++);//写入第一行8个32*16模块的垂直起始地址,在写入地址时,要先输入垂直地址,再输入水平地址这是规定好的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top