LCD显示模块并行接口驱动程序设计(1)———LCD显示模块并行接口驱动程序设计(1)

0 引 言
    人们在日常生活中,LCD占有很大的地位。人们使用的电脑、手机、车载系统、各种测量设备、显示设备等等,都把LCD作为重要的人机接口,它把使用者需要的信息及时反应出来。目前市场上存在着各种LCD和相对应的驱动模块,驱动模块所带的驱动程序都是针对本身模块开发的,各种驱动程序之间通用性差,而且在不同的平台上很难移植。每换一种LCD产品,都要根据它的驱动模块重写驱动程序。这样产品开发资源浪费,开发周期长,成本增加。本文将介绍一种LCD图形液晶驱动器的使用方法以及程序裁剪、移植和扩展,实现在任意坐标上显示图形和汉字。这款驱动器不带字库,对需要显示的汉字和字母通过字模产生器产生数据,通过程序设计把字体在LCD通过描点描述出来(本文所用的字模采用阳码)。


1 典型图形LCD驱动器NHC_313简介
1.1 驱动器简介
    NHC_313驱动器驱动最大点阵数为640(列)×480(行),显示颜色为65536色(16位色)。本文所用的LCD为SHARP公司产品,产品型号为LQ104V1DG52。NHC_313有8位复用并行接口一数据总线和控制总线。MCU可以通过总线对LCD进行操作,随时写显示存储器,而不影响显示效果,即显示不会出现“雪花”。NHC_313内部有两页显示缓存,使用人员可以让一页缓存的数据在LCD上显示出来,同时可以对第二页的缓存进行操作。此驱动器与微处理器接口连接简单,接口的读、写操作兼容8031总线时序。这款驱动器只是单纯的图形图像显示,没有内置字库、图形库。如果设计人员要显示汉字,必须要把需要的汉字用字模生成器产生字模的16进制文件,然后通过程序控制把需要的字体逐一描到LCD上。驱动器的控制引脚如下:
    WR:数据写入,低电平有效
    CS:片选端,低电平有效
    A0:地址信号线0
    A1:地址信号线1
    DB0~DB7:数据总线
    对NHC_313读写的时候采用8031时序,如图1为NHC_313接口电路8031时序图,在表1中列出了接口的时序特征参数。

    当驱动器与8051等I/O口读写速度不是很快的MCU连接时,I/O的特性其本上可以满足表1的时序特征参数,图2给出的是MCU和驱动器无缝连接的接口电路,这种方法是采用IO模拟时序的时候用到的引脚(不止局限于图中列出的引脚),本文建议采用I/O口模拟时序的方法控制驱动器。要注意的是如果I/O的读写速度过快则不能满足接口时序特性参数。例如采用Silab公司的C8051F340作为NHC_313的MCU,由于C8051F340的内部晶振为48MHz,I/O读写速度不能很好满足时序特性(写周期不能满足),所以在程序设汁中会看到有延时程序。而Atmel 8051系列单片机I/O可以满足表1的时序参数特性,不需要加入延时程序。

    表2为驱动器命令,由于显示的像素点数为640(列)×480(行),对于8位的I/O不能一次的把行和列的信息完全表示出来,由此设置了行列的高低地址(8位地址线只能表示0~255的地址信息)。

 

 

 

    对驱动器进行写操作要遵循以下规律:
    a)设定显示页和操作页地址(A1=A0=1,CS=0,WR=0)

    D1-D0设定列地址高字节;D2设定行地址高字节。开机时先执行此操作再执行其他操作。
    b)写行地址低字节。(A1=0,A0=1)
    c)写列地址低字节字节。(A1=1,A0=0)
    d)连续写两次8位字节对应一个像素点颜色(A1=0,A0=0)。第一个字节:

    R4、R3、R2、R1、R0表示红色灰度;G5、G4、G3、G2、G1、G0表示绿色灰度;B4、B3、B2、B1、B0表示蓝色灰度。如在同一行内连续写数据不用每次重写行坐标和列坐标,每一次“写数据”操作后列地址自动加1,即每写两个字节显示数据列地址自动加1。
1.2 关于液晶屏的简单说明
    本文中的液晶显示器显示的颜色数量为65536种一16位色,对一个像素点所要显示的颜色需要用两个字节的数据来表示。需要注意的是,LCD的坐标系同数学上的坐标系有所不同,LCD的坐标系如图3所示。

    坐标系上的点和LCD的像素点是一一对应的,每一个像素点用坐标系的横纵坐标唯一标识。由于八位的数据线只能表示0~255的范围,所以把LCD分割成了图3中的几个区域,这些区域保证了横纵坐标范围在0~255之内,通过设置行列高低地址选择所要显示的区域。每个区域独立为一个小的坐标系,如图3中的F区域所示,区域中的点用这个小坐标系的坐标唯一表示。例如在选择LCD上点(630,420),通过整体坐标轴把这个点定位到F区,通过简单的计算得知此点在F区域坐标下的新坐标值为(118,108)。选择区域的过程就是设置行列高低地址的过程,也可以理解为地址的写入为先写如高地址,后写入低地址,且地址的长度为11位,最高位为行列地址选择位。为了方便理解和使用,本文把地址用区域来表示。例如选择F区域,执行操作:A1=A0=1,CS=0,WR=0,然后向控制器写入D2D1D0=110。