液晶显示与单片机的接口与编程方法

液晶显示与单片机的接口与编程方法,第1张

  引言

  液晶显示器(LCD)具有功耗低、体积小、重量轻、超薄等许多其它显示器无法比拟的优点,近几年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品中。LCD 可分为段位式LCD、字符式LCD 和点阵式LCD。其中,段位式LCD 和字符式LCD 只能用于字符和数字的简单显示,不能满足图形曲线和汉字显示的要求;而点阵式LCD 不仅可以显示字符、数字,还可以显示各种图形、曲线及汉字,并且可以实现屏幕上下左右滚动,动画功能,分区开窗口,反转,闪烁等功能,用途十分广泛。本文介绍了点阵式液晶显示器MGLS12864 与单片机的接口及编程的方法,同时介绍了创建8×16 字符和16×16 点阵汉字的方法,及常用的字符显示和汉字显示程序。

  硬件设计

  这里着重介绍液晶显示器与单片机的接口技术。有关

  MGLS12864 图形液晶引脚功能及控制器HD61202的接口时序波形,可查看图形液晶显示器产品有关手册。

  MGLS12864 与W78E58 单片机接口电路如图1 所示。该图采用直接访问方式,单片机通过低位地址A2控制CSA;A3 控制CSB,以选通液晶显示屏上各区的控制器HD61202;同时W78E58 用地址A1 作为R/W 信号控制数据总线的数据流向;用地址A0 作为D/I 信号控制寄存器的选择;E 信号由W78E58 的读信号/RD 和写信号/WR 合成产生;另外单片机的复位脚(9 脚)经反相器后连接到液晶显示器复位脚(17 脚/RST),当单片机上电复位或手动复位时, 液晶显示器同时也复位;从而实现了W78E58 对内置HD61202图形液晶显示器模块的电路连接。电路中LCD 电源控制端VO 是用来调节显示屏灰度的,调节该端的电压,可改变显示屏字符、图形的颜色深浅。

  单片机对液晶显示模块的 *** 作可分为两部分,即左半屏和右半屏 *** 作。下面是根据图1 的连接确定对应左半屏(前64×64)和右半屏(后64×64) *** 作地址:

  CWADR1 EQU 0004H 左半屏写指令代码地址

  DWADR1 EQU 0005H 左半屏写显示数据地址

  CRADR1 EQU 0006H 左半屏读状态字地址

  DRADR1 EQU 0007H 左半屏读显示数据地址

  CWADR2 EQU 0008H 右半屏写指令代码地址

  DWADR2 EQU 0009H 右半屏写显示数据地址

  CRADR2 EQU 000AH 右半屏读状态字地

  DRADR2 EQU 000BH 右半屏读显示数据地址

  液晶显示与单片机的接口与编程方法,MGLS12864 与W78E58 接口图,第2张

  图1 MGLS12864 与W78E58 接口图

  软件设计

  液晶控制器HD61202 一共有七条指令,从作用上可分为两类,显示状态设置指令和数据读/写 *** 作指令。详见指令系统可查看图形液晶显示器产品有关手册。显示起始行设置中L5~L0 为显示起始行的地址,取值在0-3FH(1-64 行)范围内。页面地址设置中P2-P0 为选择的页面地址,取值范围为0-7H,代表1-8 页。列地址设置中C5-C0 为Y地址计数器的内容,取值在0-3FH(1-64 行)范围内。

  显示器上128 点×64 点,每8点为一字节数据,都对应着显示数据RAM(在HD61202 芯片内),一点对应一个bit,计算机写入或读出显示存储器的数据代表显示屏上某一点列上的垂直8 点行的数据。D0 代表最上一行的点数据,D1 为第二行的点数据,……。,D7 为第八行的点数据。该bit=1 时该点则显示黑点出来,该bit=0 时该点则消失。另外LCD 指令中有-条display ON/OFF 指令,display ON 时显示RAM 数据对应显示的画面;display OFF 则画面消失,RAM 中显示数据仍存在。

  点阵字模文件的建立

  :由于MGLS12864 液晶显示器没有内部字符发生器,所以在屏幕上显示的任何字符、

  汉字等须自己建立点阵字模库,然后均按图形方式进行显示。由于HD61202 显示存储器的特性,不能将计算机内的汉字库和其它字模库提出直接使用,需要将其旋转90 度后再写入。点阵字模库建立包括以下几个方面:

  (1) 建立8×16 点阵常用字符、数字、符号字模库。

  可选用计算机BIOS 中ASCII 的8×16 字模库,所有字符按照ASCII 值从小到大升序排列。

  asm{mov ax,1130h /*AH=11h—功能调用。装入字库至软字库 */

  mov bh,6 /*AL=30h 取点阵信息 */

  int 10h /*BH=6 取ROM8X16 点阵指针(VGA) */

  mov ax,es /*出口:ES:BP 指向字库指针 */

  mov ascii_es,ax

  mov ax,bp

  mov ascii_bp,ax };

  ascii_offset=ascii_bp+16*asciicode;

  for(j=0;j《16;j++) buf[j]=peekb(ascii_es,ascii_offset+j); /*读16 字节点阵数据*/

  for(m=0;m《16;m++) /*点阵数据转换成LCD 格式数据*/

  { if(m《8) { beginbyte= 7; shiftn=“7”;}

  else { beginbyte=“15”; shiftn=“15”;}

  for(j=0;j《8;j++)

  ascii8x16[m]=(ascii8x16[m]+ (buf[beginbyte-j]》》(shiftn-m))&0x01)《《1;

  } 也可选用UCDOS 的ASC16 文件做字模库。ASC16 文件的字符为8×16 点阵。所有字符按照ASCII 值从小到大升序排列。计算字符首地址的公式:字符首地址=字符的ASCII 码值×16+字模库首地址。

  (2) 建立所用到的16×16 点阵字模库。汉字字符可选用UCDOS 的HZK16 文件做字模库。HZK16 文件的字符为16×16 点阵。所有字符按照区位码从小到大升序排列。计算汉字字符首地址的公式如下:汉字首地址=((区码-1)×94+位码-1)×32。作者用C 语言编写的读取UCDOS 点阵字库字模程序,完成字模读取、

  数据重新排列,并按MCS-51 汇编程序的要求写成相应格式的文本文件。

  p=((quma-1)*94+weima-1)*32;

  cclibfile=“fopen”(“HZK16

  ”,“rb”);

  fseek(cclibfile,(long)p,SEEK_SET);

  fread(buf,sizeof(unsigned char),32,cclibfile); /*读32 字节点阵数据*/

  for(m=0;m《32;m++){ /*点阵数据转换成LCD 格式数据*/

  if(m《8) { beginbyte=“14”; shiftn=“7”;}

  else if( m》= 8 && m《16 ) { beginbyte=“15”; shiftn=“15”;}

  else if( m》=16 && m《24 ) { beginbyte=“30”; shiftn=“23”;}

  else { beginbyte=“31”; shiftn=“31”;}

  for(j=0;j《8;j++)

  hzk16x16[m]=(hzk16x16[m]+ (buf[beginbyte-2*j] 》》(shiftn-m))&0x01)《《1;

  }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2527535.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-05
下一篇 2022-08-05

发表评论

登录后才能评论

评论列表(0条)

保存