DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 112|回复: 0
打印 上一主题 下一主题

跟我学51单片机(八)——图型带字库液晶128×64

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-16 17:18:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

                      上期我向大家介绍了字符型液晶1602的基本功能,并用51单片机的驱动显示,你可以用它表达你的幸运日期或者你喜欢的数字。虽然说1602液晶使用方便,但如果你想用它表达更多的语言,就难以满足要求了,因此,我向大家介绍一款128×64的带字库液晶。
  一、原理简介
  我手里的这款128×64液晶内部是以ST7920芯片作为控制器,是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16×16点汉字,和128个16×8点ASCII字符集。可以显示8×4行16×16点阵的汉字。因此利用该液晶模块可以灵活的构成全中文人机交互图形界面,也可完成图形显示。低电压低功耗也是其一显着特点。其外观图如图1(a)所示,其管脚排布如图1(b)所示。



?
  值得说明一点的是,只要是控制器为ST7920芯片(或者类似芯片型号)的带字库的128×64液晶,不论其背光的颜色(普遍可见的有黄绿色、蓝色和白色),甚至管脚分布稍有差异,其特性与控制方法基本都是一样。128×64液晶的管脚各功能如表1所示。



  其中并行模式下,管脚RS为高电平时, DB7"DB0为显示数据;RS为低电平时,表示DB7"DB0为显示指令。
  R/W管脚为高电平且E为高电平时,数据被读到DB7"DB0,R/W管脚为低电平且E管脚从高电平跳到低电平时,DB7"DB0的数据被写到IR或DR,如表2、表3所示。






  值得注意的是,当128×64液晶工作在2线或3线串行接口方式时,所需要的控制管脚发生改变,如表1中所示,第4管脚成为串行的片选信号,第5管脚成为串行的数据口,而第6管脚成为串行的同步时钟,所以表2、3不适合串行工作下的管脚状态。本文中对串行控制128×64液晶不做过多介绍,感兴趣的读者可以在本刊网站(www.ele169.com)下载串行控制程序。
  12864液晶模块的控制芯片有两套控制命令,分为基本指令和扩充指令。这里介绍几个12864液晶编程时经常用到的几个指令(见表4)。




            
                   
  二、电路详解
  如图2所示,128×64液晶的控制管脚都接到了单片机管脚上,前文提到,在功能设置指令中可以将液晶设为并行的8位、4位数据接口,图中采用的是8位的数据接口,当然也可以当四位数据接口或者串行接口来用。另液晶电源正端接5V,负端接地,背光正端由5V经过一个二极管降压后接入,负端接地。此外,液晶的偏压管脚(VO)接到一个电位器的中间抽头,电位器的两端分别接5V和地,这样就可通过调节电位器来实现对128×64液晶对比度的调节。经实验测试,笔者手里的128×64液晶的偏压管脚的电压调节到3.6"3.7V时对比度效果最好。读者可以自己实践测试。



图2 128×64液晶与单片机的连接图
  三、程序设计
  在程序设计之前,我们先了解下128×64液晶内部控制器ST7920的读写时序,其读写时序如图3、4所示。



图3 ST7920的数据写入时序(8位数据线模式)



