2503|1

2781

帖子

419

TA的资源

五彩晶圆(中级)

楼主
 

12864学习笔记_4---几点补充详解 [复制链接]

我发现前面几篇对图画显示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*1616块,地址分别是80H-8FH,显示时候可分为两个部分给数据.这时就可以看为32*128的两块。
    注意图形显示时候的每一个字节地址所对应的位置。每行共八个模块,共送两次,开始地址分别为80H88H
    也就是显示的时候会只用到GDRAM的前0~31行,共有0~255列,列又分每16列为一个大列,所以有0~1516大列。也可以像上面那样理解为分成了32*1616个模块,地址分别为80H-8FH
    然后把这16个模块分成两行显示,所以每一行是832*16模块,也就是32*128。所以这两行的起始地址分别为80H88H。所以在写入图形数据的时候会分两次写入,先写入第一行的832*16模块,再写入第二行的832*16模块。
    在写入数据的时候要注意,要先输入垂直地址,再输入水平地址。
    上面的对GDRAM进行分块及分行进行显示都是液晶出厂时默认设定好的,我们用的时候就直接对相应位置的RAM进行写入数据就可以了。
所以由上面显示图片的原理的介绍就可以看出12864液晶只能显示GDRAM的一半,只用了全部GDRAM的一半。
清除了上面GDRAM的工作原理,那么GDRAM图片数据的写入和GDRAM清除程序就不难理解了。程序下面给出,注释的也很详细。
   有了上面的介绍,那么再看下面对GDRAM的操作(如:清除,数据等)就会明白很多了,下面是对GDRAM的清除函数,注释的也比较详细:
清除GDRAM的函数如下:
void Clear_GDRAM(void)   //清除GDRAM中的的随机数据。因为上电后GDRAM中的数据是随机的,如果不清除而直接打开GDRAM显示时,会显示乱码
                        //所以在局部使用GDRAM显示图形时,要先清除随机数据。如果是全局使用GDRAM,即整个lcd屏全部设置显示数据,则可以
                       //不必清除,因为新数据会把随机数据给覆盖掉
{
    uchar i,j,k;
    wr_lcd(comm,0x34);       //打开扩展指令集   操作GDRAM是扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)   //写入第一行的832*16模块
{
wr_lcd(comm,i++); //写入第一行832*16模块的垂直起始地址,在写入地址时,要先输入垂直地址,再输入水平地址 这是规定好的
        wr_lcd(comm,0x80);   //第一行水平的起始地址为80H
//以后写入数据后,地址计数器(AC)会自动加一
   for(k = 0;k < 16;k++)
   {
   wr_lcd(dat,0x00);  //写入空字符,就相当于清零
     //写入32*16个图片数据  因为一个数据是8位的,所以这一次就相当于写入了8个数据,所以一共为832*16模块
   }
}
i = 0x80;
  for(j = 0;j < 32;j++) //写入第二行的832*16模块
{
  wr_lcd(comm,i++);  //写入第一行832*16模块的垂直起始地址,在写入地址时,要先输入垂直地址,再输入水平地址  这是规定好的
  wr_lcd(comm,0x88);  //第二行的水平起始地址为88H
  //以后写入数据后,地址计数器(AC)会自动加一
   for(k = 0;k < 16;k++)
   {
   wr_lcd(dat,0x00);  //写入32*16个图片数据  因为一个数据是8位的,所以这一次就相当于写入了8个数据,所以一共为832*16模块
     //写入空字符,就相当于清零
    }
}
  wr_lcd(comm,0x30);        //回到基本指令集
}
向GDRAM的写函数如下:
void Draw_PM(const uchar *ptr)    //整屏显示图形
{
    uchar i,j,k;
    wr_lcd(comm,0x34);        //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)    //写入第一行的832*16模块
{
wr_lcd(comm,i++);    //写入第一行832*16模块的垂直起始地址,在写入地址时,要先输入垂直地址,再输入水平地址  这是规定好的
wr_lcd(comm,0x80);   //第一行水平的起始地址为80H
//以后写入数据后,地址计数器(AC)会自动加一
   for(k = 0;k < 16;k++)
   {
   wr_lcd(dat,*ptr++);   //写入32*16个图片数据  因为一个数据是8位的,所以这一次就相当于写入了8个数据,所以一共为832*16模块
//这些16进制数,一共可以控制32*16*8个像素
   }
}
i = 0x80;
  for(j = 0;j < 32;j++)   //写入第二行的832*16模块
{
  wr_lcd(comm,i++);//写入第一行832*16模块的垂直起始地址,在写入地址时,要先输入垂直地址,再输入水平地址  这是规定好的
  wr_lcd(comm,0x88);   //第二行的水平起始地址为88H
  //以后写入数据后,地址计数器(AC)会自动加一
   for(k = 0;k < 16;k++)
   {
   wr_lcd(dat,*ptr++);   //写入32*16个图片数据  因为一个数据是8位的,所以这一次就相当于写入了8个数据,所以一共为832*16模块
//这些16进制数,一共可以控制32*16*8个像素
    }
}
  wr_lcd(comm,0x36);        //打开绘图显示
  wr_lcd(comm,0x30);        //回到基本指令集
}
最后在说一个简单的函数,拿到液晶时,我们希望检查一下液晶是不是好的,是不是所有的点都是可用的,就要写一个检查液晶的函数。原理很简单,就是把液晶的所有的像素点都点亮,看看有没有坏点就可以了,函数,如下,和写GDRAM,清除GDRAM的函数基本相同,只不过向GDRAM中写入的是全1,点亮所有的像素点,函数如下:
void check_screen(void)   //点亮全屏,检查坏点
{
    uchar i,j,k;
    wr_lcd(comm,0x34);       //打开扩展指令集   操作GDRAM是扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)   //写入第一行的832*16模块
{
wr_lcd(comm,i++); //写入第一行832*16模块的垂直起始地址,在写入地址时,要先输入垂直地址,再输入水平地址
        wr_lcd(comm,0x80);   //第一行水平的起始地址为80H
//以后写入数据后,地址计数器(AC)会自动加一
   for(k = 0;k < 16;k++)
   {
   wr_lcd(dat,0xff);  //全部点亮屏幕
     //写入32*16个图片数据  因为一个数据是8位的,所以这一次就相当于写入了8个数据,所以一共为832*16模块
   }
}
i = 0x80;
  for(j = 0;j < 32;j++) //写入第二行的832*16模块
{
  wr_lcd(comm,i++);  //写入第一行832*16模块的垂直起始地址,在写入地址时,要先输入垂直地址,再输入水平地址
  wr_lcd(comm,0x88);  //第二行的水平起始地址为88H
  //以后写入数据后,地址计数器(AC)会自动加一
   for(k = 0;k < 16;k++)
   {
   wr_lcd(dat,0xff);  //全部点亮屏幕
   //写入32*16个图片数据  因为一个数据是8位的,所以这一次就相当于写入了8个数据,所以一共为832*16模块
    }
}
  wr_lcd(comm,0x36);        //打开绘图显示
  wr_lcd(comm,0x30);        //回到基本指令集
}

最新回复

謝謝!  详情 回复 发表于 2017-3-26 18:38
 
点赞 关注(1)
个人签名

回复
举报

22

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
謝謝!
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表