【点阵液晶编程连载二】LCD 驱动的基本流程

2. LCD 驱动的基本流程


    介绍基本的流程控制方法,这里重在介绍方法,从时序的模拟或者是总线的连接,到利用LCD 的特性来做一些显示的处理,如单色液晶如何显示一个点,彩色LCD 如何显示一个点的关系;操作地址与LCD 上点的对应关系;LCD 控制器的特性,如指针自动加/减特性如何利用、滚屏特性如何利用、COM 和SEG 扫描正相反相的特性利用等等~~~~~

2.1. LCD 模块的连接


    在很多资料以及书籍当中,通常介绍有两种LCD 模块的连接方法:直接控制和间接控制;直接控制实际指的是LCD 模块的总线接口直接与MCU 端口连接,然后MCU 通过程序控制端口来模拟LCD 的总线时序来完成对其的控制操作;而间接控制指的是MCU 本身就有外部总线拉出,与LCD 的总线接口对应的连接上,程序中直接操作总线以控制LCD。

    目前有很多MCU 都把总线藏着掖着了,都没有引出外部总线;所以通常在用MCU 控制LCD模块时,时常会选择直接控制的方式,即利用端口来模拟总线时序;当然了,如果本身就有总线而且也与LCD 模块的总线配得上的话,肯定会使用总线连接的间控方式。

    MzL02 LCD 模块的总线接口为6800 总线,这与绝大部分引出外部总线的MCU 的时序是不一样的,再说了本身就有那么多的MCU 连总线都没有外拉,所以,在这里将采用端口模拟总线的方式对LCD 模块进行控制。

    采用端口模拟时序的方式控制LCD 模块时,端口的连接非常简单也有很大的自由度;一般来说,会选择8 个(跟总线宽度相同的个数)连续的端口作为数据端口与LCD 模块的数据端口连接,而其它的如CS、RS(A0)、RESET(RST)、WR、EP 之类的引脚连接时就比较随意了,视具体情况而定。当然,有的LCD 模块还有其它的一些引脚需要连接,不过如前面所述,跟这里所介绍的编写驱动程序的关系不大,就不作说明了,可以直接参考LCD 模
块的文档介绍的连接即可。

    下图就为MCS51 与MzL02 LCD 的连接电路图,采用直控的端口模拟时序的方式。

 


【点阵液晶编程连载二】LCD 驱动的基本流程  - zjf30366 - 小猴的博客此主题相关图片如下61mcu102701.jpg:

【点阵液晶编程连载二】LCD 驱动的基本流程  - zjf30366 - 小猴的博客

注:此图仅供参考,可能与有的资料上不太一样,注意一下JP2 是指MzL02 模块上的FPC20的接线座。

 

2.2. 控制LCD 模块显示一个点

    点阵LCD 的特点就是以点的形式呈现用户想要显示的图形,故点阵LCD 又有称之为图形点阵LCD;通常在编写一个LCD 模块的驱动程序时,最基本的功能是绘制一个具体指定点,只有在这样的功能的基础之上,才能通过各个点的组合,呈现出点阵的图形。

    其实,绘制一个指定位置的点,也就是将显存当中的对应该点的数据位进行操作;在前面的LCD 显示RAM 区映射介绍当中,可以得知显存当中的数据与LCD 屏幕上的点的对应关系,这样就可以在程序当中通过简单的换算而有序的控制LCD 屏上的点的显示了。

    比如,在MzL02 模块当中,要将坐标位置(0,0)的点点亮时该点对应显存的情况分析如下:

    坐标为(0,0)的点我们定义其位于屏幕正向面对我们时的左上角的点,根据前面介绍的内容,可以行知,该点对应为Page0 的第一个byte 数据上,而且准确的位置是对应在这个byte数据的第0 位(bit0)上。

    如此以来,就可以对显存当中行地址(Page)为0,列地址为1(前面寄存器的介绍当中已注明,第0、129、130、131 列在屏中没有对应的点,所以列地址为1 时正是屏上点的最左边一列)的显存写入0x01 的数据以点亮程序中坐标点(0,0)的点。

    如下图所示意。


【点阵液晶编程连载二】LCD 驱动的基本流程  - zjf30366 - 小猴的博客此主题相关图片如下61mcu102702.jpg:

