常用液晶显示模块驱动程序设计引言第1章 绪论1.1 液晶显示器件概述 1.1.1液晶显示器件在显示技术中的地位1.1.2液晶显示器件的优异性能及发展前景1.2 论文选题的意义1.3 本文的主要工作第2章 液晶显示基本原理及应用基础 2.1 液晶显示基本知识 2.2 液晶显示原理 2.3 液晶显示器件的优点2.4 液晶显示驱动原理 2.4.1 静态驱动方法简述 2.4.2 动态驱动方法简述 第3章 液晶显示模块 3.1 液晶显示模块的分类 3.1.1 数显液晶显示模块 3.1.2 点阵字符型液晶显示模块 3.1.3 点阵图形液晶显示模块 3.2 液晶显示控制器的原理 3.2.1 设计特性 3.3 液晶显示控制器的应用 第4章 段式液晶显示模块的原理及应用4.1 段式液晶显示模块LCM061A简介4.1.1 段式液晶显示模块LCM061A的基本功能4.1.2 段式液晶显示模块LCM061A的引脚说明4.1.3 段式液晶显示模块LCM061A指令集…4.2 段式液晶显示模块LCM061A接口方案及论证4.3 段式液晶显示模块LCM061A应用程序设计4.3.1功能程序模块详解4.3.2程序设计流程图第5章 字符型液晶显示模块的原理及应用5.1 字符型液晶显示模块基本特点5.2 字符型液晶显示控制及驱动器HD447805.2.1 HD44780的特点5.2.2 HD44780的硬件工作原理5.2.3 HD44780的指令集5.3 基于HD44780字符型液晶显示器LCM1602的原理及应用5.3.1 字符型液晶显示器LCM1602的原理5.3.2 字符型液晶显示器LCM1602接口方案及论证5.4 字符型液晶显示器LCM1602应用程序设计 5.4.1 程序设计流程图5.4.2 功能程序模块详解第6章 图形式液晶显示模块的原理及应用6.1 图形式液晶显示模块的基本特点6.2 图形式液晶显示控制及驱动器HD612026.2.1 HD61202的特点6.2.2 HD61202硬件工作原理6.2.3 HD61202的硬件工作原理 6.2.4 HD61202的指令集6.3 基于HD61202图形式液晶显示器LGM12864应用6.3.1 图形式液晶显示器LGM12864原理6.3.2 图形式液晶显示器LGM12864接口方案及论证6.4 图形式液晶显示器LG12864应用程序设计6.4.1 功能程序模块详解6.4.2 程序设计流程图第7章 仿真总结致谢 参考文献附录A HD44780的内部字符集附录B程序清单附录C 芯片引脚图【摘要】由于液晶显示模块特殊的连接方式和所需的专用设备并非人人了解,因此虽然它已应用广泛,但用户在使用、装配时感到困难。为了用户使用方便,需将液晶显示器件与控制、驱动集成电路装在一起,形成一个功能部件。而驱动程序是使这个功能部件稳定有序工作,准确实现显示的重要环节。本设计在分别介绍了分段式、点阵图形、点阵字符型液晶显示模块的芯片功能及其应用原理的基础上,主要针对一些常用液晶显示模块的典型代表系列设计其与单片机的接口电路和驱动程序。【关键词】 液晶显示模块;驱动控制器;单片机;驱动程序;点阵 Commonly used liquid crystal display module design-driven process 【Abstract】 LCD module due to special connections and special equipment is not required for everyone to understand, so even though it is already widely used, but users in the use of, the assembly found it difficult. To the user ease of use, the need for liquid crystal display devices and control, driver integrated circuits mounted together to form a feature. The driver's role is to make this feature to work stable and orderly, accurate display. The design introduced in the sub-style, dot-matrix graphics, dot matrix character LCD module and its application of the chip functions based on the principle, mainly for some commonly used liquid crystal display module of a typical representative of the design series with SCM interface circuit and driver. Key words: liquid crystal display module; drive controller; singlechip; driver; lattice452
常用液晶显示模块驱动程序设计引 言液晶显示器件(LCD)是一种高新技术的基础元器件。它利用液晶的各种电光效应,把液晶对电场、磁场、光线和温度等外界条件的变化在一定条件下转换为可视信号而制成的显示器。虽然其应用已很广泛,但对很多人来说,使用、装配时仍感到困难。特别是点阵型液晶显示器件,使用者更是会感到无从下手。特殊的连接方式和所需的专用设备也非人人了解和具备,故此液晶显示器件的用户希望有人代劳,将液晶显示器件与控制、驱动集成电路装在一起,形成一个功能部件,用户只需用传统工艺即可将其装配成一个整机系统。而驱动程序是使这个功能部件稳定有序工作,准确实现显示的重要环节。随着模块的标准化,用户在选择和使用过程中只关心模块的接口,对于模块的设计和构造以及在使用中出现的因为模块设计原因产生的问题并不了解。本文通过对常用液晶显示模块的结构和显示、驱动原理进行详细介绍。并针对一些常用液晶显示模块的典型代表系列设计其与单片机的接口电路和驱动程序。使读者可以较为全面地掌握液晶显示驱动控制的原理。
第1章 绪论1.1 液晶显示器介绍液晶显示器件[1](LCD)是一种高新技术的基础元器件。它利用液晶的各种电光效应,把液晶对电场、磁场、光线和温度等外界条件的变化在一定条件下转换为可视信号而制成的显示器。液晶显示器具有低电压、低功耗的特点,与CMOS集成电路相匹配.电池作为电源,适合于便携式显示。STN-LCD是通过电场控制液晶分子的排列从而改变液晶盒内偏振光的双折射效应而实现显示,STN-LCD是目前LCD生产的中档产品,它具有显示信息量大的特点,主要应用于各种仪器仪表、手机、PDA、笔记本电脑等。液晶显示器还具有易彩色化,非发光式被动显示的特点。彩色液晶显示是利用液晶的光阀特性和彩色滤光膜及三基色灯来实现的,现有技术容易制造彩色滤光膜和三基色灯。还有液晶显示靠调制外界光来实现的,显示体本身不发光,不刺激眼睛,不易疲劳等优点。利用液晶光阀特性容易实现投影大屏幕显示。因而,液晶显示应用几乎覆盖所有显示应用领域。液晶显示模块是一种将液晶显示器件、连接件(斑马条、斑马纸或金属管脚等)、PCB线路板、液晶显示控制器、行列驱动控制器、负压发生器、偏置电路、温度补偿电路、背光源、背光源驱动控制电路、结构件(框架或模具)等装配在一起的组件。1.2 液晶显示发展历史、现状和趋势作为液晶最重要的一种应用,液晶显示伴随液晶的诞生经历了漫长的发展道路[2]。早在1888—1889年,奥地利植物学家F.Reinitzer与和德国物理学家共同发现了第一种液晶材料.20世纪20年代人们就已经合成出300多种液晶,并完成了至今还应用的近晶相、向列相和胆甾相的液晶分类。从30年代开始,众多物理学家展开了液晶物理特性的研究,首次揭示了液晶的各向异性特性以及在外场作用下向列相变形及其阈值特性.这些工作为液晶显示的应用研究奠定了良好的基础.60年代中期美国首先发现液晶显示原理,1968年公开在刊物上发表向列相液晶动态散射显示原理和显示样机。第一台成型的液晶显示媒体出现在1971年,这就是最初的TN-LCD(扭曲向列液晶显示器),80年代初TN-LCD商品大量上市,主要被用作手表、时钟、电子计算机、电话、传真机及一般家电品的数字显示,目前简单矩阵驱动的TN型产品以小尺寸黑白文字显示类LCD为主。1984年欧美提出了STN-LCD超扭曲向列液晶显示器),同时也提出了TFT-LCD(薄膜晶体管液晶显示器)技术,但在那时还不够成熟。80年代末,日本掌握了STN-LCD的大规模生产技术,LCD工业开始飞跃发展。1993年日本又掌握了TFT-LCD生产技术,液晶显示器开始一方面向廉价、低成本的方向发展,随后DSTN-LCD(双层超扭曲向列)诞生;另一方面向高端的薄膜晶体管TFT-LCD发展。1997年,日本成了一大批以550mm×700mm为代表的大基板尺寸第三代TFT-LCD生产线。在此期间,韩国和台湾也开始介入液晶显示器生产领域,我国内地企业引进生产线,生产TN-LCD.我国于1969年开始研究液晶显示,但规模生产起步较晚。目前我国虽然是世界上最大的TN-LCD生产国,在原材料技术和生产工艺技术上已落后一步。而东亚地区,逐渐发展成为世界液晶显示器的主要生产地,日本、韩国和我国台湾则走在了最前列。近年,随着中国大陆改革开放的深入和加入WTO,日本、韩国和我国台湾己经将大部分STN的生产线和部分TFT生产线向中国大陆转移,中国大陆已经陆续投产几条较为先进的TFT生产线。但生产工艺、技术和部分原材料的专利仍掌握在日本或其它少数国家手中,这是中国大陆LCD产业发展的不利因素。1.3 论文选题的意义液晶显示器件是一种高新技术的基础元器件,虽然其应用已很广泛,但对很多人来说,使用、装配时仍感到困难。特别是点阵型液晶显示器件,使用者更是会感到无从下手。特殊的连接方式和所需的专用设备也非人人了解和具备,故此液晶显示器件的用户希望有人代劳,将液晶显示器件与控制、驱动集成电路装在一起,形成一个功能部件,用户只需用传统工艺即可将其装配成一个整机系统。随着模块的标准化,用户在选择和使用过程中只关心模块的接口,对于模块的设计和构造以及在使用中出现的因为模块设计原因产生的问题并不了解。本文通过对常用液晶显示模块的几个典型,介绍液晶显示模块的结构和显示、驱动原理。使读者可以较为全面地掌握液晶显示驱动控制的原理。1.4 本文的主要工作本文的任务是针对一些常用液晶显示模块的典型代表系列设计其与单片机的接口电路和驱动程序。本文的主要工作如下: (1)在方案论证的基础上,确定整体设计方案和设备选型。 (2)基于一些常用液晶显示模块的典型代表系列设计其与单片机的接口电路和驱动程序(包括段式、点阵字符型、点阵图形式)。 (3)选取上述各系列的内置式驱动控制器设计流程图、应用程序。 (4)针对所选取的液晶显示模块和驱动控制器设计接口电路、驱动程序、流程图、应用程序,并提供较为详细使用说明清单。(使用者只需按要求提供相应入口参数即可) (5)软件设计清单。 (6)进行硬件、软件调试,并对调试结果进行分析。必要的技术分析和说明,并对设计结果进行分析。第2章 液晶显示基本原理及应用基础2.1 液晶显示基本知识液晶显示器(LCD/Liquid Crystal Display)的显像原理,是将液晶置于两片导电玻璃之间,靠两个电极间电场的驱动引起液晶分子扭曲向列的电场效应,以控制光源透射或遮蔽功能,在电源开关之间产生明暗而将影像显示出来,若加上彩色滤光片,则可显示彩色影像。液晶的物理特性是:当通电时导通,排列变的有秩序,使光线容易通过;不通电时排列混乱,阻止光线通过。让液晶如闸门般地阻隔或让光线穿透。从技术上简单地说,液晶面板包含了两片相当精致的无钠玻璃素材,称为Substrates,中间夹着一层液晶。当光束通过这层液晶时,液晶本身会排排站立或扭转呈不规则状,因而阻隔或使光束顺利通过。大多数液晶都属于有机复合物,由长棒状的分子构成。在自然状态下,这些棒状分子的长轴大致平行。将液晶倒入一个经精良加工的开槽平面,液晶分子会顺着槽排列,所以假如那些槽非常平行,则各分子也是完全平行的。2.2 液晶显示原理LCD技术是把液晶灌入两个列有细槽的平面之间。这两个平面上的槽互相(相交成90度)。也就是说,若一个平面上的分子南北向排列,则另一平面上的分子东西向排列,而位于两个平面之间的分子被强迫进入一种90度扭转的状态。由于光线顺着分子的排列方向传播,所以光线经过液晶时也被扭转90度。但当液晶上加一个电压时,分子便会重新垂直排列,使光线能直射出去,而不发生任何扭转。LCD是依赖极化滤光器(片)和光线本身。自然光线是朝四面八方随机发散的。极化滤光器实际是一系列越来越细的平行线。这些线形成一张网,阻断不与这些线平行的所有光线。极化滤光器的线正好与第一个垂直,所以能完全阻断那些已经极化的光线。只有两个滤光器的线完全平行,或者光线本身已扭转到与第二个极化滤光器相匹配,光线才得以穿透。液晶显示原理[3]如图2.1所示,在两片玻璃基板上装有配向膜,所以液晶会沿着沟槽配向,由于玻璃基板配向膜沟槽偏离90度,所以液晶分子成为扭转型,当玻璃基板没有加入电场时,光线透过偏光板跟着液晶做90度扭转,通过下方偏光板,液晶面板显示白色(如图(a));当玻璃基板加入电场时,液晶分子产生配列变化,光线通过液晶分子空隙维持原方向,被下方偏光板遮蔽,光线被吸收无法透出,液晶面板显示黑色(如图(b)示)。液晶显示器便是根据此电压有无,使面板达到显示效果。 图2.1 液晶配列显示原理图(a)液晶面板显示白色 (b)液晶面板显示黑色利用液晶的各种光电效应,把液晶对电场、磁场、光线和温度等外界条件的变化在一定条件下转换成为可视信号就可以制成显示器,这就是液晶显示器件。2.3 液晶显示器件的优点信息显示技术随着信息社会的发展而变得越来越重要,在信息显示技术中,液晶显示器件与其他类型的显示器相比较有如下优点[2]:(1)平面型显示,体积小,重量轻,便于携带;(2)驱动电压低,功耗小;(3)工作寿命长,可在5万小时以上;(4)不含有害射线,对长期在液晶显示器件周围工作的人体健康无危害;(5)被动显示,不易被强光冲刷,外界光越强则显示越清晰,可以在明亮的环境下显示;(6)易于驱动,能用大规模集成电路直接驱动,电路接口简单;(7)结构简单,没有复杂的机械部分等。2.4 液晶显示驱动原理从电子学角度简述液晶显示器件的显示原理为[3]:在外加电场的作用下具有偶极矩的液晶棒状分子在排列状态上发生变化,使得通过液晶显示器件的光被调制,从而呈现明与暗或透过与不透过的显示效果。液晶显示器件中的每个显示像素都可以单独被电场控制,不同的显示像素按照驱动信号的“指挥”在显示屏上合成各种字符,数字及图形。液晶显示驱动功能就是建立这种电场。液晶的显示效果是由于在显示像素上施加了电场的缘故,而这个电场则由显示像素前后两电极上的电位信号差所产生。在显示像素上建立直流电池是非常容易的事,但直流电场将导致液晶材料的化学反应和电极老化,从而迅速降低液晶材料的寿命,因此必须建立交流驱动电场,并要求在这个交流电场中的直流分量越小越好,通常要求直流分量小于50mV。由此要求液晶显示驱动器的驱动输出必须是交流驱动。现在液晶显示驱动器是全数字化集成电路,所以这种交流驱动是以脉冲电压形式产生的。液晶显示像素上交流电场的强弱用交流电场的有效值表示,当有效值大于液晶的ICJ值电压时,像素产生电光效应,呈显示状态;当有效值在阀值电压附近时,液晶将呈现较弱的电光效应,此态将会影响液晶显示器件的显示对比度。因此液晶显示驱动器要能够控制驱动输出的电压幅值,以实现对显示对比度的控制。液晶显示驱动器通过对其输出到液晶显示器件电极上的电位信号进行相位、峰值、频率等参的调制来建立交流驱动电场,以实现液晶显示器件的显示效果。液晶显示的驱动方式有许多,常用于液晶显示器件上的驱动方法有静态驱动和动态驱动两种[4].2.4.1 静态驱动方法简述静态驱动(Static Drive)主要用于位数很少(12位以下)的数字显示或固定文字(图形)显示。在数字显示时常采用笔段电极结构。每位数由一个“8”字形公共电极和构成“8”字形图案的笔段形电极组成,分别设置在两块基板上。根据显示数字的位数,可在两基板上形成相应数量的电极组,每组电极可显示0-9的任意数字。这种数字显示方式广泛用于手表、计算器以及计测仪器等。静态驱动就是在所显示数字的各笔段电极和共用电极之间,同时而连续地施加上驱动电压,直到显示时间结束。由于在显示时间内驱动电压一直保持,故称作静态驱动。要实现静态驱动,各段形电极和公电极必须设置各自独立的驱动电路。静态驱动的特点及缺点:静态驱动有这样两个特点:(1)各电极的驱动相互独立,互不影响;(2)在显示期间,驱动电压一直保持,使液晶充分驱动。因为静态驱动与下面介绍的时间分割驱动相比,具有对比度好,亮度高,响应快等优点。但静态驱动的缺点是每个段形电极需要一个控制元件,一旦显示数字的位数很多时,相应的驱动元件数和引线端子数太多,因而他的应用受到限制,只适合于
常用液晶显示模块驱动程序设计位数很少的笔段电极显示。2.4.2 动态驱动方法简介当液晶显示器件上显示像素众多时,如点阵型液晶显示器件,若使用静态驱动结构将会产生众多的引脚以及庞大的硬件驱动电路,这是不易实施的。为了解决这个问题,在液晶显示器件电极的制作与排布上做了加工,实施了矩阵型结构,即把水平一组显示像素的背电极连在一起引出,称之为行电极,又称公共极,用COM符号表示;把纵向一组显示像素的段电极连在一起引出,称之为段电极,又称列电极,用SEG或COL符号表示。每个液晶显示像素都由其所在的行与列的位置唯一确定。在驱动方式上采用了类同于CRT的光栅逐行扫描方法,叫做动态驱动法,或称为多路寻址驱动法。动态驱动方法简述:液晶显示的动态驱动法是循环地给每行电极施加选择脉冲,同时所有列电极给出该行像素的选择或非选择的驱动脉冲,从而实现某行所有显示像素的驱动。这种行扫描是逐行顺序进行的,循环周很短,使得液晶显示屏上呈现稳定的图像效果。我们把液晶显示的扫描驱动方式称为动态驱动法,亦称多路寻址驱动法。在一帧中每一行的选择时间是均等的。假设一帧的扫描行数为N,扫描一帧的时间为1,那么一行所占有的选择时间为1/N,该值被称为占空比系数。在同等电压下,扫描行数的增多将使占空比下降,从而引起液晶像素上的变电场电压的有效值下降,降低了显示质量。因此随着显示像素的增多,为了保证显示质量,就需要适度地提高驱动电压以提高电场的电压有效值或采用双屏电极排布结构以提高占空比系数。在动态驱动方式下,某一液晶像素(选择点)呈显示效果是由施加在行电极上的选择电压与施加在列电极上的选择电压的合成来实现的。与该像素不在同一行和同一列的像素(非选点)都处在非选状态下,与该像素在同一行或同一列的像素均有选择电压加入,称之为半选择点。该点的电场电压处于液晶的阀值电压附近时,屏上将出现不应有的半显示现象,使得显示对比度下降,这种现象叫做“交叉效应”。在动态驱动方法中解决“交叉效应”的方法是平均电压法,即把液晶的驱动电压等分成若干挡,如a挡。适当地提高非选择点的电压,如1/a倍差于选择电压,从而降低半选点上两电极的电压差。这种方法称谓偏压法。动态驱动法加入了偏压法使其更加完美,它广泛应用于点阵型液晶显示器件和多路结构液晶显示器件的驱动上。当扫描行数N=1时,动态驱动就等于静态驱动。由于静态驱动没有交叉效应,所以也就没有偏压法的介入。 第3 章 液晶显示模块液晶显示模块是一种将液晶显示器件、连接件、集成电路、PCB线路板、背光源、结构件装配在一起的组件,英文名称叫“LCD Module”。 液晶显示器是一种低功耗显示器件,具有显示内容丰富、体积小、重量轻、安全省电等优点,在万用表、袖珍式仪表和低功耗微机应用系统中得到广泛使用。同时,由于液晶显示器件是一种高新技术的基础元器件,为了方便使用,厂家将液晶显示器件、连接件、集成电路、PCB线路板、背光源、结构件装配在一起形成液晶显示模块。不同的液晶显示模块其显示性能和显示控制上是有较大区别,应用中应根据不同的显示要求进行灵活选取。[5]实际系统设计中,经常用到各种不同液晶显示模块。本设计研究各种典型的液晶显示模块的电路特性和控制要求,在此基础上设计程序。 3.1 液晶显示模块的分类根据液晶显示器件的显示方式,可以把液晶显示模块分为三类:数显(字段式)液晶显示模块,点阵字符型液晶显示模块,点阵图形液晶显示模块。下面分别介绍这三种类型液晶显示模块。3.1.1 数显液晶显示模块这是一种由段型液晶显示器件与专用的集成电路组装成一体的功能部件,只能显示数字和一些标识符号。段型液晶显示器件大多应用在便携、袖珍设备上。由于这些设备体积小,所以尽可能不将显示部分设计成单独的部件,即使一些应用领域需要单独的显示组件,那么也应该使其除具有显示功能外,还应具有一些信息接收、处理、存储等功能,由于它们具有某种通用的、特定的功能而受市场的欢迎。(1)计数型液晶显示模块这是一种由不同位数的七段型液晶显示器件与译码驱动器,或再加上计数器装配成的计数显示部件。它具有记录、处理、显示数字的功能。(2)计量型液晶显示模块这是一种由多位段型液晶显示器件和具有译码、驱动、计数、A/D转换功能的集成电路片组装而成的模块。由于所用的集成电路中具有A/D转换功能,所以可以将输入的模拟量电信号转换成数字量显示出来,使用方便。(3)计时型液晶显示模块将一个液晶显示器件与一块计时集成电路装配在一起就是一个功能完整的计时器。它与计数型液晶显示模块外观相似,但显示方式不同,它的数字是由两位一组两位一组的数字组成,而计数型液晶显示模块每位数字均是连续排列的。这类模块可广泛用于家电设备上,如录音机、CD机、微波炉、电饭煲等电器上。3.1.2 点阵字符型液晶显示模块它是由点阵字符型液晶显示器件与专用的行、列驱动器、控制器及必要的连接件、结构件装配而成的,可以显示数字和西方字符。这种点阵字符模块本身具有字符发生器,显示容量大,功能丰富。一般该种模块最少也可以显示8位1行或16位1行的字符。因为点阵排列的像素点间有间隔,所以不能显示图形。3.1.3 点阵图形液晶显示模块它的特点是点阵像素连续排列,行和列排布中均没有空隔。因此可以显示连续、完整的图形。由于它是由X-Y矩阵像素构成的,所以除显示图形外,也可以显示字符,这种模块又分为行列驱动型,行、列驱动—控制型,行、列控制型三大类。(1)行列驱动型这是一种必须外接专用控制器的液晶显示模块,它必须外接控制电路才能与计算机连接。是数量最多,应用最普遍的液晶显示模块。(2)行、列驱动—控制型这是一种可直接与计算机接口,依靠计算机直接控制驱动器。它会占用系统的部分资源。(3)行、列控制型这是一种内藏控制器型的液晶显示模块,使用户摆脱了对控制器设计、加工、制作等一系列工作,又使计算机避免了对显示器的繁琐控制,节约了主机系统的内部资源。3.2 液晶显示控制器的原理虽然液晶显示驱动控制器与驱动集成为一体,简化了液晶显示系统的控制驱动电路,操作简便,但是显示功能和显示规模都受到了限制,控制能力局限于小规模的液晶显示模块。液晶显示控制器将驱动器和显示存储器置于片外,增加了显示存储器的容量,在片内增加了液晶显示的控制功能,从而可以控制中、大规模的液晶显示模块,控制功能也更强。液晶显示控制器原理[6]框图如图2.1所示。 图3.1 液晶显示控制器的原理框图3.2.1 设计特性(1)I/O接口特性液晶显示控制器的接口部分用来接收计算机发来的指令和数据,并向计算机反馈所需的数据信息。接口部分包括两个通道:指令通道和数据通道。两个通道的选择由RS端控制。大多数液晶显示控制器可以适配计算机两种时序的操作,一种为Intel8080操作时序,一种为M6800操作时序。(2)驱动特性驱动部分是液晶显示控制器对液晶显示驱动系统的接口。时序发生器产生基础时钟提供给予显示时钟电路,显示时钟电路产生显示时钟脉冲序列提供给驱动部分。这些时序作为控制脉冲向液晶显示驱动系统输出,也作为显示数据传输的同步信号控制数据传输通道。驱动信号有:FLM—帧信号;CP—数据移位脉冲信号;LP—数据锁存脉冲信号;M—交流驱动波形信号。(3)控制特性液晶显示控制器的控制部分是液晶显示控制器的核心。它通过OSC1和OSC2两端接入晶体振荡器或振荡因子使振荡器产生工作时钟,该时钟脉冲直接提供给时序发生器以生成控制时序和显示时序。控制时序驱动逻辑电路管理和操作各功能电路,显示时序电路生成液晶显示系统所需的驱动时序脉冲序列,并且实现显示数据向液晶显示驱动系统的传送。控制部分还控制着光标发生器的工作。3.3 液晶显示控制器的应用一般来讲,使用液晶显示器件来显示信息,需要液晶材料、相应的驱动系统和控制系统三者的有机结合。对于中小规模的液晶显示器件,通常采用在驱动器直接驱动液晶显示器件的基础上,增加片内控制器,形成有控制器的液晶显示模块,称其为内置控制器的液晶显示模块。另外,为提高控制能力,增加显示功能和显示规模,又可以将控制器和显示存储器置于片外,在片内仅保留驱动系统,形成外配控制器的液晶显示模块。对使用者来讲不管何种液晶显示模块都可以把它作为一个独立的外设或I/O设备来使用,因此,对液晶显示模块的操作问题,都可以简化为液晶显示模块的控制器接口的操作使用问题,即信息显示的问题集中在计算机对液晶显示控制器的接口如何传送信息、传送数据及接收信息等问题上。液晶显示模块的控制器通常是一种专门的IC芯片,都提供了便于和计算机相连接的I/O接口。这样计算机通过对液晶显示控制器的操作,实现了对液晶显示扫描时序的设备、显示数据的写入等参数设置,之后控制器便可以独立控制液晶显示驱动系统,从而避免了计算机在显示上的繁锁工作,完成了对液晶显示器件的操作。 微处理器与液晶显示模块的控制接口有两种方式:直接访问方式和间接访问方式。间接控制方式接口时序由微处理器对控制信号的软件编程来实现。软件编程在对控制信号设置的先后顺序上体现了液晶显示控制器所适配的操作时序。间接访问方式接口电路简单,时序由软件实现,所以不管微处理器本身运算速度高低,都可以方便的利用这种方式连接各种液晶显示控制器以实现对液晶显示模块的操作。
常用液晶显示模块驱动程序设计第4章 段式液晶显示模块的原理及应用 字符式液晶显示器是根据各种需要,将液晶制作成各种数字字形和图案。字符式液晶显示器的字形与图案有的是根据市场需要制作成通用的形式,有的是根据一些厂家定制成专用的形式。一般用在小型设备仪器中,字符式液晶显示器的字形与图案不能随意改变,只能通过控制使其显示或不显示。4.1 段式液晶显示模块LCM061A的简介4.1.1 LCM061A的基本功能LCM061A是6位多功能通用8段式液晶显示模块。内含看门狗,显示RAM,蜂鸣器驱动。与单片机的接口采用3~4线串行接口,工作电压2.4V~5.2V,显示状态下电流仅为50uA左右。LCM061A的外形如图2.0所示。 图4.1 LCM061A的外形4.1.2 LCM061A的引脚说明共有11个引脚,引脚说明如表2.0所示。表4.0 LCM061A引脚说明引脚 符号 说明 输入输出1 CS LCM061A片选,低电平有效 输入2 RD LCM061A读选通信号,低电平有效 输入3 WR LCM061A写选通信号,低电平有效 输出4 DA 数据线 输入/输出5 GND 电压地 输入6 VLCD LCD显示屏工作电压,可调整显示视角 输入7 VDD 正电源,2.4V~5.2V 输入8 IRQ 中断输出,看门狗或定时器输出 输出9 BZ+ 蜂鸣器正输出 输出10 BZ- 蜂鸣器负输出 输出
4.1.3 段式液晶显示模块LCM061A指令集表4.l LCM061A指令集命令码 功能 命令码 功能00H 关闭振荡器,LCV进入低功耗状态 0DH 定时器清零01H 开振荡器 80H 不允许定时器/看门狗输出02H 关LCD 88H 允许定时器/看门狗输出03H 开LCD 18H 定义RC方式工作08H 开蜂鸣器 A0H 定时=4s09H 关蜂鸣器 A1H 定时=2s60H 蜂鸣器 A2H 定时=1s40H 蜂鸣器 A3H 定时=0.5s29H 模块专用初始化命令 A4H 定时=0.25s05H 关看门狗 A5H 定时=0.125s07H 开看门狗 A6H 定时=0.0625s04H 关定时器 A7H 定时=0.003125s06H 开定时器 14H 定义晶振方式0EH 看门狗清零
4.2段式液晶显示模块LCM061A接口方案及论证目前国内外很多液晶生产厂家都在生产各种字段式液晶显示器。其字形图案不同,接口方式也不同,但是为了简化接口形式,大多数采用串行接口通信。LCM061A与单片机接口时2线到5线方式,一是WR,RD,DA这三条线与其它芯片不共用并且只读不写时,可将LCM061A的CS端直接接地,可不接,这样可用2线方式。如果还有其它芯片与LCM061A共用,且要使用端,则必须使用5线方式。本例由于只控制一个LCM061A,为简化接口电路,采用LCM061A与MCS-51单片机4线接口,接口电路如图2.1示. 图4.2 LCM061A与MCS-51单片机的接口电路4.3 段式液晶显示模块LCM061A应用程序设计4.3.1程序设计流程图图4.3程序设计流程图
4.3.2功能程序模块详解1.写指令子程序LCD_WRCOM:CLR CSSETB DAT ;写入命令码前缀100,此处为1CLR WRRSETB WRRCLR DAT ;此处为0CLR WRRSETB WRCLR DAT ;此处为0CLR WRRSETB WRMOV R7,#8 ;命令码长度为8位LOOP1: RLC AMOV DAT,CCLR WRRSETB WRRDJNZ R7,LOOP1;位数据未送完则继续CLR DAT ;反之写入命令码的最后一位0CLR WRRSETB WRRSETB CSSETB DAT ;写完指令码后LCM数据位要至高电平RET2.写数据子程序LCM_DATA: CLR CSSETB DAT ;写入数据码前缀1010,此处为1CLR WRRSETB WRR;;***************SETB DAT ;此处为1CLR WRRSETB WRR;;*****************CLR DAT ;此处为0CLR WRRSETB WR;;*****************MOV R7,#5;地址码长度为5位MOV A,R5;LOOP2: RLC AMOV DAT,CCLR WRRSETB WRDJNZ R7,LOOP2;5位地址未送完则继续MOV R7,#8MOV A,R6LOOP3: RLC AMOV DAT,CCLR WRRSETB WR;**************DJNZ R7,LOOP3;8位数据未送完则继续SETB CSSETB DAT ;写完数据码后LCM数据位DAT要至高电平
常用液晶显示模块驱动程序设计字符型液晶显示模块的原理及应用5.1字符型液晶显示模块基本特点字符型液晶显示模块是由字符型液晶显示屏LCD 、控制驱动主电路HD44780/KS0066及其扩展 驱动电路HD44100或与其兼容的IC, 少量电阻、电容元件结构件等装配在PCB板上而成。 字符型液晶显示模块目前在国际上已经规范化,无论显示屏规格如何变化,其电特性和接口形 式都是统一的。因此只要设计出一种型号的接口电路,在指令设置上稍加改动即可使用各种规格的字符型液晶显示模块,其基本特点如下: 1. 液晶显示屏是以若干个5 8或5 11点阵块组成的显示字符群每个点阵块为一个字符位字符间距和行距都为一个点的宽度 2. 主控制驱动电路为HD44780及其他公司全兼容电路 3. 具有字符发生器ROM可显示192种字符160个5 7点阵字符和32个5 10点阵字符 见附录一 4. 具有64个字节的自定义字符RAM可自定义8个5 8点阵字符或4个5 11点阵字符 5. 具有80个字节的RAM 6. 标准的接口特性适配M6800系列MPU的操作时序 7. 模块结构紧凑轻巧装配容易8. 单+5V电源供电宽温型需要一个7V的驱动电源9. 低功耗长寿命高可靠性5.2字符型液晶显示控制及驱动器HD447805.2.1 HD44780的特点1.具有字符发生器ROM可显示192种字符(160个5×7点阵字符及32个5×11点阵字符)。2.具有64个单元的自定义字符RAM,可定义8个5x7点阵字符或4个5xll点阵字符。3.具有80个单元的显示RAM。4.标准的接口特性,适配M6800系列MPU的操作时序。
5.2.2 HD44780的硬件工作原理字符型LCD液晶显示模块是专用于显示字母、数字、符号等的点阵型液晶显示模块。字符位可以是5*7或5*11等点阵组成。每一个点阵字符位都可以显示一个字符 ,内置HD44780控制IC专用于字符显示的液晶驱动及控制。HD44780的显示缓冲区及用户自定义的字符发生器CGRAM全部内藏在芯片内。HD44780具有简单而功能较强的指令集,可实现字符移动、闪烁等显示功能。HD44780的控制部是液晶显示模块的核心,它控制着HD44780的工作时序和各功能的实现,具有驱动40*16点阵的液晶显示器件的能力。5.2.3 HD44780的指令集表1 清屏RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 0 0 0 1运行时间:1.64 us;功能:清DDRAM和AC值。
表2 归位RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 0 0 1 *运行时间:1.64 us;功能:AC=0 光标,画面回HOME位。
表3 输入方式设置RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 0 1 I/D S运行时间:40us;功能:设置光标画面移动方式;其中I/D= 1 :数据读写操作后AC自动增一;I/D =0 :数据读写操作后AC自动减一;S =1 :数据读写操作画面平移;S =0 :数据读写操作画面不动。
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 1 D C B表4 显示开关控制运行时间:40 us功能:设置显示光标及闪烁开关;其中D表示显示开关,D= 1为开,D =0为关;C表示光标开关,C =1为开,C =0为关;B表示闪烁开关,B= 1为开,B =0为关。
表5 光标画面位移RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 1 S/C R/L * *运行时间:40 us;功能:光标画面移动不影响DDRAM;其中S/C =1:画面平移一个字符位;S/C =0:光标平移一个字符位;R/L= 1 右移,R/L= 0 左移。
表6 功能设置RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 1 DL N F * *运行时间: 40 us;功能:工作方式设置初始化指令。其中DL =1 ,8位数据接口DL= 0 ,4位数据接口;N =1,两行显示N= 0,一行显示;F =1,5 *10点阵字符F =0,5* 7点阵字符。
表7 CGRAM地址设置RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 1 A5 A4 A3 A2 A1 A0运行时间:40 us;功能设置:CGRAM地址A5~A0 =0~3FH。
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 1 A6 A5 A4 A3 A2 A1 A0表8 DDRAM地址设置运行时间:40us;功能设置:DDRAM地址;N= 0 ,一行显示A6~A0= 0~4FH;N =1 ,两行显示首行A6 ~A0 =00H ~2FH ,次行A6~ A0= 40H~ 67H。
表9 读BF及AC值RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0功能读忙BF值和地址计数器AC值其中BF=1:忙;BF= 0:准备好;此时AC值意义为最近一次地址设置CGRAM或DDRAM 定义
表10 写数据RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 0 数 据运行时间:40 us功能:根据最近设置的地址性质数据写入DDRAM或CGRAM内
表11 读数据RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 1 数 据运行时间:40 us功能:根据最近设置的地址性质从DDRAM或CGRAM数据读出
5.3基于HD44780字符型液晶显示器LCM1602的原理及应用5.3.1 字符型液晶显示器LCM1602的简介1.1字符型液晶显示器LCM1602接口特性及时序表12 引脚功能引脚号 符号 状态 功能1 Vss 电源地 2 Vdd +5V逻辑电源 3 V0 液晶驱动电源 4 RS 输入寄存器选择 15 R/W 输入读 写操作选择6 E 输入使能信号 7 DB0 三态数据总线 LSB(数据最低位)8 DB1 三态数据总线 9 DB2 三态数据总线 10 DB3 三态数据总线 11 DB4 三态数据总线 12 DB5 三态数据总线 13 DB6 三态数据总线 14 DB7 三态数据总线 MSB(数据最高位)*15 E1 输入 空管脚/背光输入*16 E2 输入 空管脚/背光输入1.1.1 点阵字符型液晶显示模块电路框图 图5.1点阵字符型液晶显示模块电路框图1.2控制器接口时序说明1.2.1 读操作时序
常用液晶显示模块驱动程序设计5.3.1字符型液晶显示器LM1602的示原理LM1602的内部驱动器为HD44780。HD44780内置了192个常用字符,存于字符产生器CGROM(Character Generator ROM)中,另外还有几个允许用户自定义的字符产生RAM,称为CGRAM(Character Generator RAM)。下图说明了CGROM和CGRAM与字符的对应关系字符码0x00~0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),0x20~0x7F为标准的ASCII码,0xA0~0xFF为日文字符和希腊文字符,其余字符码(0x10~0x1F及0x80~0x9F)没有定义。(由于本指导中未用到自定义特殊字符的功能CGROM的字符号,"地址"指DDRAM的地址)除了CGROM和CGRAM外,LCD内部还有一个DDRAM(Display Data RAM),用于存放待显示内容,LCD控制器的指令系统规定,在送待显示字符代码的指令之前,先要送DDRAM的地址(即待显示的字符显示位置)。16×2的字符型LCD的DDRAM地址与显示位置的对应关系如下: 图5.4 DRAM与显示位置对应图 总而言之,希望在LCD的某一特定位置显示某一特定字符,一般要遵循"先指定地址,后写入内容"的原则;但如果希望在LCD上显示一串连续的字符(如单词等),并不需要每次写字符码之前都指定一次地址,这是因为液晶控制模块中有一个计数器叫地址计数器AC(Address Counter)。地址计数器的作用是负责记录写入DDRAM数据的地址,或从DDRAM读出数据的地址。该计数器的作用不仅仅是"写入"和"读出"地址,它还能根据用户的设定自动进行修改。比如,如果规定地址计数器在"写入DDRAM内容"这一操作完成后自动加1,那么在第1行第1列定写入一个字符后,如果不对字符显示位置(DDRAM地址)重新设置,再写入一个字符,则这个新的字符会出现在第1行第2列。 5.3.2 符型液晶显示器LM1602接口方案及比较 1.1直接控制方式 图5.5直接(总线)控制方式1.2间接控制方式
图5.6接接线(模拟口线)控制方式比较以上两种接口方案可以看到,与直接控制方式相比,间接控制方式使用的辅助器件更少,接线也更简洁,可靠性也相应较高,成本也相对较低,唯一的缺点就是要用较多的软件来弥补硬件上的不足,编程相对复杂。总体上比较,间接控制方式更为方便实用。
5.4 字符型液晶显示器LM1602应用程序 5.4.1程序设计流程图根据上述方案论证,本例接口采用间接控制方式,相应的程序流程图如下:(a) (b) (c)(d) (e)图5.7 LM1602功能子程序流程图5.4.2功能程序模块详解1.初始化子程序INITIAL:MOV A,#00111000B; 设置8位,2行,5*7点阵 LCALL WRITE_COM; 调用写指令子程序 MOV A,#00001110B ; 显示器开,允许光标闪烁 LCALL WRITE_COM ; 调用写指令子程序 MOV A,#00000110B ; 文字不动,光标自动右移 LCALL WRITE_COM ; 调用写指令子程序 RET2写命令子程序WRITE_COM: CLR RS ; RS=0,选择指令寄存器 CLR R_W; RW=0,选择写模式 CLR E; E=0,禁止读/写LCM LCALL CHECK_BUSY; 调用判断忙碌子程序 SETB E; E=1 ,允许读/写LCM RET; 子程序返回3写数据子程序WRITE_DATA: SETB RS ; RS=1,选择数据 寄存器 CLR R_W; RW=0,选择写模式 CLR E; E=0,禁止读/写LCM LCALL CHECK_BUSY; 调用判断忙碌子程序 SETB E; E=1 ,允许读/写LCM RET; 子程序返回
4查忙子程序CHECK_BUSY: MOV LCD,#0FFH; 此时不接受外来指令 SETB R_W; RW=1, 选择写模式 CLR RS; RS=0,选择指令寄存器 CLR E; E=0,禁止读/写LCMNOP ; 延时1us SETB E; E=1,允许读/写LCM JB LCD.7,CHECK_BUSY;若忙碌则循环等待 RET; 子程序返回主程序参见附录B.2
常用液晶显示模块驱动程序设计图形式液晶显示模块的原理及应用6.1 图形式液晶显示模块的基本特点点阵图形液晶模块是一种用于显示各类图像、符号、汉字的显示模块,其显示屏的点阵像素连续排列,行和列在排布中没有间隔,因此可以显示连续、完整的图形。当然它也能显示字母、数字等字符。点阵图形液晶模块依控制芯片的不同,其功能及控制方法与点阵字符液晶模块相比略有不同。点阵图形液晶模块的控制芯片生产厂商较多,以下为典型的几种。HD61202:日立公司产品T6963C:东芝公司产品HD61830(B):日立公司产品SED1330(E-1330):精工公司产品MSM6255:冲电气公司产品介绍点阵图形液晶模块,实际上就是介绍它的控制芯片。这里以市场上常见的128x64点阵图形液晶模块为例来做介绍,该液晶模块采用日立的HD61202 和HD61203 芯片组成。128x64 点阵图形液晶模块,表示横向有128 点,纵向有64 点,如果以汉字16x16 点而言,每行可显示8 个中文字,4 行共计32个中文字。HD61202和HD61203芯片组成的128x64点阵图形液晶模块方框示意图见图16-1 所示。点阵图形液晶128X64 是 STN 点矩阵 LCD模组,由列驱动器HD61202、行驱动器 HD61203 组成,可以直接与8 位单片机相接。128x64点阵图形液晶模块里有两个HD61202,每个有 512 字节(4096 位)供RAM 显示。RAM显示存储器单元的每位数据与LCD 每点的像素状态 1/0完全一致(0=灭,1=亮)。 图6.1 128x64 点阵图形液晶模块方框示意图 1.128x64 点阵图形液晶模块特性1.+5V 电压,反视度(明暗对比度)可调整。2. 背光分为两种:(EL 冷光)背光和LED 背光。3.行驱动:COM1~COM64(或X1~X64)为行位址,由芯片HD61203 做行驱动。4.列驱动:Y1~Y128(或SEG1~SEGl28)为列位址,由两颗芯片HD61202 驱动,第一颗芯片U2 驱动Y1~Y64,第二颗芯片HD61202 驱动Y65~Y128。5.左半屏/右半屏控制由CS1/CS2 片选决定。CS1=1、CS2=0 时,IC2选中,IC3 不选中,即选择左半屏;CS1=0、CS2=1 时,IC3 选中,IC2 不选中,即选择右半屏。6.列驱动器HD61202 有512Byte 的寄存器,所以IC2 和IC3 加起来共有1024Byte 寄存器。2.128x64 点阵图形液晶模块引脚及功能1 脚(Vss):接地。2 脚(Vdd):电源5V±5%。3 脚(VO):反视度调整。4 脚(D/I):寄存器选择。1:选择数据寄存器;0:选择指令寄存器。5 脚(R/W):读/写选择。1:读;0:写。6 脚(E):使能操作。1:LCM 可做读写操作;0:LCM 不能做读写操作。7 脚(DB0):双向数据总线的第0 位。8 脚(DB1):双向数据总线的第1 位。9 脚(DB2):双向数据总线的第2 位。11 脚(DB3):双向数据总线的第3 位。11 脚(DB4):双向数据总线的第4 位。12 脚(DB5):双向数据总线的第5 位。13 脚(DB6):双向数据总线的第6 位。14 脚(DB7):双向数据总线的第7 位。15 脚(CS1):左半屏片选信号。1:选中;0:不选中。16 脚(CS2):右半屏片选信号。1:选中;0:不选中。17 脚(RST):复位信号,低电平有效。18 脚(VEE):LCD 负压驱动脚(-10~18V)。19 脚(NC):空脚(或接背光电源)。20 脚(NC):空脚(或接背光电源)。3. 128x64 点阵图形液晶模块的内部结构
图6.2 128x64点阵图形液晶模块的内部结构128x64 点阵图形液晶模块的内部结构可分为三个部分:LCD 控制器,LCD 驱动器,LC显示装置,如图4.2 所示。应注意的是,无背光液晶模块同EL、LED 背光的液晶模块内部结构有较大的区别,特别注意第19、20 脚的供电来源及相关参数。LCD 与MCU 之间是利用LCD的控制器进行通信。点阵图形液晶128x64 分行列驱动器,HD61203 是行驱动器,HD61202 是列驱动控制器。HD61202、HD61203 是点阵图形液晶显示控制器的代表电路。熟知HD61202、HD61203将可通晓点阵图形液晶显示控制器的工作原理。附图1 为128X64 点阵图形液晶的显示位置和RAM 显示存储器映射图。
图6.3 128X64点阵图形液晶的显示位置和RAM 显示存储器映射图6.2 图形式液晶显示控制及驱动器HD612026.2.1 HD61202特点 1.图形 LCD 列驱动器组成显示RAM 数据。2.像素点亮/熄灭直接由内部RAM 显示存储器单元。RAM 数据单元为“1”时,对应的像素点亮;RAM 数据单元为“0”时,对应的像素点灭。 3.内部 RAM 地址自动递增。4.显示RAM 容量达512Bytes(4096Bits)。5. 8 位并行接口,适配M6800 时序。6.内部LCD 列驱动电路为64 路。7.简单而较强的指令功能,可实现显示数据读/写、显示开/关、设置地址、设置开始行、读状态等。8. LCD 驱动电压范围为8~17V。9.100 脚扁平塑料封装(FP-100)。6.2.2 HD61202硬件工作原理HD61202 的内部组成结构如图4.4所示。图4.4为HD61202 的引脚图。 图6.4 HD61202 的内部组成结构1. 内部组成结构(1)I/O 缓冲器I/O 缓冲器为双向三态数据缓冲器。是HD61202 内部总线与计算机总线连接部。其作用是将两个不同时钟下工作的系统连接起来,实现通讯。I/O 缓冲器在三个片选信号/CS1、/CS2 和CS3 组合有效状态下,I/O 缓冲器开放,实现HD61202 与计算机之间的数据传递。当片选信号组合为无效状态时,I/O 缓冲器将中断HD61202 内部总线与计算机数据总线的联系,对外总线呈高阻状态。(2). 输入寄存器输入寄存器用于暂时储存要写入显示RAM(显示存储器)的资料。因为数据是由MCU写入输入寄存器,然后再由内部处理后自动地写入显示存储器内。当CS=1,D/I=1,且R/W=1时,数据在使能信号E 的下降沿被锁入输入寄存器。(3). 输出寄存器从显示RAM 中读出的数据首先暂时储存在输出寄存器。MCU 要从输出寄存器读出数据则要令CS=D/I=R/W=1。不过读数据命令时,存于输出寄存器中的数据是在E 脚为高电平时输出;然后在E 脚信号落为低电平时,地址指针指向的显示数据接着被锁入输出寄存器而且地址指针递增。输出寄存器中,会因读数据的指令而被再写入新的数据,若为地址指针设定指令则数据维持不变。因此,发送完地址设定指令之后随即发送读取数据指令,将无法得到所指定位址的数据,必须再接着读取一次数据,该指定地址的数据才会输出。
常用液晶显示模块驱动程序设计. 显示存储器电路HD61202 具有4096 位显示存储器。其结构是以一个64X64 位的方阵形式排布的。显示存储器的作用一是存储计算机传来的显示数据,二是作为控制信号源直接控制液晶驱动电路的输出。显示存储器为双端口存储器结构,结构原理示意图如图4.6 所示。 图6.5 HD61202 双端口存储器结构从数据总线侧看有64 位,按8 位数据总线长度分成8 路,称为页面,由X 地址寄存器控制;每个页面都有64 个字节,用Y 地址计数器控制,这一侧是提供给计算机操作的,是双向传输形式。XY 地址计数器选择了计算机所要操作的显示存储器的页面和列地址,从而唯一地确定计算机所要访问的显示存储器单元。从驱动数据传输侧看有64 位,共64 行,这一侧是提供给驱动器使用的,仅有输出形式。HD61202 列驱动器为64 列驱动输出,正好与显示存储器列向(纵向)单元对应。Z 地址计数器为显示行指针,用来选择当前要传输的数据行。(1) X(页),Y (列)地址计数器X,Y 地址计数器寄存器,它们确定了计算机所需访问的显示存储器单元的地址。X 地址计数器为高3 位,Y 地址计数器为低6 位,分别有各自的指令来设定行、列地址。计算机访问显示存储器之前必须要设置XY 地址计数器。计算机写入或读出显示存储器的数据代表显示屏上某一列上的垂直8 点的数据。D0 代表最上一的点数据。X 地址计数器是一个3 位页地址寄存器,其输出控制着显示存储器中8 个页面的选择,也就是控制着数据传输通道的八选一选择器。X 地址寄存器可以由计算机以指令形式设置。X 地址寄存器没有自动修改功能,所以要想转换页面需要重新设置X 地址寄存器的内容。Y 地址计数器是一个6 位循环加一计数器。它管理某一页面上的64 个单元,该数据总线上的64 位数据直接控制驱动电路输出Y1~Y64 的输出波形。Y 地址计数器可以由计算机以指令形式设置,它和页地址指针结合唯一选通显示存储器的一个单元。Y 地址计数器具有自动加一功能。在显示存储器读/写操作后Y 地址计数器将自动加一。当计数器加至3FH 后循环归零再继续递加。 显示起始行寄存器显示起始行寄存器为6 位寄存器,它规定了显示存储器所对应显示屏上第一行的行号。该行的数据将作为显示屏上第一行显示状态的控制信号。显示起始行寄存器的内容由计算机以指令代码的格式写入。此寄存器指定RAM 中某一行数据对应到LCD 屏幕的最上行,可用做荧幕卷动。(2). Z地址计数器Z地址计数器也为6 位地址计数器,用于确定当前显示行的扫描地址。Z 地址计数器具有自动加一功能,它与行驱动器的行扫描输出同步,选择相应的列驱动器的数据输出。在行驱动器发来的CL 时钟信号脉冲的下降沿时加一。在FRM 信号的高电平时置入显示起始行寄存器的内容,以作为再循环显示的开始。(3).显示开/关触发器该触发器的输出一路控制显示数据锁存器的清除端,一路返回到接口控制电路作为状态字中的一位表示当前的显示状态。该触发器的作用就是控制显示驱动输出的电平以控制显示屏的开关。在触发器输出为“关”电平时,显示数据锁存器的输入被封锁并将输出置“0”,从而使显示驱动输出全部为非选择波形,显示屏呈不显示状态。在触发器输出为“开”电平时,显示数据锁存器受CL 控制,显示驱动输出受显示驱动数据总线上数据控制,显示屏将呈显示状态。显示开/关触发器受逻辑电路控制,计算机可以通过硬件/RST 复位和软件指令“显示开关设置”的写入来设置显示开/关触发器的输出状态。(4 )指令寄存器指令寄存器用于接收计算机发来的指令代码,通过译码将指令代码置入相关的寄存器或触发器内。(5 )状态字寄存器状态字寄存器是HD61202与计算机通讯时唯一的“握手”信号。状态字寄存器向计算机表示了HD61202当前的工作状态。其中最主要的是忙碌信号(Busy),当忙碌信号为“1”,表示HD61202正在忙于内部运作,除了状态读取指令外,其他任何指令部不被接受。忙碌信号(Busy)是由状态字读取指令所读出DB7 表示。每次要发指令前,应先确定忙碌信号已为“0”。(6) 显示数据锁存器数据要从显示数据RAM 中输出到液晶驱动电路前,先暂时储存于此锁存器中,在时钟信号上升沿时数据被锁存。显示器开/关指令控制此锁存器动作,不会影响显示数据RAM 中的数据。3. HD61202 的工作过程计算机要想访问HD61202,必须首先读取状态字寄存器的内容,主要是要判别状态字中的“Busy”标志;在“Busy”标志表示为0 时,计算机方可访问HD61202。在写操作时,HD61202在计算机写操作信号的作用下将计算机发来的数据锁存进输入寄存器内,使其转到HD61202内部时钟的控制之下,同时HD61202 将I/O 缓冲器封锁,置“Busy”标志位为1,向计算机提供HD61202 正在处理计算机发来的数据的信息。HD61202 根据计算机在写数据时提供的D/I 状态将输入寄存器的内容送入指令寄存器处理或显示存储器相应的单元,处理完成后,HD61202将撤消对I/O 缓冲器的封锁,同时将“Busy”标志位清零,向计算机表示HD61202已准备好接收下一个操作。在读显示数据时,计算机要有一个操作周期的延时,即“空读”的过程。这是因为在计算机读操作下,HD61202向数据总线提供输出寄存器当前的数据,并在读操作结束时将当前地址指针所指的显示存储器单元的数据写入输出寄存器内,同时将列地址计数器加一。也就是说计算机不是直接读取到显示存储器单元,而是读取一个中间寄存器__输出寄存器的数据。而这个数据是上一次读操作后存入到输出寄存器的内容,这个数据可能是上一地址单元的内容,也可能是地址修改前某一单元的内容。因此在计算机设置所要读取的显示存储器地址后,第一次的读操作实际上是要求HD61202 将所需的显示存储器单元的数据写入输出寄存器中,供计算机读取。只有从下一次计算机的读操作起,计算机才能读取所需的显示数据4.HD61202 的操作时序图对HD61202 的操作必须严格按照时序进行。(1).写入时序(如图6.6所示)。 图6.6 HD61202 的写入时序
(2).读取时序(如图6.7所示)。 图6.7 HD61202 的读取时序
6.2.4 HD61202的指令集128x64 图形液晶模块的控制指令共有 7 个,为:显示开/关、设置(PAGE1~PAGE8) 、读状态、设置开始显示行、设置列地址Y、写显示数据、读显示数据。1.显示器开关表1R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 1 0 0 1 1 1 1 1 DD:显示屏开启或关闭控制位。D=1 时,显示屏开启;D=0 时,则显示屏关闭,但显示数据仍保存于DDRAM 中。2.设置页(x 地址)表2 R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 0 1 0 1 1 1 A A A显示RAM 数据的X 地址AAA(二进制)被设置在X 地址寄存器。设置后,读/写都在这一指定的页里执行,直到下页设置后再往下页执行,该指令设置了页面地址X 地址寄存器的内容。HD61202 将显示存储器分成8 页,指令代码中AAA 就是要确定当前所要选择的页面地址,取值范围为0~7H,代表第1~8 页。3.读状态表3 读状态R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 0 BUSY 0 ON/OFF ON/OFF 0 0 0 0Busy:表示当前HD61202 接口控制电路运行状态。Busy=1 表示HD61202 正忙于处理MCU 发来的指令或数据。此时接口电路被封锁,不能接受除读状态以外的任何操作; Busy=0 表示HD61202 接口控制电路已处于空闲状态,等待MCU 的访问。ON/OFF:表示当前的显示状态。ON/OFF=1 表示关显示状态;ON/OFF 表示开显示状态。Reset:当Reset=1 状态时,HD61202 处于复位工作状态;当Reset=0 状态时,HD61202为正常工作状态。4.显示开始行表4 显示开始行R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 0 1 0 1 1 1 A A A该指令设置了显示起始行寄存器的内容。HD61202有64行显示的管理能力,该指令中AAAAAA(二进制)为显示起始行的地址,取值在0~3FH(1~64 行)范围内,它规定了显示屏上最顶一行所对应的显示存储器的行地址。如果定时间隔地、等间距地修改(如加一或减一)显示起始行寄存器的内容,则显示屏将呈现显示内容向上或向下平滑滚动的显示效果。5.设置Y(列) 地址表5.设置Y(列) 地址R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 0 1 0 1 1 1 A A A该指令设置了Y 地址计数器的内容,AAAAAA=0~3FH(1~64)代表某一页面上的某一单元地址,随后的一次读或写数据将在这个单元上进行。Y 地址计数器具有自动加一功能,在每一次读/写数据后它将自动加一,所以在连续进行读/写数据时,Y 地址计数器不必每次都设置一次。页面地址的设置和列地址的设置将显示存储器单元唯一地确定下来,为后来的显示数据的读/写作了地址的选通。
6.写显示数据表6 写显示数据R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 0 1 0 1 1 1 A A A该操作将8 位数据写入先前已确定的显示存储器单元内,操作完成后列地址计数器自动加一。
常用液晶显示模块驱动程序设计读显示数据表7 读显示数据R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 0 1 0 1 1 1 A A A该操作将HD61202 接口部的输出寄存器内容读出,然后列地址计数器自动加一。必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。6.3基于HD61202图形式液晶显示器LGM12864应用6.3.1 图形式液晶显示器LGM12864简介介绍点阵图形液晶模块,实际上就是介绍它的控制芯片。这里以常见的LGM12864点阵图形液晶模块为例来做介绍,该液晶模块采用日立的HD61202 和HD61203 芯片组成。LGM12864点阵图形液晶模块,表示横向有128 点,纵向有64 点,如果以汉字16x16 点而言,每行可显示8 个中文字,4 行共计32个中文字。用HD61202和HD61203芯片组成的128x64点阵图形液晶模块方框示意图见图16-1 所示。点阵图形液晶LGM12864 LCD模组由列驱动器HD61202、行驱动器 HD61203 组成,可以直接与8 位单片机相接。LGM12864点阵图形液晶模块里有两个HD61202,每个有 512 字节(4096 位)供RAM 显示。RAM显示存储器单元的每位数据与LCD 每点的像素状态 1/0 完全一致(1=亮,0=灭)。6.3.2 图形式液晶显示器LGM12864接口方案及论证1.直接控制方式因为内藏HD61202及其兼容控制驱动器的液晶模块的接口时序为68时序,所以用89C51的总线方式控制管理,就需要经过一些简单的时序改造.电路原理图如图4.10。
图6.8 直接访问方式接口电路
2.间接控制方式
图6.9 间接控制方式接口电路比较以上两种接口方案可以看到,与直接控制方式相比,间接控制方式使用的辅助器件更少,接线也更简洁,可靠性也相应较高,成本也相对较低,唯一的缺点就是要用较多的软件来弥补硬件上的不足,编程相对复杂。总体上比较,间接控制方式更为方便实用。 6.4图形式液晶显示器LGM12864应用程序设计6.4.1 程序设计流程图 (a) (b) (c)图6.12 图形式液晶显示程序设计流程图6.4.2功能程序模块详解1. 判LCM 忙子函数void lcd_busy(void){RS=0;RW=1;P2=0xff;while(1){EN=1;if(P2<0x80)break;EN=0;}EN=0;}
2. 写指令到LCM 子函数void wcode(uchar c,uchar csl,uchar csr) { CS1=csl; CS2=csr;lcd_busy(); RS=0; RW=0; P2=c; EN=0;delay(10); EN=1;delay(10);EN=0; } /*-------------写数据子程序---------------------------*/void wdata(uchar c,uchar csl,uchar csr) { CS1=csl; CS2=csr;lcd_busy(); 3.写数据到LCM 子函数void wdata(uchar c,uchar csl,uchar csr) { CS1=csl; CS2=csr;lcd_busy(); RS=1; RW=0; P2=c;EN=0;delay(10); EN=1;delay(10); EN=0; } 4. 设定起始行子函数void set_startline(uchar i) { i=0xc0+i; wcode(i,1,1); } 5. 定位x 方向(起始页)、y(起始列)方向的子函数void set_xy(uchar x,uchar y) { x=x+0x40; y=y+0xb8; wcode(x,1,1); wcode(y,1,1); } 6. 屏幕开启、关闭子函数void dison_off(uchar on) { on=on+0x3e; wcode(on,1,1); } 7.复位子函数void reset() //函数名为reset 的复位子函数。{ // reset 函数开始。RST_0; //复位端置低电平。Delay_nms(10); //延时一会。RST_1; //复位端置高电平。Delay_nms(10); //延时一会。} // reset 函数结束。8. 根据x、y 地址定位,将数据写入LCM 左半屏或右半屏的子函数void reset() { RST=0; delay(10); RST=1; delay(10);
常用液晶显示模块驱动程序设计9. 显示汉字子函数{ uchar i,dx; for(i=0;i<16;i++) {dx=hz[2*i+n*32]; //if(fb)dx=255-dx; lw(x*8+i,y,dx); dx=hz[(2*i+1)+n*32]; //if(fb)dx=255-dx; lw(x*8+i,y+1,dx); } }
主程序参见附录B.3:LGM12864的应用程序第7章 仿真本章将以HD61202集成电路以间接控制方式的电路图为例,介绍图形式液晶显示模块的仿真过程。步骤:1. 根据设计电路图(图7.1)在Proteus软件中连接好电路图。 图7.1 89C51与点阵图形液晶显示模块接口电路图2.在keil 51软件中写好程序并生成.HEX文件输入到89C51单片机中。LGM12641点阵图形液晶显示模块可以显示数字、汉字、图形,下面将以该点阵图形液晶显示模块显示汉字为例,来说明内置HD61202点阵图形液晶显示模块的应用,硬件采用MCS-51系列89C51微处理器驱动以M6800接口时序工作的液晶显示模块的电路。要在液晶显示屏上以绘图方式显示出来汉字,我们可以按照附录7.2所示的流程来设计122×32点阵液晶显示模块显示汉字的软件,更改数据RAM中要显示的数据后,就可以改变要显示的内容。具体程序如附录B.3的应用程序所示。3.仿真成功后,可以在LGM12641点阵图形液晶显示模块上显示汉字。还可以改变数据,让它显示其它的字符或图形.4.输入驱动程序,让其实现对应的功能。 其它类型液晶显示模块的仿真过程与上面步聚相同。
总结2009年的3月,我开始了我的毕业论文工作,时至今日,论文基本完成。我从刚接到毕业设计题目的时候的茫然,到慢慢的进入状态,再到对思路逐渐的清晰,整个写作过程难以用语言来表达。遇到困难,我会觉得无从下手,不知从何写起;当困难解决了,我会觉得豁然开朗,思路打开了;当论文经过一次次的修改后,基本成形的时候,我觉得很有成就感。本次设计基本达到了设计任务书的要求,针对常用型液晶显示模块选取了几个典型代表。分别介绍了各液晶显示模块芯片的功能及用法,进而介绍了用单片机驱动液晶显示模块的实际应用,并给出了接口电路图。最后编写程序,并调试。在搜集资料中我遇到了一些困难,是朋友们帮助了我,让我非常感激。我们团结协作,使我以后的思路变得清晰。我也做好了平常的记录工作,为以后思路的整理奠定了良好的基础。还要感谢我的导师,没有他耐心细致的指导,我也可能在设计中走好多弯路。在毕业设计中我学会了好多,不但巩固了的专业知识,意志力和分析能力也增加了。临近毕业,就要走入社会这个大家庭,我还有好多知识要学。我会一直记得第一次独立完成此次毕业设计的片段,它是我的又一笔精神财富。我会把这种精神应用到我的工作和生活中,进一步提高完善自己。为社会贡献我的一份力量。致谢短短的大学四年学习生活即将结束,在此,我要感谢所有曾经教导过我的老师和关心过我的同学,他们在我成长过程中给予了我很大的帮助。本文能够成功地完成,要特别感谢我的导师吴X华的关怀和教导。在毕业设计的过程中,帮助过我的人很多。尤其要感谢我的导师,当我的思路不清晰时,是他及时纠正我的错误,给我指明了前进的方向,每次发现问题他都不厌其烦地给我解答。虽然在毕业设计期间我还有其他的事情要处理,老师也非常理解并给与帮助,是得我才能够在学校要求的时间内完成此次设计。通过这次设计,我的意志受到了磨练,独立实践能力也增强了。没有老师和同学们的支持与帮助,我做不到这么好,是他们让我感觉到了温暖和关怀,陪我度过了设计的困难期。当最后看到自己的设计成果时,我的心情是激动的。感谢我的老师和朋友们。最后感谢培养我的大学[1]范立男,谢子殿.单片机原理及应用教程[M].北京:北京大学出版社.2006年.起始页码:220页.[2]周兴华.手把手教你学单片机C程序设计[M].北京:北京航空航天大学出版社.2007.起始页码:304页.[17] P.Alt,P.Pleshko.Scanning limitations of liquid-crystal displays[J].IEEE Transactions on Electron Devices.1974.2[18] Kurt Muhlemann,A 30-V Row/Column Driver for Flat-panel Liquid crystal displays[J].IEEE. Journal of solid –State Circuit.Vo1.23.No 2.1998.4
常用液晶显示模块驱动程序设计附录B 程序清单附录B.1 LM061A的应用程序程序1.使LM061A显示数字功能:开机后在屏幕上显示0123456个数字;主程序CS BIT P1.0WRR BIT P1.1RDD BIT P1.2DAT BIT P1.3ORG 00HAJMP INITIALORG 30HINITIAL:MOV A,#29H;初始化定义LCALL LCM_WRCOMMOV A,#18H;RC工作方式LCALL LCM_WRCOMMOV A,#03H;开显示LCALL LCM_WRCOMMOV A,#1;开振荡器LCALL LCM_WRCOMMOV R4,#6MOV R5,#0;***********主程序********MAIN:MOV A,R5; R5是地址计数器MOV DPTR,#TAB;TAB中装的是显示数据的首地址MOVC A,@A+DPTRMOV R6,A;LCALL LCM_DATAINC R5DJNZ R4,MAINAJMP contentnbsp; ;维持输入状态;**********写命令子程序*************LCD_WRCOM:CLR CSSETB DAT ;写入命令码前缀100,此处为1CLR WRRSETB WRRCLR DAT ;此处为0CLR WRRSETB WRCLR DAT ;此处为0CLR WRRSETB WRMOV R7,#8 ;命令码长度为8位LOOP1: RLC AMOV DAT,CCLR WRRSETB WRRDJNZ R7,LOOP1;位数据未送完则继续CLR DAT ;反之写入命令码的最后一位0CLR WRRSETB WRRSETB CSSETB DAT ;写完指令码后LCM数据位要至高电平RET;*****写数据子程序**********LCM_DATA: CLR CSSETB DAT ;写入数据码前缀1010,此处为1CLR WRRSETB WRR;;***************SETB DAT ;此处为1CLR WRRSETB WRR;;*****************CLR DAT ;此处为0CLR WRRSETB WR;;*****************MOV R7,#5;地址码长度为5位MOV A,R5;LOOP2: RLC AMOV DAT,CCLR WRRSETB WRDJNZ R7,LOOP2;5位地址未送完则继续MOV R7,#8MOV A,R6LOOP3: RLC AMOV DAT,CCLR WRRSETB WR;**************DJNZ R7,LOOP3;8位数据未送完则继续SETB CSSETB DAT ;写完数据码后LCM数据位DAT要至高电平RETTAB:DB 0B7H,06H,0E5H,0C7H,56H;0.,1,2,3,4DB 0D3H,0F3H,07H,0F7H,0D7H;5,6,7,8,9DB 77H,0F2H,0B1H,0E6H,0F1H;A,B,C,D,E
附录B.2 LCM1602的应用程序程序1. 使LCD在不同位置显示字符功能说明:单片机接有液晶显示器,开机后在显示器第一行第二个位置上显示“L”,在第二行第五个位置显示“G”。本节电路见图3.3.本节程序由主程序,初始化子程序,写指令子程序,判忙子程序和写数据子程序所构成,再设定第一行显示数据位置显示“A”后,又设定了第二行显示 数据的位置并输出显示数据“B”(1)主程序流程图下图所示
附图2 LCM1602显示两个字符的程序流程图(2)主程序;********89C51引脚定义******** RS BIT P3.3 R_W BIT P3.4 E BIT P3.5 DB0_DB7 EQU P1;*******程序开始******** ORG 0000H LJMP MAIN;*******主程序******* ORG 0030HMAIN:MOV LCD,#00000001B;清屏,光标复位ACALL WR_COM; 调用写指令子程序ACALL INITIAL; 调用初始化子程序
MOV LCD #81H; 写入第一行第二个位置ACALL WR_COM; 调用写指令子程序www.lwfree.cn ACALL WR_DATA; 调用写数据子程序JMP $; 维持当前输入状态; *******初始化子程序*******INITIAL:MOV A,#00111000B; 设置8位,2行,5*7点阵 LCALL WRITE_COM; 调用写指令子程序 MOV A,#00001110B ; 显示器开,允许光标闪烁 LCALL WRITE_COM ; 调用写指令子程序 MOV A,#00000110B ; 文字不动,光标自动右移 LCALL WRITE_COM ; 调用写指令子程序 RET;******写命令子程序***********WRITE_COM: CLR RS ; RS=0,选择指令寄存器 CLR R_W; RW=0,选择写模式 CLR E; E=0,禁止读/写LCM LCALL CHECK_BUSY; 调用判断忙碌子程序 SETB E; E=1 ,允许读/写LCM RET; 子程序返回;*********查忙子程序***********CHECK_BUSY: MOV LCD,#0FFH; 此时不接受外来指令 SETB R_W; RW=1, 选择写模式 CLR RS; RS=0,选择指令寄存器 CLR E; E=0,禁止读/写LCMNOP ; 延时1us SETB E; E=1,允许读/写LCM JB LCD.7,CHECK_BUSY;若忙碌则循环等待 RET; 子程序返回;*********写数据子程序************WRITE_DATA: SETB RS ; RS=1,选择数据 寄存器 CLR R_W; RW=0,选择写模式 CLR E; E=0,禁止读/写LCM LCALL CHECK_BUSY; 调用判断忙碌子程序 SETB E; E=1 ,允许读/写LCM RET; 子程序返回
常用液晶显示模块驱动程序设计
程序2.使LCD显示字符串功能说明:LCD显示字符串。开机后,从液晶屏第一行第二个位置处开始显示字符串“Happy new year!”共计15个字符。电路接线同上。(1)主程序流程图下图所示
附图(a) 附图(b)附图3 LCM1602显示字符串的程序流程图(2).主程序;********89C51引脚定义********RS BIT P3.0 ;RW BIT P3.1 ;E BIT P3.2 ;LCD EQU P2 ; P2口作为数据口;*********ORG 00HAJMP MAINORG 30HMAIN:ACALL INTIAL;调用LCM初始化子程序MOV LCD,#80H;屏幕第一行的第一个地址ACALL WRCOMMOV DPTR,#LINE1 ;Happy new year!MOV R0,#15 ;R0中放的是要显示字符串是长度,此处字符串长度为15ACALL DISPJMP contentnbsp; ; INTIAL:MOV LCD,#00111000B; 设置数据长度为8位,2行,5*7点阵 ACALL WRCOMMOV LCD,#00001111B; 显示器开,光标允许闪烁ACALL WRCOMMOV LCD,#00000110B; 文字不动,光标右移ACALL WRCOMRET;查表显示子程序DISP:MOV R1,#0LOOP:MOV A,R1MOVC A,@A+DPTRMOV LCD,AINC R1ACALL WRDATADJNZ R0,LOOPRET;写命令子程序WRCOM:CLR RS ; RS=0,选择指令寄存器CLR RW ;RW=0,选择写模式CLR E ; E=0,禁止读/写LCMACALL CHECKBUSY ;查忙SETB E ; E=1,允许读/写LCMRET ;查忙子程序CHECKBUSY:MOV LCD,#0FFH ; 此时不接受外来指令CLR RS ; RS=0,选择指令寄存器SETB RW ;RW=1,选择读模式CLR E ; E=0,禁止读/写LCMNOP ; SETB E ;E=1,允许读/写LCMJB LCD.7,CHECKBUSY ;若忙则循环等待RET ;写数据子程序WRDATA:SETB RS ; 选择数据寄存器 附图4 LCD循环显示程序流程CLR RW ; RW=0,选择写模式CLR E ; E=0,禁止读/写LCMACALL CHECKBUSY ;查忙SETB E ; E=1,允许读/写LCMRET ;清屏子程序CLS:MOV LCD,#00000001BACALL WRCOMRET;延时2S子程序DEL1:MOV R5,#100D1:MOV R6,#100D2:MOV R7,#100DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET;LINE1: DB 'Happy new year!'END 程序3.LCD循环显示功能说明:LCD循环显示字符串。首先在第一行显示“Hello!”,在第二行显示“Welcome to SNUT”,再过2s后第一行显示“Nothing seek,”在第二行显示“nothing find.”(无所求则无所获);再过2s后第一行显示“Cease to struggle”’在第二行显示“and you cease to live.”( 生命不止,奋斗不息)不断循环显示以上六行句子主程序:RS BIT P3.0 ;RW BIT P3.1 ;E BIT P3.2 ; LCD EQU P2ORG 00H AJMP MAINORG 30HMAIN:ACALL INITAL;调用LCM初始化子程序LOOP1:MOV LCD,#80H;屏幕第一行的第一个地址ACALL WRCOMMOV DPTR,#LINE1 ;hello,everyone!MOV R0,#15 ;R0中放的是要显示字符串是长度, ACALL DISP ; 此处字符串长度为15, ;以下同样的道理MOV LCD,#0C0H;屏幕第二行的第一个地址ACALL WRCOMMOV DPTR,#LINE2 ;welcome to snut! MOV R0,#16 ; ACALL DISPACALL DEL1LCALL CLS;******************MOV LCD,#80H;屏幕第一行的第1个地址ACALL WRCOMMOV DPTR,#LINE3 ;nothing seek,MOV R0,#13 ;ACALL DISP
www.lwfree.cnMOV LCD,#80H;屏幕第一行的第1个地址ACALL WRCOMMOV DPTR,#LINE5 ; Cease to struggleMOV R0,#18 ;ACALL DISP
MOV LCD,#0C0H;屏幕第二行的第一个地址ACALL WRCOMMOV DPTR,#LINE6 ; and cease to liveMOV R0,#17 ;ACALL DISPACALL DEL1ACALL CLSLJMP LOOP1
;LCM初始化子程序INITAL:MOV LCD,#00000001B;清屏并复位光标ACALL WRCOMMOV LCD,#00111000B;设置8行,5列,5*7点阵ACALL WRCOMMOV LCD,#00001110B;显示器开,不允许光标闪烁ACALL WRCOMMOV LCD,#00000110B;文字不动,光标自动右移ACALL WRCOMRET;查表显示子程序
常用液晶显示模块驱动程序设计DISP:MOV R1,#0LOOP:MOV A,R1MOVC A,@A+DPTRMOV LCD,AINC R1ACALL WRDATADJNZ R0,LOOPRET;写命令子程序WRCOM:CLR RS ; RS=0,选择指令寄存器CLR RW ;RW=0,选择写模式CLR E ; E=0,禁止读/写LCMACALL CHECKBUSY ;查忙SETB E ; E=1,允许读/写LCMRET ;查忙子程序CHECKBUSY:MOV LCD,#0FFH ; 此时不接受外来指令CLR RS ; RS=0,选择指令寄存器SETB RW ;RW=1,选择读模式CLR E ; E=0,禁止读/写LCMNOP ; SETB E ;E=1,允许读/写LCMJB LCD.7,CHECKBUSY ;若忙则循环等待RET ;写数据子程序WRDATA:SETB RS ; 选择数据寄存器CLR RW ; RW=0,选择写模式CLR E ; E=0,禁止读/写LCMACALL CHECKBUSY ;查忙SETB E ; E=1,允许读/写LCMRET ;清屏子程序CLS:MOV LCD,#00000001BACALL WRCOMRET;延时2S子程序DEL1:MOV R5,#100D1:MOV R6,#100D2:MOV R7,#100DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET;LINE1: DB 'Hello!everyone.'LINE2: DB 'Welcome to SNUT!'LINE3: DB 'Nothing seek,' LINE4: DB 'Nothing get!'LINE5: DB 'Cease to struggle,' LINE6: DB 'and cease to live.'END
附录B.3 LGM12864的应用程序 程序1.显示汉字功能说明:LCD循环显示汉字字符串首先在第一行显示“陕西理工学院”,第二行显示“电气工程系”,第三行显示“☆明德博学励志笃行☆”,第四行显示“◤有志者事竟成◥”主程序如下:
/**16 *16字符点阵,宋体,逐行,阴码,逆向取字模,16进制输出***//***显示“陕西理工学院” **//*** “电气工程系”**//** “☆明德博学励志笃行☆”**//** “◤有志者事竟成◥”**/#include
#define uchar unsigned char #define uint unsigned intsbit RS=P3^7;sbit RW=P3^6;sbit EN=P3^5;sbit CS1=P3^4;sbit CS2=P3^3;sbit RST=P3^2; /************************函数列表**************************/void delay(unsigned long v);void wcode(uchar c,uchar csl,uchar csr);void wdata(uchar c,uchar csl,uchar csr);void set_startline(uchar i);void set_xy(uchar x,uchar y);void dison_off(uchar o);void reset();void lcd_init(void);void lw(uchar x, uchar y, uchar dd);void display_hz(uchar x, uchar y, uchar n, uchar fb);uchar code hz[];void lcd_busy(void);void clear_lcd();void rollscreen(uchar z);/*******************************************************/void main(void){uchar loop;delay(10);reset(); lcd_init(); delay(10); while(1) {/************显示第一行(8个字)***********/for(loop=0;loop<8;loop++) {display_hz(2*loop,0,loop,0); display_hz(2*loop,0,loop,0); display_hz(2*loop,0,loop,0); display_hz(2*loop,0,loop,0); display_hz(2*loop,0,loop,0); display_hz(2*loop,0,loop,0); display_hz(2*loop,0,loop,0); display_hz(2*loop,0,loop,0);}/*************显示第二行(8个字)**********/for(loop=0;loop<8;loop++) {display_hz(2*loop,2,loop+8,0); display_hz(2*loop,2,loop+8,0); display_hz(2*loop,2,loop+8,0); display_hz(2*loop,2,loop+8,0); display_hz(2*loop,2,loop+8,0); display_hz(2*loop,2,loop+8,0); display_hz(2*loop,2,loop+8,0); display_hz(2*loop,2,loop+8,0);}/**************显示第三行(8个字)*************/for(loop=0;loop<8;loop++) {display_hz(2*loop,4,loop+16,0); display_hz(2*loop,4,loop+16,0); display_hz(2*loop,4,loop+16,0); display_hz(2*loop,4,loop+16,0); display_hz(2*loop,4,loop+16,0); display_hz(2*loop,4,loop+16,0); display_hz(2*loop,4,loop+16,0); display_hz(2*loop,4,loop+16,0);}/*************显示第四行(8个字)*************/for(loop=0;loop<8;loop++) {display_hz(2*loop,6,loop+24,0); display_hz(2*loop,6,loop+24,0);www.lwfree.cnrollscreen(0); }}/***滚动子程序*/void rollscreen(uchar z){uchar zc;while(z<64){zc=z+0xc0;wcode(zc,1,1);delay(5000);delay(5000);z++;}}/*-------------延时子程序-------------------------------*/void delay(unsigned long v) { while(v!=0)v--; } /*----------写指令子程序---------------------------------*/void wcode(uchar c,uchar csl,uchar csr) { CS1=csl; CS2=csr;lcd_busy(); RS=0; RW=0; P2=c; EN=0;delay(10); EN=1;delay(10);EN=0; } /*-------------写数据子程序---------------------------*/void wdata(uchar c,uchar csl,uchar csr) { CS1=csl;
常用液晶显示模块驱动程序设计CS2=csr;lcd_busy(); RS=1; RW=0; P2=c;EN=0;delay(10); EN=1;delay(10); EN=0; } /*-----根据列和页地址定位,将数据写入LCM左或右半区子程序------*/void lw(uchar x, uchar y, uchar dd) { if(x>=64) {set_xy(x-64,y); wdata(dd,0,1);} else {set_xy(x,y); wdata(dd,1,0);} } /*----------------设置起始行子程序-----------------------------------*/void set_startline(uchar i) { i=0xc0+i; wcode(i,1,1); } /*------------定位列和页地址子程序----------------------*/void set_xy(uchar x,uchar y) { x=x+0x40; y=y+0xb8; wcode(x,1,1); wcode(y,1,1); } /*-------------屏幕开关子程序------------------------*/void dison_off(uchar on) { on=on+0x3e; wcode(on,1,1); } /*------------复位子程序-----------------------------*/void reset() { RST=0; delay(10); RST=1; delay(10); }/****查忙子程序***********/ void lcd_busy(void){RS=0;RW=1;P2=0xff;while(1){EN=1;if(P2<0x80)break;EN=0;}EN=0;} /****清屏子程序******/void clear_lcd(){uchar i,j,x;for(i=0;i<8;i++) /**i为页数0~7页***/{x=i+0xb8; /*页地址设置指令代码**/wcode(x,1,1); /**将页地址设置指令代码写入lcm****/wcode(0x40,1,1); /**将列地址设置代码写入lcm,0x40为第0列指令代码,以后列地址会自动加1*****/for(j=0;j<64;j++){wdata(0x00,1,1);} /***将0x00写入LCM,实现清屏**********/}} /*-------------初始化子程序------------------*/void lcd_init(void) {//uchar x,y; clear_lcd(); //reset(); dison_off(0);dison_off(1); set_startline(0); //for(y=0;y<8;y++) // {// for(x=0;x<128;x++)lw(x,y,0);// }//dison_off(1); } /***********汉字显示子程序*/void display_hz(uchar x, uchar y, uchar n,uchar m) { uchar i,dx; for(i=0;i<16;i++) {dx=hz[2*i+n*32]; //if(fb)dx=255-dx; lw(x*8+i,y,dx); dx=hz[(2*i+1)+n*32]; //if(fb)dx=255-dx; lw(x*8+i,y+1,dx); } } /****************************汉字点阵码表*********************************/uchar code hz[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",1*/
0x00,0x00,0xFC,0xFF,0x04,0x10,0xF4,0x11,0x0C,0x1E,0x08,0x81,0x18,0x41,0xE8,0x61,0x08,0x31,0xFC,0x0D,0x08,0x07,0x88,0x19,0x68,0x21,0x18,0x41,0x00,0x81,0x00,0x80,/*"陕",2*/
0x00,0x00,0xC4,0x7F,0x44,0x90,0x44,0x90,0x44,0x88,0xFC,0x87,0x44,0x80,0x44,0x80,0x44,0x80,0xFC,0x87,0x44,0x88,0x44,0x88,0x44,0x88,0x44,0x88,0xC4,0xFF,0x00,0x00,/*"西",3*/
0x00,0x80,0x04,0x81,0x04,0x41,0xFC,0x7F,0x04,0x21,0x04,0xA1,0xFC,0x91,0x24,0x92,0x24,0x92,0x24,0x92,0xFC,0xFF,0x24,0x92,0x24,0x92,0x24,0x92,0xF8,0x91,0x00,0x00,/*"理",4*/
0x00,0x00,0x04,0x80,0x04,0x80,0x04,0x80,0x04,0x80,0x04,0x80,0x04,0x80,0xFC,0xFF,0x04,0x80,0x04,0x80,0x04,0x80,0x04,0x80,0x04,0x80,0x04,0x80,0x00,0x80,0x00,0x00,/*"工",5*/
0x00,0x00,0xE0,0x08,0x24,0x08,0xA8,0x08,0x90,0x88,0xA0,0x88,0xA0,0x08,0xAC,0x08,0x90,0x8E,0xA0,0xFA,0xA0,0x09,0x90,0x08,0x2C,0x08,0x20,0x08,0xE0,0x08,0x00,0x00,/*"学",6*/
0x00,0x00,0xFC,0xFF,0x04,0x10,0xF4,0x10,0x0C,0x8F,0x70,0x82,0x48,0x42,0x48,0x3E,0x48,0x02,0x4E,0x02,0x48,0x02,0x48,0xFE,0x48,0x82,0x08,0x82,0x78,0x72,0x00,0x00,/*"院",7*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",8*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",9*/0x00,0x00,0x80,0x00,0x80,0x01,0x80,0xC2,0x80,0xBC,0x80,0x44,0xC0,0x20,0x38,0x20,0x1C,0x10,0x60,0x20,0x80,0x40,0x80,0x5C,0x80,0xE2,0x80,0x01,0x80,0x00,0x80,0x00,/*"☆",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",1*/
0x00,0x00,0xF0,0x0F,0x90,0x08,0x88,0x08,0x88,0x08,0x88,0x08,0x88,0x08,0xFE,0xFF,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x90,0x88,0xF0,0x8F,0x00,0x60,0x00,0x00,/*"电",2*/
0x00,0x00,0x20,0x00,0x90,0x00,0xA8,0x00,0xA6,0x00,0xA4,0x00,0xA4,0x00,0xA4,0x00,0xA4,0x00,0xA4,0x00,0xA4,0x00,0xA4,0x00,0x24,0x1F,0x04,0xE0,0x00,0xE0,0x00,0x00,/*"气",3*/
0x00,0x00,0x04,0x80,0x04,0x80,0x04,0x80,0x04,0x80,0x04,0x80,0x04,0x80,0xFC,0xFF,0x04,0x80,0x04,0x80,0x04,0x80,0x04,0x80,0x04,0x80,0x04,0x80,0x00,0x80,0x00,0x00,/*"工",4*/
0x00,0x00,0x48,0x0C,0x48, www.lwfree.cn 0x44,0x89,0x44,0x89,0x3C,0x89,0x00,0x00,/*"程",5*/
0x00,0x00,0x00,0x80,0x04,0x62,0x44,0x12,0x64,0x0F,0x54,0x83,0xCC,0x82,0xC4,0xFE,0x44,0x02,0x24,0x02,0x34,0x06,0x14,0x1A,0x82,0x33,0x00,0xC6,0x00,0x00,0x00,0x00,/*"系",6*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",7*/
0x00,0x00,0x80,0x00,0x80,0x01,0x80,0xC2,0x80,0xBC,0x80,0x44,0xC0,0x20,0x38,0x20,0x1C,0x10,0x60,0x20,0x80,0x40,0x80,0x5C,0x80,0xE2,0x80,0x01,0x80,0x00,0x80,0x00,/*"☆",8*/
0x00,0x00,0xF8,0x03,0x28,0x01,0x24,0x01,0x04,0x41,0xFC,0x23,0x00,0x10,0x00,0x0C,0xFC,0x03,0x94,0x00,0x92,0x10,0x02,0x20,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,/*"明",0*/
0x00,0x04,0x20,0x02,0x10,0x3F,0xC8,0x00,0x26,0x10,0xC0,0x08,0x28,0x09,0xE8,0x12,0xA8,0x22,0xFF,0x2A,0x94,0x22,0x94,0x30,0x70,0x24,0x00,0x08,0x00,0x00,0x00,0x00,/*"德",1*/
0x00,0x08,0x00,0x04,0x00,0x03,0xFC,0x08,0x24,0x06,0xE4,0x01,0xA4,0x08,0x92,0x27,0x12,0x10,0x40,0x08,0x40,0x06,0xFE,0x11,0x20,0x18,0x20,0x0E,0xE0,0x01,0x00,0x00,/*"励",2*/
常用液晶显示模块驱动程序设计0x00,0x00,0x00,0x18,0x00,0x06,0x10,0x00,0x90,0x04,0x90,0x08,0x90,0x10,0x7F,0x12,0x48,0x24,0x48,0x20,0x08,0x28,0x08,0x31,0x00,0x22,0x00,0x04,0x00,0x00,0x00,0x00,/*"志",3*/
0x40,0x00,0x40,0x00,0x40,0x00,0xFE,0x7F,0x20,0x00,0x00,0x02,0xF0,0x02,0x14,0x06,0x54,0x0A,0xFF,0x22,0x2A,0x42,0x8A,0x7F,0x79,0x01,0x02,0x01,0x00,0x01,0x00,0x00,/*"博",4*/
0x00,0x00,0xC0,0x04,0x70,0x04,0x22,0x04,0x24,0x04,0xA0,0x04,0x52,0x24,0x54,0x43,0xD0,0x3E,0x58,0x02,0x17,0x02,0x10,0x02,0x30,0x02,0x10,0x00,0x00,0x00,0x00,0x00,/*"学",5*/
0x00,0x00,0x00,0x10,0x10,0x10,0x08,0x10,0x27,0x12,0xAC,0x0B,0x24,0x0A,0x1A,0x0A,0x94,0x09,0x73,0x09,0x06,0x29,0x0A,0x41,0x02,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,/*"笃",6*/
0x00,0x02,0x00,0x01,0x90,0x00,0xC8,0x1F,0x24,0x00,0x12,0x00,0x40,0x00,0x40,0x00,0x48,0x00,0x48,0x20,0xC8,0x7F,0x24,0x00,0x24,0x00,0x20,0x00,0x20,0x00,0x00,0x00,/*"行",7*/
0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0xF8,0x1F,0xF8,0x0F,0xF8,0x07,0xF8,0x03,0xF8,0x01,0xF8,0x00,0x78,0x00,0x38,0x00,0x18,0x00,0x08,0x00,0x00,0x00,0x00,0x00,/*"◤",0*/
0x00,0x02,0x04,0x01,0x84,0x00,0x44,0x00,0xE4,0xFF,0x34,0x09,0x2C,0x09,0x27,0x09,0x24,0x29,0x24,0x49,0x24,0xC9,0xE4,0x7F,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,/*"有",1*/
0x00,0x20,0x08,0x1C,0x48,0x00,0x48,0x00,0x48,0x3E,0x48,0x40,0x48,0x40,0x7F,0x41,0x48,0x4E,0x48,0x44,0x48,0x40,0x48,0x70,0x48,0x22,0x48,0x1C,0x08,0x08,0x00,0x00,/*"志",2*/
0x00,0x04,0x20,0x04,0x24,0x04,0x24,0x02,0x24,0x02,0x24,0xFF,0xA4,0x49,0xBF,0x49,0x64,0x49,0x24,0x49,0x34,0x49,0x28,0x49,0x26,0xFF,0x24,0x00,0x20,0x00,0x00,0x00,/*"者",3*/
0x02,0x02,0x02,0x02,0x82,0x0A,0xBA,0x0A,0xAA,0x2A,0xAA,0x4A,0xAA,0x8A,0xFF,0x7F,0xAA,0x0A,0xAA,0x0A,0xAA,0x0A,0xAA,0x0A,0xBA,0x1F,0x02,0x02,0x02,0x02,0x00,0x00,/*"事",4*/
0x10,0x00,0x14,0x00,0x14,0x00,0xD4,0x87,0x54,0x65,0x5C,0x1D,0x55,0x05,0x56,0x05,0x54,0x05,0x54,0x7D,0x5C,0x85,0xD4,0x87,0x14,0x80,0x14,0x80,0x10,0xE0,0x00,0x00,/*"竟",5*/
0x00,0x40,0x00,0x30,0xF8,0x0F,0x48,0x00,0x48,0x08,0x48,0x50,0xC8,0x4F,0x08,0x20,0xFF,0x10,0x08,0x0B,0x09,0x0C,0x0A,0x12,0xC8,0x21,0x88,0x40,0x08,0xF0,0x00,0x00,/*"成",6*/
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x18,0x00,0x38,0x00,0x78,0x00,0xF8,0x00,0xF8,0x01,0xF8,0x03,0xF8,0x07,0xF8,0x0F,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,/*"◥",7*/}; 附录C 芯片引脚图附录C.1 HD44780引脚图附图C.2 HD61202引脚图