图4 ST7920的数据读取时序(8位数据线模式)
  对照时序图和表2、表3,我们可以很容易的写出驱动128×64液晶的各个子函数,如下所示:
  /*读忙函数:检测液晶是否能够接收数据或命令,可用
  一段延时替代*/
  void check_busy(void)
  {
  BF = HIGH;
  //将读忙管脚设为输入
  RS = LOW;
  //读忙时,RS电平应为低
  RW = HIGH;
  //读忙时,RS电平应为高
  E = HIGH;
  //E置高,配合数据读取
  while(BF==1);
  //死循环,如果忙,则一直等待
  E = LOW; //E置低
  }
  /*写指令函数:向寄存器写入控制字
  参数:cmd - 要写入的控制字*/
  void LCD_en_command(uchar cmd)
  {
  check_busy();
  //先检测液晶是否能够接收指令
  RS= LOW;
  //写指令时,RS电平应为低
  RW=LOW;
  //写指令时,RS电平应为低
  LCDIO= cmd;
  //将要写入的指令输出到对应的端口
  E=HIGH;
  //E置高
  E=LOW;
  //E置低,下降沿写入数据
  }
  /*写数据函数:向寄存器写入数据
  参数:dat - 要写入的数据*/
  void LCD_en_dat(uchar dat)
  {
  check_busy();
  //先检测液晶是否能够接收数据
  RS=HIGH;
  //写数据时,RS电平应为高
  RW=LOW;
  //写数据时,RW电平应为低
  LCDIO=dat;
  //将要写入的数据输出到对应的端口
  E=HIGH;
  //E置高
  E=LOW;
  //E置低,下降沿写入数据
  }

            
                   
  要使128×64液晶能正常工作和操作方便,除了写数据和命令函数外,还需要进行初始化等操作,先将本讲中所用到的操作128×64液晶的主要函数设计如下。
  液晶初始化函数:初始化液晶,设置液晶的工作方式等。
  void LCD_init(void)
  {
  RST=0;
  //RST管脚置低,复位液晶
  LCD_delay();
  //延时一段时间,以完全复位
  RST=1;
  //RST管脚置高,复位完成
  PSB=1;
  //PSB管脚置高,并行工作模式
  LCD_en_command(0x30);
  //设置8位并数据格式
  LCD_en_command(0x0c);
  //开显示器
  LCD_en_command(0x80);
  //显示起始地址
  CLEARSCREEN();
  //对液晶进行清屏
  }
  /*设置显示地址函数:
  参数:x取值范围:0~7;y取值范围:1~4 */
  void LCD_set_xy( uchar x, uchar y )
  {
  switch(y) //判断是哪一行显示
  {
  case 1CD_en_command(0x80 + x);break;
  //如果是第一行,地址加0x80
  case 2CD_en_command(0x90 + x);break;
  //如果是第二行,地址加0x90
  case 3CD_en_command(0x88 + x);break;
  //如果是第三行,地址加0x88
  case 4CD_en_command(0x98 + x);break;
  //如果是第四行,地址加0x98
  default:break; //否则退出
  }
  }
  /*写字符串函数:向液晶写入字符串
  参数:x-列坐标,y-行坐标,*s-将要显示的字符串数
  据*/
  void LCD_write_string(uchar x, uchar y, uchar *s)
  {
  LCD_set_xy( x, y );
  //先设置要显示的地址
  while (*s) //如果当前字符没有结束
  {
  LCD_en_dat(*s); //显示当前字符
  s ++; //指向下一个字符
  }
  }
  四、调试要点与实验现象
  接好硬件(特别是连接好128×64液晶),通过冷启动方式将程序所生成的。hex文件下载到单片机运行后,复位单片机,然后就可在学习板上看到12864液晶上显示的“128×64液晶测试”等字符。
  调试128×64液晶时应注意的是,对于液晶的读忙函数如果用一段延时代替的话,一定要足够长,不同128×64液晶的所需要的时间可能稍许不同,这也是导致液晶无显示,出乱码等的常见原因。此外,与前讲介绍的1602液晶相似,对于128×64液晶上的V0管脚,作为液晶显示器对比度调整端,其接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,因此可通过一个电位器实现对其的电压调整,前文提到,将其调节到3.6"3.7V 时对比度效果最好。
  五、总结
  本讲简要介绍了带字库128×64液晶的工作原理并给出了驱动实例,在液晶的操作时序一定要严格,需参考其数据手册或规格书。
  对于128×64液晶,如果在实际应用中仅使用并口或串口通信模式,可将PSB(第15脚)接固定电平,并口时接高电平;串口时接低电平,从而节省控制管脚。
  128×64液晶的内部接有上电复位电路,因此可以将RESET(第17脚)悬空或者接到电源正上,以节省控制管脚。
  128×64液晶内部带有丰富的DDRAM(文本显示RAM)和GDRAM(绘图RAM),本文只是对其驱动方法经行了介绍,但具体如何实现等需要读者自己实践。
  液晶的显示对后续程序的辅助作业很大,可以用它来显示一些调试信息或者测量数据等非常方便,下讲就将结合液晶显示来实现一个单片机的简易频率计,敬请期待。
            
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-5-23 21:46 , 耗时 0.080568 秒, 19 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表