1602介绍时序图
- 格式:pdf
- 大小:244.61 KB
- 文档页数:5
概述:SMC1602A 标准字符点阵型液晶显示模块(LCM),采用点阵型液晶显示器(LCD),可显示16 个字符X2 行西文字符,字符尺寸为2.95X4.35(WXH)mm,内置HD44780 接口型液晶显示控制器,可与MCU 单片机直接连接,广泛应用于各类仪器仪表及电子设备。
◆控制器接口说明(HD44780 及兼容芯片):1 基本操作时序:1.1 读状态:输入:RS=L,RW=H,E=H 输出:D0~D7=状态字1.2 写指令:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲输出:无1.3 读数据:输入:RS=H,RW=H,E=H 输出:D0~D7=数据1.4 写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲输出:无3 RAM 地址映射图控制器内部带有80X8 位(80字节)的RAM缓冲区,对应关系如右图所示:4 指令说明4.1 初始化设置4.1.1 显示模式设置4.1.2 显示开/关及光标设置4.2 数据控制控制器内部设有一个数据地址指针,用户可通过它们来访问内部的全部 80 字节RAM。
4.2.1 数据指针设置4.2.2 读数据:见1.3 节4.2.3 写数据:见1.4 节4.2.4 其他设置5 初始化过程(复位过程)5.1 写指令38H:显示模式设置第一次5.2 延时3ms5.3 写指令38H:显示模式设置第二次5.4 延时3ms5.5 写指令38H:显示模式设置第三次5.6 延时3ms5.7 写指令38H:显示模式设置第四次5.8 延时3ms5.9 写指令08H:显示关闭5.10 写指令01H:显示清屏5.11 延时3ms5.12 写指令06H:显示光标移动设置5.13 写指令0CH:显示开及光标设置。
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”字的代码就行了。
但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。
那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。
第二行也一样用前16个地址。
对应如下:DDRAM地址与显示位置的对应关系(事实上我们往DDRAM里的00H地址处送一个数据,譬如0x31(数字1的代码)并不能显示1出来。
这是一个令初学者很容易出错的地方,原因就是如果你要想在DDRAM的00H地址处显示数据,则必须将00H加上80H,即80H,若要在DDRAM的01H处显示数据,则必须将01H加上80H即81H。
依次类推。
大家看一下控制指令的的8条:DDRAM地址的设定,即可以明白是怎么样的一回事了)1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B (41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”上表中的字符代码与我们PC中的字符代码是基本一致的。
10.8.2.1 1602LCD的基本参数及引脚功能1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图10-54所示:图10-54 1602LCD尺寸图1602LCD主要技术参数:显示容量:16×2个字符芯片工作电压:4.5—5.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm引脚功能说明1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:编号符号引脚说明编号符号引脚说明1 VSS 电源地9 D2 数据2 VDD 电源正极10 D3 数据3 VL 液晶显示偏压11 D4 数据4 RS 数据/命令选择12 D5 数据5 R/W 读/写选择13 D6 数据表10-13:引脚接口说明表第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脚:背光源负极。
10.8.2.3 1602LCD的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:表10-14:控制命令表1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
一、关于LCD1602:在编写LCD1602程序前,我们必须了解其手册上一些非常重要的信息,如果这些信息不能理解透彻,编程可能会遇到或多或少的问题,在此先大致归纳几点。
1.管脚:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。
以下具体阐述这三个管脚:RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。
R/W为读写选择,高电平进行读操作,低电平进行写操作。
E端为使能端,后面和时序联系在一起。
除此外,D0~D7分别为8位双向数据线。
2.操作时序:信号真值表RS R/W EN 操作说明0 0 1→0 写入指令D0~D70 1 1 读出的D0~D7状态字1 0 1→0 写入D0~D7数据1 1 1 读出D0~D7数据注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;所以对控制器每次进行读写操作前,必须进行读写检测。
(即后面的读忙子程序)3.指令集:LCD_1602 初始化指令小结:0x38 设置16*2显示,5*7点阵,8位数据接口0x01 清屏0x0f 开显示,显示光标,光标闪烁0x08 关闭显示0x0e 开显示,显示光标,光标不闪烁0x0c 开显示,不显示光标0x06 地址加1,当写入数据的时候光标右移0x02 地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变0x18 光标和显示一起向左移动4.显示地址:LCD1602内部RAM显示缓冲区地址的映射图,00~0F、40~4F分别对应LCD1602的上下两行的每一个字符,只要往对应的RAM地址写入要显示字符的ASCII代码,就可以显示出来。
5.读写时序:时序图1602手册中有,这里不引用了。
LCD1602液晶显示屏幕时序图分析
这段时间里回头看看所学的单片机知识,发现一个很严重的问题看不懂时序图!研究了一上午说说自己的结果,欢迎各位拍砖和指点!
图7.2.2是1602液晶写的时序,时序图从上到下看、从左到右看。
先说说时序图的规则:
高低电平上面的线是高电平,下面的线是低电平,如果高低交叉可能会产生高电平或低电平。
电平的走向看到低电平和高电平交叉产生电平的变化,
看到红圈花的部分,竖线那里有条横线,代表着这个选用的是高电平。
还有一种情况这种情况是高低电平一起变化,看图中横线标出了电平的变化。
现在我们了解完了规则,现在分析时序图
原图我进行了标号。
时序图从上往下看,从左往右看
1 rs 为高电平 rw 为低电平
2 载入数据db
3 始能e由低电平变为高电平
4和5 始能e由高电平转化为低电平最后数据写完。
这个就是我的理解,如果有错误或不对的地方欢迎指正。
如何看懂时序图This model paper was revised by the Standardization Office on December 10, 2020时序图,LCD1602前面总算走完了对AVR MEGA16这块单片机的一些基本的应用方式了,这时候大家对AVR的一些内部资源比如定时器,ADC,最主要的IO口的使用方式应该有了一个虽比较粗浅但是却比较形象的认识了。
这节我们来看使用单片机的另外一大主题,就是用单片机来实现芯片控制。
在前面的数码管显示一文中,就已经涉及到了用单片机来控制芯片为我们工作,CEPARK AVR开发板,为了达到增强驱动能力和节省IO口的作用,运用了移位寄存器74HC595来驱动两个四位八段数码管,是一个十分有创意的设计。
但是前面的内容重心还是集中于对AVR的IO口的控制,所以,我们从这节开始要正式逐渐深入的接触各种芯片了。
先做个引子。
单片机是一种微控制器,本身内部集成了数种资源比如CPU、内存、内部和外部总线系统,目前大部分还会具有外存。
他的主要任务是利用各种资源实现电平控制,可以以此控制与它相连的下级系统,广泛用于工业自动控制领域。
我们就从这句话出发,首先单片机是用来做控制用的,而且利用的是本身的内部资源。
但是,它的功能再强大,资源再丰富也总有一个上限,总有枯竭的一天。
所以我们常常利用单片机外接芯片来弥补或者增强单片机的功能来完成我们所需功能的电路。
比如程序存储器不足,可以外接外部存储器,比如单片机内部中断级不足,可以外接中断控制器等等。
大家可以从这个角度来理解芯片控制的意义罢。
今天我们用AVR单片机来实现对LCD1602液晶显示芯片的控制。
首先从这个名字讲起,LCD:英文全称为Liquid Crystal Display,即为液态晶体显示,也就是我们常说的液晶显示了。
(平时老说LCDLCD,可能大家也都不怎么注意过这个全称吧,呵呵,当增加词汇量了)1602则是表示这个液晶一共能显示2行数据,每一行显示16个字符。
在日常生活中,我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表与很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比一样显示面积的传统显示器要轻得多。
功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
10.8.1 液晶显示简介①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除了黑白显示外,液晶显示器还有多灰度有彩色显示等。
如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。
③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
10.8.2.1 1602LCD的基本参数及引脚功能1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图10-54所示:图10-54 1602LCD尺寸图1602LCD主要技术参数:显示容量:16×2个字符芯片工作电压:4.5—5.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm引脚功能说明1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:表10-13:引脚接口说明表第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脚:背光源负极。
10.8.2.3 1602LCD的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:表10-14:控制命令表1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。
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;。
简介
工业字符型液晶,能够同时显示16x02即32个字符。
(16列2行) 注:为了表示的方便,后文皆以1表示高电平,0表示低电平。
管脚功能
引脚说明
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)端,下降沿使能。
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):在此位为被清除为0时,LCD将无法再处理其他的指令要求。
字符集
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H 中的点阵字符图形显示出来,我们就能看到字母“A”。
因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如'A’。
以下是1602的16进制ASCII码表:
(图片打开是大图)
读的时候,先读上面那列,再读左边那行,如:感叹号!的ASCII 为0x21,字母B的ASCII为0x42(前面加0x表示十六进制)。
显示地址
12345678910111213141516 00H01H02H03H04H05H06H07H08H09H0AH0BH0CH0DH0EH0FH 40H41H42H43H44H45H46H47H48H49H4AH4BH4CH4DH4EH4FH 指令集
1602通过D0~D7的8位数据端传输数据和指令。
显示模式设置:(初始化)
0011 1000 [0x38] 设置16×2显示,5×7点阵,8位数据接口;
显示开关及光标设置:(初始化)
0000 1DCB D显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)
0000 01NS N=1(读或写一个字符后地址指针加1 &光标加1),
N=0(读或写一个字符后地址指针减1 &光标减1),
S=1 且 N=1 (当写一个字符后,整屏显示左移)
s=0 当写一个字符后,整屏显示不移动
数据指针设置:
数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H) 其他设置:
01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)。
通常推荐的初始化过程:
延时15ms
写指令38H
延时5ms
写指令38H
延时5ms
写指令38H
延时5ms
(以上都不检测忙信号)
(以下都要检测忙信号)
写指令38H
写指令08H 关闭显示
写指令01H 显示清屏
写指令06H 光标移动设置
写指令0cH 显示开及光标设置
完毕
Proteus仿真
使用Proteus仿真1602--即LM016L--依照数据手册说明可能遇到困难,可以尝试采用以下方案解决:
1、数据手册中可能介绍1602内部D0~D7已有上拉,可以使用P0口直接驱动。
在Proteus里LM016L内部可能没有,应该人为
加上拉电阻。
建议不要使用排阻,使用普通电阻一个一个拉应该可以解决问题;
2、可能碰到不能检测忙信号的问题,尝试使用延时把忙信号拖过去。
基本的读写时序图
读写操作时序如图1和2所示:
写操作时序:
读操作时序:。