1602字符液晶显示原理+实例详解新手必看
- 格式:doc
- 大小:724.00 KB
- 文档页数:16
单片机1602液晶显示原理
首先,从硬件连接方面来看,单片机与1602液晶显示器之间的连接通常需要16个引脚。
这些引脚包括数据总线(D0-D7)、控制引脚(RS、RW、E)以及电源和地线。
数据总线用于传输要显示的数据,而控制引脚用于控制液晶显示器的工作状态。
单片机通过这些引脚与液晶显示器进行通信,从而实现对显示内容的控制。
其次,从工作原理方面来看,单片机控制1602液晶显示器的基本原理是利用单片机的IO口向液晶显示器发送指令和数据。
当单片机需要在液晶显示器上显示内容时,首先需要向液晶显示器发送控制指令,如清屏、定位光标等,然后再发送要显示的数据。
液晶显示器接收到指令和数据后,根据单片机发送的信号来控制液晶显示器的内部驱动电路,从而在屏幕上显示相应的内容。
总的来说,单片机1602液晶显示原理涉及到单片机与液晶显示器之间的硬件连接和通信协议。
通过单片机向液晶显示器发送指令和数据,实现对液晶显示器显示内容的控制。
这样的设计使得单片机能够方便地控制液晶显示器,实现各种复杂的显示效果。
1602液晶资料一、介绍1602液晶是一种常见的字符型液晶显示器,可以显示16列2行共32个字符。
它采用了液晶显示技术,使得显示效果更加清晰、稳定。
1602液晶广泛应用于各种嵌入式系统、电子设备以及 DIY 项目中。
本文将介绍1602液晶的基本原理、接口定义、使用方法以及常见应用场景。
二、基本原理1602液晶的基本原理是利用液晶分子的取向和电场作用的变化来改变光的透过与反射。
它由1602个独立的像素(80列×2行)组成,每个像素有一个电极对和一个液晶分子,液晶分子的取向可以通过施加电场来改变。
1602液晶由背光源、液晶面板、驱动电路和控制电路等组成,背光源提供背光使得字符能够显示在显示器上。
三、接口定义1602液晶显示器通常通过并行接口与主控单元进行通信,下面是1602液晶的常用接口定义:•DB0-DB7:并行数据接口,用于传输数据与指令。
•RS:指令/数据选择信号,用于控制将数据写入显示器还是发送给控制器.•R/W:读/写选择信号,用于选择进行读操作或写操作。
•E:使能信号,用于控制读写操作的时序。
•VSS:地线,用于提供电流的回路。
•VDD:电源正极,提供1602液晶的工作电源。
•V0:液晶偏置电压,通过该电压设置液晶显示的对比度。
•A:背光灯电源正极,提供背光灯的工作电源。
•K:背光灯电源负极,提供背光灯工作电流的回路。
四、使用方法使用1602液晶显示器需要以下步骤:1.连接电路:根据接口定义,将1602液晶与主控单元进行正确的连接。
注意接线的准确性,以免引起电路故障。
2.初始化:在使用1602液晶之前,需要对其进行初始化。
初始化的过程一般包括设置显示模式、清屏以及设置光标位置等。
3.写入数据:通过并行接口将想要显示的数据或指令传输给1602液晶,可以显示各种字符、数字、符号等。
4.控制显示:通过指令设置1602液晶的显示方式,包括光标显示、光标闪烁、显示开关等。
5.清屏:清除1602液晶的显示内容,可以使用指令或者写入空格字符来实现。
1602液晶字符显示屏的原理管脚功能/1602字符液晶编辑1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中:引脚符号功能说明1VSS一般接地2VDD接电源(+5V)3V0液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
4RS RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
5R/W R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
6E E(或EN)端为使能(enable)端,写操作时,下降沿使能。
读操作时,E高电平有效7DB0低4位三态、双向数据总线0位(最低位)8DB1低4位三态、双向数据总线1位9DB2低4位三态、双向数据总线2位10DB3低4位三态、双向数据总线3位11DB4高4位三态、双向数据总线4位12DB5高4位三态、双向数据总线5位13DB6高4位三态、双向数据总线6位14DB7高4位三态、双向数据总线7位(最高位)(也是busy flag)15BLA背光电源正极16BLK背光电源负极寄存器选择控制表RS R/W操作说明00写入指令寄存器(清除屏等)01读busy flag(DB7),以及读取位址计数器(DB0~DB6)值10写入数据寄存器(显示各字型等)11从数据寄存器读取数据注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.busy flag(DB7):在此位为1时,LCD忙,将无法再处理其他的指令要求。
字符集/1602字符液晶编辑1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
lcd1602液晶屏显示原理LCD1602液晶屏显示LCD1602液晶屏是一种广泛应用于嵌入式系统中的设备,其主要作用是显示文字和图像。
下面我们将从液晶屏的基本构成、显示原理、控制方式等方面进行详细介绍。
基本构成LCD1602液晶屏的主要构成有以下几个部分:•LCD显示区域:是液晶屏的主要显示部分,通常由16x2的字符点阵组成。
•背光源:为了方便在低光环境下观察屏幕内容,液晶屏通常都有背光源,可以显示白色、蓝色等不同颜色。
•驱动电路板:液晶屏需要通过电路来进行控制。
驱动电路板是一个电路板,上面有各种电子元器件,如芯片、晶振、电容、电阻等。
显示原理LCD1602液晶屏工作的原理是基于液晶分子的光学变化。
液晶屏的显示区域由若干个液晶单元组成,每个液晶单元是由一个薄膜晶体管(TFT)和一个电容组成的。
当液晶单元受到电压作用时,会发生形变,从而改变光线的传播方向,从而实现显示。
控制方式LCD1602液晶屏的控制方式通常采用微处理器进行控制。
常用的控制方式有以下几种:•8位并行控制:使用8根数据线,可以同时传输8位二进制数据,速度快,适用于需要传输大量数据的应用场景。
•4位并行控制:使用4根数据线,需要进行两次数据传输才能完成一次指令或数据的传输,速度比较慢,但可以降低接口引脚数量,适用于资源受限的系统。
•串行控制:使用单根数据线,数据按照一定的格式进行传输,速度较慢,但可以进一步减少接口引脚数量。
总结综上所述,LCD1602液晶屏是一种常用于嵌入式系统中的设备,其所采用的液晶分子光学变化原理是实现显示的基础,常用的控制方式有8位并行控制、4位并行控制和串行控制三种。
液晶屏在嵌入式系统中发挥着重要的作用,广泛应用于各种计算机设备、仪器仪表、通讯设备等方面。
接下来,我们将详细介绍液晶屏的控制流程和相关指令。
控制流程LCD1602液晶屏的控制流程通常包括以下大致步骤:1.初始化液晶屏:向液晶屏发送一系列指令,包括设置接口方式、显示模式、光标定位等。
1602详细资料和实例1602字符液晶在实际的产品中运用的也比较多了,前几天留意了一下,发现宿舍门前的自动售水机就是采用的1602液晶进行显示的。
而且对于单片机的学习而言,掌握1602的用法是每一个学习者必然要经历的过程。
在此,我将使用1602过程中遇到的问题以及感受记录下来,希望能够给初学者带来一点指导,少走一点弯路。
所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
1602液晶的正面(绿色背光,黑色字体)1602液晶背面(绿色背光,黑色字体)另一种1602液晶模块,显示屏是蓝色背光白色字体字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:HD44780内置了DDRAM、CGROM和CGRAM。
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。
共80个字节,其地址和屏幕的对应关系如下表:也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码(指A的字模代码,0x20~0x7F为标准的ASCII码,通过这个代码,在CGROM中查找到相应的字符显示)就行了。
但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。
那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。
第二行也一样用前16个地址。
对应如下:DDRAM地址与显示位置的对应关系。
(事实上我们往DDRAM里的00H地址处送一个数据,譬如0x31(数字1的代码,见字模关系对照表)并不能显示1出来。
这是一个令初学者很容易出错的地方,原因就是如果你要想在DDRAM的00H地址处显示数据,则必须将00H加上80H,即80H,若要在DDRAM的01H处显示数据,则必须将01H加上80H即81H。
lcd1602的显示原理
LCD1602是一款16×2字符液晶显示模块,其显示原理基于液
晶分子的电光效应。
液晶分子是一种有机分子,在没有电场时,其分子内部呈现随机排列的状态,不会通过光线的传播。
然而,当液晶分子受到电场的作用时,它们会改变自身的方向,从而使光线能够通过。
在LCD1602中,液晶分子被夹在两片平行的透明电极之间。
这两片电极由透明导电材料(如氧化铟锡)制成,通过外部电源提供电压。
当电压施加在电极上时,液晶分子会重新排列,形成一个规则的结构。
在LCD1602的背光灯亮起的情况下,LCD的每个字符位置由
一个位于背光层后面的液晶单元组成。
液晶单元可以看作一个微小的透明窗口,它由液晶分子和两片玻璃之间的色素层组成。
当液晶分子处于无电场状态时,色素层会吸收背光光线,使液晶单元呈现黑色。
而当液晶分子受到电场的作用时,它们会重新排列,色素层对背光光线的吸收减少,使液晶单元呈现透明状态。
通过控制液晶分子的排列方式,可以实现对字符的显示。
LCD1602通过与微控制器(如Arduino)连接,通过微控制器
发送指令和数据来控制液晶模块的显示内容。
具体来说,微控制器通过发送脉冲来改变电场的方向和强度,从而控制液晶分子的排列方式。
然后,显示模块将电场信息转化为对应的字符显示。
LCD1602的简单使用原理——跟大家分享我学习1602的总结与体会我的总结主要分为这几部分:①LCD1602的硬件特性及引脚功能②LCD1602的时序特性③LCD1602的使用原理(包括带字库和不带字库的简要使用方法,控制显示指令)④基于FPGA的LCD1602使用案例Part 1. LCD1602的硬件特性及引脚功能LCD1602顾名思义是一种02*16,即为两行十六列的液晶显示屏,液晶两行,每行可以显示16个字符,但是CGRAM及CGROM里面一共有160个字符,包括阿拉伯数字,英文字母大小写,常用符号及日文。
每个字符对应于一个ASCII码值,在液晶显示屏上显示对应的字符时候,只需要将对应的ASCII码写到DDRAM中就好,详细的步骤会在下面细说。
液晶板上排列着5*8的字符点阵,8行,每行5个点位,高电平1就是该点显示,低电平0就是该点不显示。
一、引脚功能:RS,R/W,E控制数据端口DB0~DB7,数据的命令的读写由控制端口控制,并通过数据端口传输。
端口其他特性这里不再赘述,详细见1602液晶手册。
O(∩_∩)O二、硬件特性:①CGRAM 和CGROMCGRAM:character generator ram CGROM:character generator romCGRAM的地址空间:CGRAM的地址是0x40~0x7F, 64个地址空间,每个地址双字节,一共128字节,一个字符是8个字节,所以一共能显示8个自定义字符(每个双字节地址只有一个字节是被自定义字符数据写入的,另外个字节无效,因为CGARM的字符代码的规定,详细原因见下面)字符对应的区位码如下图所示:CGRAM: 字符产生ram,用来存放用户自定义的字符,如上图的两条(1)~(8),区位码为0x00~0x0F.0x00~0x07对应于(1)~(8);0x08~0x0F对应于下一条(1)~(8),虽然看起来有16个地址,但是其实只要8个地址可用,CGRAM的“字符码”规定0~2为地址,3位无效,4~7位全为0,因此CGRAM的字符码等效为0000X111,X为无效位,最后三位的地址只要八个,所以实际能用的只有8个。
1602字符型液晶显示篇1602字符型液晶显示篇《电子制作》2008年1月站长原创,如需引用请注明出处在日常生活中,我们对液晶显示器并不陌生?液晶显示模块已作为很多电子产品的通过器件,如在计算器?万用表?电子表及很多家用电子产品中都可以看到,显示的主要是数字?专用符号和图形?在单片机的人机交流界面中,一般的输出方式有以下几种:发光管?LED数码管?液晶显示器?发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用?在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点?因此,液晶显示器画质高且不会闪烁?数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便?体积小?重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多?功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多?1 液晶显示简介①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形?液晶显示器具有厚度薄?适用于大规模集成电路直接驱动?易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑?数字摄像机?PDA移动通信工具等众多领域?②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式?字符式?点阵式等?除了黑白显示外,液晶显示器还有多灰度有彩色显示等?如果根据驱动方式来分,可以分为静态驱动(Static)?单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种?③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应?例如屏的第一行的亮暗由RAM区的000H—00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=0 0H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线?这就是LCD显示的基本原理?字符的显示用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮?这样一来就组成某个字符?但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可?汉字的显示汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1?3?5……右边为2?4?6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字?2 1602字符型LCD简介字符型液晶显示模块是一种专门用于显示字母?数字?符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块?下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法?一般1602字符型液晶显示器实物如图1:图11602字符型液晶显示器实物图1.1602LCD的基本参数及引脚功能1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图2所示:图21602LCD尺寸图1602LCD主要技术参数:显示容量:16×2个字符芯片工作电压: 工作电流:模块最佳工作电压:字符尺寸:×(W×H)mm引脚功能说明1602LCD采用标准的141所示:编号符号引脚说明1VSS电源地2VDD电源正极3VL液晶显示偏压4RS数据/命令选择5R/W读/写选择6E使能信号7D0数据8D1数据9D2数据10D3数据11D4数据12D5数据13D6数据14D7数据15BLA背光源正极16BLK背光源负极第1脚: VSS为地电源?第2脚: VDD接5V正电源?第3脚: VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度?第4脚: RS为寄存器选择,高电平时选择数据寄存器?低电平时选择指令寄存器?第5脚: R/W为读写信号线,高电平时进行读操作,低电平时进行写操作?当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS 为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据?第6脚: E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令?第7~14脚: D0~D7为8位双向数据线?第15脚: 背光源正极?第16脚: 背光源负极?2.1602LCD的指令说明及时序表2:控制命令表1602液晶模块的读写操作?屏幕和光标的操作都是通过指令编程来实现的?(说明:1为高电平?0为低电平)指令1: 清显示,指令码01H,光标复位到地址00H位置?指令2: 光标复位,光标返回到地址00H?指令3: 光标和显示模式设置I/D: 光标移动方向,高电平右移,低电平左移S: 屏幕上所有文字是否左移或者右移?高电平表示有效,低电平则无效?指令4: 显示开关控制?D: 控制整体显示的开与关,高电平表示开显示,低电平表示关显示C: 控制光标的开与关,高电平表示有光标,低电平表示无光标B: 控制光标是否闪烁,高电平闪烁,低电平不闪烁?指令5: 光标或显示移位该指令设置光标和画面的特性?S/C: 滚动对像的选择,高电平时移动显示的文字,低电平时移动光标?S/C=1画面滚动S/C=0光标滚动R/L:滚动方向的选择R/L=1向右滚动R/L=0向左滚动指令6: 功能设置命令DL: 低电平时为4位总线,高电平时为8位总线N: 低电平时为单行显示,高电平时双行显示F: 低电平时显示5x7的点阵字符,高电平时显示5x11的点阵字符?指令7: 字符发生器RAM地址设置?指令8: DDRAM地址设置?指令9: 读忙信号和光标地址BF: 忙标志位,高电平表示忙,此时模块不接收命令或者数据,如为低,表示不忙?指令10: 写数据?指令11: 读数据?状态字:,低7位为当前数据指针的地址值(即AC值);如下表:,都要确认该位值为0才可进行操作?AC6~0为7位的AC值,表示当前数据指针的地址值?DL: 设置控制器与MCU的接口形式,一般设置为1;DL=1: 数据总线宽度为8位,即DB7~DB0有效;DL=0: 数据总线宽度为4位,即DB7~DB4有效;N: 设置显示字符的行数,1602 LCD一般都设置为1;N=0: 为一行字符;N=1: 为两行字符;F: 设置显示字符的字体,一般设置为0;F=0: 为5X7点阵字符体;F=1: 为5X11点阵字符体;显示状态设置指令:该指令控制着画面?光标和闪烁的开与关?D: 画面显示状态位;D=1为显示开,D=0为显示关;该指令仅影响显示屏的开关,并不影响显存中的数据? C:光标显示状态位;C=1光标显示;C=0光标不显示?B:闪烁显示状态位;B=1时闪烁启动;B=0时闪烁关闭;闪烁只对于当前地址指针指和的字符位有效?光标或画面滚动设置指令:S/C:滚动对像的选择S/C=1 画面滚动S/C=0 光标滚动R/L:滚动方向的选择R/L=1 向右滚动R/L=0 向左滚动输入方式设置指令:该指令的功能在于设置显示字符的输入方式,即在操作数据写入/读出后,AC数据地址指针的修改方式?I/D: I/D=0 AC为自动减1的计数器,操作数据后AC自动减一;I/D=1 AC为自动加1计数器,操作数据后AC自动加1;S: 设置写入字符数据时是否允许画面滚动/光标移动(AC自动变化) S=0 禁止S=1 允许清屏指令:该指令将空格码(0x20)写入显存中;达到清屏显示的功能?归位指令:该指令将6位的CGRAM地址写入地址指针计数器AC内,随后的对数据的操作是对CGRAM的读/读操作?注: CGRAM为用户自定义字符字符的空间,并非对应LCD屏上字符位置的显存(DDRAM)?AC当中,随后的数据操作是对DDRAM(显存)的读/写操作?读数据输入RS=H,R/W=H,E=H输出D0~D7=数据写数据输入RS=H,R/W=L,D0~D7=数据,E=高脉冲输出无表3:基本操作时序表读写操作时序如图3和图4所示:图3读操作时序图4写操作时序3.1602LCD的RAM地址映射及标准字库表液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效?要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图5是1602的内部显示地址?图51602LCD内部显示地址例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+B(80H)=B(C0H)?在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预?每次输入指令前都要判断液晶模块是否处于忙的状态?1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图6所示,这些字符有:阿拉伯数字?英文字母的大小写?常用的符号?和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”.图6字符代码与图形对应图4.1602LCD的一般初始化(复位)过程延时15ms 写指令38H(不检测忙信号)延时5ms写指令38H(不检测忙信号)延时5ms写指令38H(不检测忙信号)以后每次写指令?读/写数据操作均需要检测忙信号写指令38H:显示模式设置写指令08H:显示关闭写指令01H:显示清屏写指令06H:显示光标移动设置写指令0CH:显示开及光标设置写指令0CH :显示开及光标设置延时5ms写指令38H (不检测忙信号BF )延时5ms写指令38H (不检测忙信号BF )延时5ms写指令38H (不检测忙信号BF )写指令38H :显示模式设置写指令08H :显示关闭写指令01H :显示清屏写指令06H :显示光标移动设置写指令38H (不检测忙信号BF )3 1602LCD 的软硬件设计实例在1602LCD 第一行显示网站名:在第二行显示联系电话:8?实验前应先将显示切换开关切换到LCD 工作状态?图71602LCD实验演示图1.硬件原理图1602液晶显示模块可以和单片机AT89C51直接接口,电路如图8所示?图8硬件原理图2.程序流程图图9软件流程图3.软件代码/************************************************************** *************/ /*杭州电子&计算机工作室*//*演示程序*//*目标器件:AT89S51*//*晶振:*//*编译环境:Keil 7.50A*//************************************************************** *************/ /*********************************包含头文件********************************/ #include <>#include <>/*********************************端口定义**********************************/ sbit rs = P1^0;sbit rw = P1^1;sbit ep = P1^2;/********************************显示数据表*********************************/ unsigned char code dis1[] = {""};unsigned char code dis2[] = {"099"};/************************************************************** ***************函数功能:LCD延时子程序入口参数:ms出口参数:*************************************************************** **************/ void delay(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}/************************************************************** ***************函数功能:测试LCD忙碌状态入口参数:出口参数:result*************************************************************** **************/ bit lcd_bz(){bit result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_();result = (bit)(P0 & 0x80);ep = 0;return result;}/************************************************************** ***************函数功能:写指令数据到LCD子程序入口参数:cmd出口参数:*************************************************************** **************/ void lcd_wcmd(unsigned char cmd){while(lcd_bz()); //判断LCD是否忙碌rs = 0;rw = 0;ep = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();ep = 0;}/************************************************************** ***************函数功能:设定显示位置子程序入口参数:pos出口参数:*************************************************************** **************/ void lcd_pos(unsigned char pos){lcd_wcmd(pos | 0x80);}/************************************************************** ***************函数功能:写入显示数据到LCD子程序入口参数:dat出口参数:*************************************************************** **************/ void lcd_wdat(unsigned char dat){while(lcd_bz()); //判断LCD是否忙碌rs = 1;rw = 0;ep = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();ep = 0;}/************************************************************** ***************函数功能:LCD初始化子程序入口参数:出口参数:*************************************************************** **************/ void lcd_init(){lcd_wcmd(0x38);delay(1);lcd_wcmd(0x0c);delay(1);lcd_wcmd(0x06);delay(1);lcd_wcmd(0x01);delay(1);}/************************************************************** ***************函数功能:主程序入口参数:出口参数:*************************************************************** **************/ void main(void){unsigned char i;lcd_init(); //初始化LCDdelay(10);lcd_pos(0x01); //设置显示位置i = 0;while(dis1[i] != '\0'){lcd_wdat(dis1[i]); //显示字符i++;}lcd_pos(0x40); //设置显示位置i = 0;while(dis2[i] != '\0'){lcd_wdat(dis2[i]); //显示字符i++;}while(1){;};}/************************************************************** *************标题: LCD1602效果: 本程序在液晶LCD1602上显示两行字符工作于:51开发板作者: 孟庆全网站:*************************************************************** *************/#include ""/********IO引脚定义***********************************************************/sbit LCD_RS=P1^0; //定义引脚sbit LCD_RW=P1^1;sbit LCD_E=P1^2;/********宏定义**************************************************************/ #define LCD_Data P0#define Busy0x80//用于检测LCD状态字中的Busy标识/********数据定义*************************************************************/ unsigned char code uctech[] = {"Happy every day"};unsigned char code net[] = {""};/********函数声明*************************************************************/ void WriteDataLCD(unsigned char WDLCD); //写数据void WriteCommandLCD(unsigned char WCLCD,BuysC); //写命令unsigned char ReadDataLCD(void); //读数据unsigned char ReadStatusLCD(void); //读状态void LCDInit(void); //初始化void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData); //相应坐标显示字节内容void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData); //相应坐标开始显示一串内容void Delay5ms(void); //延时void Delay400ms(void); //延时/***********主函数开始********************************************************/ void main(void){Delay400ms(); //启动等待,等LCD讲入工作状态LCDInit(); //初始化Delay5ms(); //延时片刻(可不要)DisplayListChar(0,0,uctech);DisplayListChar(1,5,net);ReadDataLCD(); //测试用句无意义while(1);}/***********写数据***********************************************************/ void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD(); //检测忙LCD_Data = WDLCD;LCD_RS = 1;LCD_RW = 0;LCD_E = 0; //若晶振速度太高可以在这后加小的延时LCD_E = 0; //延时LCD_E = 1;}/***********写指令**********************************************************/ void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCD(); //根据需要检测忙LCD_Data = WCLCD;LCD_RS = 0;LCD_RW = 0;LCD_E = 0;LCD_E = 0;LCD_E = 1;}/***********读数据*************************************************************/ unsigned char ReadDataLCD(void){LCD_RS = 1;LCD_RW = 1;LCD_E = 0;LCD_E = 0;。