1602液晶显示原理及其在单片机中的应用
基于Proteus仿真
前言:本文详细介绍了1602液晶显示器的工作原理,并在后面举例说明了其在单片机中的应用,所举例子包含Proteus仿真电路图,源程序,程序注释详细清楚。这有助于更好地理解与掌握1602液晶显示器。
1、1602 LCD基本参数:1602 LCD内置HD44780(目前市面上字符液晶绝大多数是基于
HD44780液晶芯片的,控制原理是完全相同的)专用液晶显示控制器,分为带背光和不带背光两种,带背光的比不带背光的厚,是否带背光在应用中并无差别。显示容量为16×2个字符,即可以显示2行,每行16个字符。芯片工作电压:4.5—5.5V;最佳工作电压为5.0V;工作电流:2.0mA(5.0V电压下);
(补充说明:在电子工业中,背光是一种照明的形式,常被用于LCD显示上。背光式和前光式不同之处在于背光是从侧边或是背后照射,而前光顾名思义则从前方照射。他们被用来增加在低光源环境中的照明度和电脑显示器、液晶荧幕上的亮度,以和CRT显示类似的方式产生出光。)
2、1602 LCD引脚功能:1602芯片(在
proteus中名字为LM016L) 采用标准的14脚(无背光)或16脚(带背光)接口,如右图所示,各引脚功能如下:
VSS:电源地 VDD:电源正极 VEE:液晶显示偏压,为对比度调整端,接正电源时对比度最弱,接地时对比度最高,
对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
(补充说明:整体回路中的某个点,测量它相对某个基准点的电压(是整体回路电压的1/n)就称之为该点的偏压,各段电路的偏压之和就是整体回路电压,相应位置的电流就是偏压电流。)
RS:数据/命令选择信号,高电平时选择数据寄存器、低电平时选择指令寄存器。 RW(read/write,读/写):读/写控制信号,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。 E (enable,使能):使能端,为1时读取信息,当E端由高电平跳变成低电平(下降沿)时,液晶模块执行命令。
D0~D7:8位双向数据线 BLA:背光源正极 BLK:背光源负极
3、1602 LCD指令说明及时序:
1 / 8
2012年8月10日星期五
(1)1602液晶模块内部的控制器共有11条控制指令,如表1所示:
注:DDRAM(display data RAM):显示数据寄存器:里面存放要显示的内容
CGRAM(character generator RAM)字符发生寄存器 表1:控制命令表
序号 1 指令 清屏 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 0 0 0 0 功能 1 清屏,即光标归位到00H位置,显示地址计数器的值清零,DDRAM的内容全部填充“空白”字符代码20H。 显示地址计数器的值清零,* 光标返回到显示屏00H位置。DDRAM的内容不变,即执行该指令不影响显示内容。 S 设置写入数据后光标移动方向,设定每次写入的字符是否移动 B 设置显示开关,光标开关,闪烁开关 * 设置字符与光标移动 * 设置数据长度,显示行数,点阵字体 设置6位的CGRAM地址以读/写数据 设置7位的DDRAM地址以读/写数据 读忙标志或地址计数器(光标地址) 2 光标归位 0 0 0 0 0 0 0 0 1 3 4 5 6 字符进入模式 显示开/关控制 光标或字符移位 功能设置 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 D I/D C * * 1 S/C R/L DL N F 7 设置字符发生寄存器地址 0 8 设置显示数据寄存器地址 0 9 10 11 读忙标志或地址计数器 写数据到CGRAM或DDRAM 0 1 字符发生寄存器地址 显示数据寄存器地址 计数器地址 1 BF 0 写入一字节数据,需要先设置RAM地址 向CGRAM/DDRAM写入一字节的数据 1 读取入一字节数据,需要先设置RAM地址 从CGRAM/DDRAM读取一字节的数据 从CGRAM或DDRAM读1 数据 I/D=0表示写入数据后光标左移,I/D=1表示写入数据后光标右移。 S=0 表示写入数据后显示屏不移动,S=1时,如果I/D =1且有字符写入时显示屏左移,否则右移。 (显示屏整体左移或右移,其实就是屏幕上所有文字左移或右移) D=1 显示屏开,D=0 显示屏关。 C=1 时光标出现在地址计数器所指的位置,C=0时光标不出现。 B=1 时光标闪烁,B=0时光标不闪烁。 S/C=0 ,RL=0时光标左移1位,地址计数器减1。(光标所在位置一般为地址计数器位置) S/C=0,RL=1时光标右移1位,地址计数器加1 。 S/C=1,RL=0时显示器上字符全部左移1个字符位置,光标保持不动。 S/C=1,RL=1时显示器上字符全部右移1个字符位置,光标保持不动。 DL=1 时数据长度为8位,DL=0 时为使用D7-D4共4位,分两次送一字节。 N=0为单行显示,N=1时为双行显示。 F=1 时为5×10点阵字体,F=0 时为5×7点阵字体。 BF=1 时LCD忙,此时模块不能接收命令或者数据;BF=0 时LCD就绪。
2 / 8
2012年8月10日星期五
(2)与HD44780相兼容的芯片时序表如下:
操作类型 读状态 写指令 读数据 写数据 输入 RS=L,R/W=H,E=H RS=L,R/W=L,D0—D7=指令码,E=高脉冲 RS=H,R/W=H,E=H RS=H,R/W=L,D0—D7=数据,E=高脉冲 输出 D0—D7=状态字 无 D0—D7=数据 无 (3)读操作时序:
(4)写操作时序:
4、1602 LCD的RAM地址映射及标准字库表:
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,如下图所示是1602的内部显示地址:
3 / 8
2012年8月10日星期五
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了192个不同的点阵字符图形,另外还有8个允许用户自定义的字符发生器(CGRAM)如图下图所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”
5、1602 LCD初始化:
1602LCD的一般初始化(复位)过程:(参照上面表1中的11条控制指令) 延时15mS
写指令38H(不检测忙信号) 延时5mS
4 / 8
2012年8月10日星期五
写指令38H(不检测忙信号) 延时5mS
写指令38H(不检测忙信号)
以后每次写指令、读/写数据操作均需要检测忙信号
写指令0x38:即0011 1000,对应第6条控制指令,指令功能为显示模式设置,DL=1表示输出数据长度为8位,N=1表示双行显示,F=0表示5×7点阵。
写指令0x08:显示关闭
写指令01H:即0000 0001,对应第1条指令,功能为清屏,光标归位。
写指令06H:即0000 0110,对应第3条指令,功能为显示光标移动设置,其中I/D=1表示写入数据后光标右移。S=0表示写入数据后字符不移动。
写指令0CH:即0000 1100,对应第4条指令,功能为显示开/关控制及光标设置,其中D=1 表示显示屏开,C=0表示光标不出现,B=1 时光标不闪烁,B=0表示光标不闪烁。
6、1602液晶显示器在单片机中的应用举例(一)
如下图所示,1602的数据端D0~D7连接单片机的P0口,RS、RW、E分别连接单片机的P2.0、P2.1、P2.2,对比度调整端VEE连接10K的电位器。 本例的功能为在1602LCD第一行显示东华理工大学网站名:www.ecit.edu.cn在第二行显示网名:luoyong199092.
5 / 8
2012年8月10日星期五
C程序如下: #include #define uchar unsigned char #define uint unsigned int void delay(uchar x) //延时函数,12MHZ晶振频率下,delay(1)延时0.992ms,大约为1ms {uchar i; while(x--) for(i=0;i<120;i++); } void delay4us() //12MHZ晶振频率下,延时4us {_nop_();_nop_();_nop_();_nop_();} uchar code dis1[]={\"www.ecit.edu.cn\uchar code dis2[]={\"luoyong199092\sbit rs=P2^0; sbit rw=P2^1; sbit en=P2^2; bit busy() //忙检测函数,返回忙标志位D7 { bit result; rs=0; //选择命令寄存器 rw=1; //读状态 en=1; //开始读 delay4us(); result=(bit)(P0&0X80); en=0; return result; } void wcmd(uchar cmd) //写命令函数 {while(busy()); //判断LCD是否忙碌 rs=0; //选择命令寄存器 rw=0; //写状态 en=0; _nop_();_nop_(); P0=cmd; delay4us(); en=1; delay4us();en=0; } void wdata(uchar dat) //写数据函数 {while(busy()); //判断LCD是否忙碌 rs=1; //选择数据寄存器 rw=0; //写状态 en=0; P0=dat;delay4us(); en=1;delay4us();en=0; 6 / 8 2012年8月10日星期五 } void setpos(uchar pos) //设置显示地址函数 {wcmd(pos+0x80); //由于写入显示地址时要求最高位D7恒定为高电平1, } //所以实际写入的数据应该是显示地址加上10000000B(即0x80) void init() //LCD初始化函数 {wcmd(0x38); delay(1); wcmd(0x0c); delay(1); wcmd(0x06); delay(1); wcmd(0x01); delay(1); } void main() {uchar i; init(); // 初始化LCD delay(10); setpos(0x01); //设置显示位置为第1行第2列 for(i=0;dis1[i]!='\\0';i++) //显示第1行字符 wdata(dis1[i]); setpos(0x42); // 设置显示位置为第2行第3列 for(i=0;dis2[i]!='\\0';i++) // 显示第2行字符 wdata(dis2[i]); while(1); } Proteus仿真运行结果如下: 7 / 8 2012年8月10日星期五 7、上述Proteus仿真文件下载地址:http://luoyong199092.qjwm.com/ 8、参考文献 [1]彭伟.单片机C语言程序设计实训100例.北京:电子工业出版社.2009 [2]贾振国,许琳.智能化仪器仪表原理及应用.北京:中国水利水电出版社.2011 8 / 8 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 69lv.com 版权所有 湘ICP备2023021910号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务