2425|2

2781

帖子

419

TA的资源

五彩晶圆(中级)

楼主
 

12864学习笔记_3---控制12864液晶显示曲线 [复制链接]

三,液晶显示曲线
    要想使用12864实现曲线的显示,必须先实现能够自由控制12864中的任意一个像素点的亮灭,而不能影响到相邻其他点的状态。
因为对12874液晶进行写操作的话,写入数据的最小单位也是一个16进制数,是8位的,能够控制8个像素点,所以,对液晶进行操作时,能够一次控制液晶的最少像素点数为8个。
所以要想控制液晶中的某一个点的亮灭,必须找到一种办法,使这一个点的数据的写入由写入这个16进制数来实现,而基本原则是不能影响其他7位数据的状态。所以要想实现控制某一个像素点,必须先知道目前液晶中在这个像素点左右其他7位的目前数据,然后把该点的数据按位加到这个数据上,而不能影响其他7位数据的状态。
实现知道目前显示的数据的方法有两种:1,实现液晶的读操作,把GDRAM中的对应的数据读出来,就可以了;2,人工构建一个虚拟的缓存寄存器(其实也就是一个二维数组),保存液晶GDRAM最后一次写入的数据,即是目前液晶显示的数据,因为保存的是8位的16进制数,所以128*64个像素点只需要16*64的数组就可以存储完了。在写12864的同时写虚拟寄存器,写之前读出虚拟寄存器的值与点位置相或,这样才不会覆盖之前的点。
因为msp430g2553IO管脚有限,所以我的12864是串行连接的。而并行连接的话, 液晶的读操作并不难实现。现在串行的,虽然比较复杂一些,但很类似于串行的读操作,主要是看懂时序,然后严格按照时序就可以写出。我已经可以实现了液晶的读,写操作。读写操作的函数如下,其中注释的也比较详细:
//12864串行连接 写数据,写命令函数    按照手册上的时序进行编程
void wr_lcd(uchar dat_comm,uchar content)//
{ //              要写的数据
  uchar a,i,j;
      delay_us(50);
  a=content;
       LCD_SCLK0; //en=0;
       LCD_SID1;  //wr=1
  for(i=0;i<5;i++) //数据时序*****************8  5个高电平的同步码
  {
  LCD_SCLK1;
  LCD_SCLK0;
  }
  LCD_SID0;       //wr=0  写操作
  LCD_SCLK1;      //en=1  来一个时钟
  LCD_SCLK0;      //en=0
  if(dat_comm)
  LCD_SID1;  //RS=1  写数据
  else
  LCD_SID0;   //RS=0  写指令
  LCD_SCLK1; //来一个时钟
  LCD_SCLK0;
  LCD_SID0;  //控制字的最后一位为0
  LCD_SCLK1;  //来一个时钟
  LCD_SCLK0;
   for(j=0;j<2;j++)//
{
  uchar i,j;
  uchar a=0;//a存放读取的数据
      delay_us(50);
       LCD_SCLK0; //en=0;
       LCD_SID1;  //wr=1
  for(i=0;i<5;i++) //数据时序*****************8 5个高电平的同步码
  {
  LCD_SCLK1;
  LCD_SCLK0;
  }
  LCD_SID1;       //wr=1 读操作
  LCD_SCLK1;      //en=1  来一个时钟
  LCD_SCLK0;      //en=0
  LCD_SID1;   //RS=1  读数据
  LCD_SCLK1; //来一个时钟
  LCD_SCLK0;
  LCD_SID0;  //控制字的最后一位为0
  LCD_SCLK1;  //来一个时钟
  LCD_SCLK0;
   for(j=0;j<2;j++)/
void Draw_Point(unsigned char x,unsigned char y0,unsigned char color)
{
   unsigned char row,collum,cbite;
   unsigned char tempH,tempL;
   wr_lcd(comm,0x34);      //打开扩展指令集
   wr_lcd(comm,0x36);     //打开绘图显示
//   uchar y_Byte,y_bit,x_Byte,x_bit;
//   y_Byte = y/32; //0:上半屏幕1:下半屏幕
//   y_bit = y2; //y 的行号
//   x_Byte = x/16; //x 的列号
//   x_bit = x; //x 的位
//   Write_Cmd(0x34); //打开扩展指令集
//   Write_Cmd(0x36); //打开绘图显示
//   Write_Cmd(0x80+31-y_bit);
//   Write_Cmd(0x80+x_Byte+(1-y_Byte)*8);
   collum=x>>4;   //右移4位  相当于除以16取整,得到的是x的所在大列的列号
   cbite=x&0x0f;
   if(y0<32)
    row=y0;
   else
   {
   row=y0-32;
   collum+=8;
}
   wr_lcd(comm,0x80+row);   //先设定垂直位置
   wr_lcd(comm,0x80+collum);  //再设定水平位置
//上面两句指定了地址,下面先读出目前的数据,然后再写入新的数据
rd_lcd();   //读操作  要先执行一次空读指令
tempH=rd_lcd();  //两次读操作
tempL=rd_lcd();
//因为没进行一次读或写操作,地址指针AC都会自加1,所以下面要重新输入地址  同样还是先输入垂直地址,然后再输入水平地址
wr_lcd(comm,0x80+row);
wr_lcd(comm,0x80+collum);
if (color)   //color=1,点亮;color=0,擦除
{
if(cbite<8)
{
tempH|=(1<<(7-cbite));
//tempL=(1<<(7-cbite));
}
else
{
//tempH=(1<<(15-cbite));
tempL|=(1<<(15-cbite));
}
}
else
{
    if(cbite<8)
{
tempH&=~(1<<(7-cbite));
//tempL=(1<<(7-cbite));
}
else
{
//tempH=(1<<(15-cbite));
tempL&=~(1<<(15-cbite));
}
}
wr_lcd(dat,tempH);  //写入数据
wr_lcd(dat,tempL);
wr_lcd(comm,0x30);  //回到基本指令集
}
使用上面的函数,就可以实现对任意一个像素点的亮灭控制了。有了上面的函数,然后就可以实现控制液晶显示任意曲线或任意形状的图像了。下面就贴一个显示坐标轴的函数吧,函数实现的功能是在液晶屏上显示X,Y坐标轴,并且把坐标轴按每10个点进行分段,函数如下:

最新回复

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

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
谢谢
 
 

回复

22

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
謝謝!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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