【点阵液晶编程连载二】LCD 驱动的基本流程  - zjf30366 - 小猴的博客

    了解在LCD 屏上绘点的基本原则,就可以灵活的应用于不同的显示操作了,比如:在Page0 上的第0、1、2、3、4、5、6 列分别填入数据:0x00,0x24,024,0x24,0x24,0x24,0x00后,可以在屏上显示出字符:“=”,如下图显示。实际上就相当于在Page0 的第0 列起始显示了一个8*7(高8 点、宽7 点)的字符。

 


【点阵液晶编程连载二】LCD 驱动的基本流程  - zjf30366 - 小猴的博客此主题相关图片如下61mcu102703.jpg:

 【点阵液晶编程连载二】LCD 驱动的基本流程  - zjf30366 - 小猴的博客

    上面所讲的方法是很多人在编写LCD 的驱动程序时采用的直接填充方式的字符显示方法,不过,这种方法显示字符,在这种单色的LCD 模块当中是不可以实现任意位置显示字符的。

    故本书所介绍的字符显示方法并没有采用这样的方法,在接下来的介绍当中会有详细的叙述。

    再返回到绘点原理上,这里,建议采用“读—改—写”的方式来完成一个点的显示,即实现本书所介绍的驱动程序架构的最基本的绘图子函数:绘点函数。

    实际上,“读—改—写”的绘点方式在单色的点阵LCD 模块驱动程序当中的思想就是:从要绘制的点所在的显存byte 读回原来LCD 屏上显示的点所对应的一个byte 数据,然后针对要绘制的点所在该byte 的实际bit 位置,改变该bit 的数据(无非就是0 或者1)而保留该byte的其它bit 数据不变,然后再将改完的byte 数据写回读取它的显存位置。

    例如,在LCD 屏上,已经在坐标(0,0)的位置上有显示了黑点,这时,想在坐标位置(0,4)的点上再绘制一个点;如前面的图所示,该点的所对应的显存数据为0x01,则将其读回,改变该byte 的bit4 值,则数据变为0x11,再将其写回原位置,就可以显示如下图:

 


【点阵液晶编程连载二】LCD 驱动的基本流程  - zjf30366 - 小猴的博客此主题相关图片如下61mcu102704.jpg:

 【点阵液晶编程连载二】LCD 驱动的基本流程  - zjf30366 - 小猴的博客

    依此方法绘制点,就可以具备以下的优点:


1、 任意位置显示点,而不影响该点以外的点的显示;
2、 在此绘点功能的基础上构建的字符显示/图形显示可以实现任意位置的显示;
3、 在此绘点功能的基础上构建的上层绘图、显控程序会很简练、易理解。

    而在彩色的屏幕当中,如256 色屏、16 位色屏之类的,往往与单色的LCD 模块不大一样,也就是点与显存的对应关系上而已,256 色的屏中的一个点对应着显存中的一个byte 数据,16 位色屏当中一个点对应显存中的两个byte 数据;这样在做绘点操作时就简便得多,可以不必将原先数据读回,直接将要在该点显示的颜色数据写入对应的byte 位置即可。


 

2.3. 利用LCD 控制器的特性


    在使用LCD 模块进行显示的控制时,往往都会有些工程师利用LCD 控制器本身所提供的一些特性,以期实现特殊的显示效果。比如实现纵向/横向的滚屏、坐标轴的翻转等,或者是实现不同图层的叠加显示效果等,这些都与LCD 控制器所提供的特性有关,也就是看一下LCD 控制器是否提供了设置这些特性功能的寄存器。


    在MzL02 模块当中,就提供了COM 显示起始行设置的寄存器,该寄存器除了在初始化时定义显示起始行对应的显存RAM 中的哪一行之外,还可以依此实现垂直方向的滚屏显示。而ADC 选择(Segment 方向选择)寄存器以及COM 口扫描方向设置寄存器可以实现坐标轴的变化,即相对用户的坐标轴零点位于左上角还是右下角,或者左下角、右上角。这些寄存器的使用最好可以自己去进行一下简单的实验,才可更深刻的理解它们的作用;一般来说很多寄存器的初始化都会有供货商提供的键议的初始化值,在使用时初始化可以按此来即可,如想了解具体每个寄存器设置的含义最好还是通过实验的方式,这里就不作过多的描述。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值