单片机LCD液晶显示的接法.docx
《单片机LCD液晶显示的接法.docx》由会员分享,可在线阅读,更多相关《单片机LCD液晶显示的接法.docx(21页珍藏版)》请在冰豆网上搜索。
单片机LCD液晶显示的接法
51单片机综合学习之1602字符型液晶显示篇
在日常生活中,咱们对液晶显示器并非陌生。
液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都能够看到,显示的主若是数字、专用符号和图形。
在单片机的人机交流界面中,一样的输出方式有以下几种:
发光管、LED数码管、液晶显示器。
发光管和LED数码管比较经常使用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。
在单片机系统中应用晶液显示器作为输出器件有以下几个优势:
显示质量高
由于液晶显示器每一个点在收到信号后就一直维持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且可不能闪烁。
数字式接口
液晶显示器都是数字式的,和单片机系统的接口加倍简单靠得住,操作加倍方便。
体积小、重量轻
液晶显示器通过显示屏上的电极操纵液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
功耗低
相对而言,液晶显示器的功耗要紧消耗在其内部的电极和驱动IC上,因此耗电量比其它显示器要少得多。
10.8.1液晶显示简介
①液晶显示原理
液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行操纵,有电就有显示,如此即能够显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被普遍应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类
液晶显示的分类方式有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除黑白显示外,液晶显示器还有多灰度有彩色显示等。
若是依照驱动方式来分,能够分为静态驱动(Static)、单纯矩阵驱动(SimpleMatrix)和主动矩阵驱动(ActiveMatrix)三种。
③液晶显示器各类图形的显示原理:
线段的显示
点阵图形式液晶由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)=00H时,那么在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。
这确实是LCD显示的大体原理。
字符的显示
用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。
如此一来就组成某个字符。
但由于内带字符发生器的操纵器来讲,显示字符就比较简单了,能够让操纵器工作在文本方式,依照在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。
汉字的显示
汉字的显示一样采纳图形的方式,事前从微机中提取要显示的汉字的点阵码(一样用字模提取软件),每一个汉字占32B,分左右两半,各占16B,左侧为一、3、5……右边为二、4、6……依照在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就能够够LCD上取得一个完整汉字。
10.8.21602字符型LCD简介
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前经常使用16*1,16*2,20*2和40*2行等的模块。
下面以长沙太阳人电子的1602字符型液晶显示器为例,介绍其用法。
一样1602字符型液晶显示器实物如图10-53:
图10-531602字符型液晶显示器实物图
10.1602LCD的大体参数及引脚功能
1602LCD分为带背光和不带背光两种,基操纵器大部份为HD44780,带背光的比不带背光的厚,是不是带背光在应用中并无不同,二者尺寸不同如以下图10-54所示:
图10-541602LCD尺寸图
1602LCD要紧技术参数:
显示容量:
16×2个字符
芯片工作电压:
—
工作电流:
模块最正确工作电压:
字符尺寸:
×(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
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
表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.31602LCD的指令说明及时序
1602液晶模块内部的操纵器共有11条操纵指令,如表10-14所示:
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
表10-14:
操纵命令表
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:
1为高电平、0为低电平)
指令1:
清显示,指令码01H,光标复位到地址00H位置。
指令2:
光标复位,光标返回到地址00H。
指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移S:
屏幕上所有文字是不是左移或右移。
高电平表示有效,低电平那么无效。
指令4:
显示开关操纵。
D:
操纵整体显示的开与关,高电平表示开显示,低电平表示关显示C:
操纵光标的开与关,高电平表示有光标,低电平表示无光标B:
操纵光标是不是闪烁,高电平闪烁,低电平不闪烁。
指令5:
光标或显示移位S/C:
高电平常移动显示的文字,低电平常移动光标。
指令6:
功能设置命令DL:
高电平常为4位总线,低电平常为8位总线N:
低电平常为单行显示,高电平常双行显示F:
低电平常显示5x7的点阵字符,高电平常显示5x10的点阵字符。
指令7:
字符发生器RAM地址设置。
指令8:
DDRAM地址设置。
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,现在模块不能接收命令或数据,若是为低电平表示不忙。
指令10:
写数据。
指令11:
读数据。
与HD44780相兼容的芯片时序表如下:
读状态
输入
RS=L,R/W=H,E=H
输出
D0—D7=状态字
写指令
输入
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
输出
无
读数据
输入
RS=H,R/W=H,E=H
输出
D0—D7=数据
写数据
输入
RS=H,R/W=L,D0—D7=数据,E=高脉冲
输出
无
表10-15:
大体操作时序表
读写操作时序如图10-55和10-56所示:
图10-55读操作时序
图10-56写操作时序
10.8.2.41602LCD的RAM地址映射及标准字库表
液晶显示模块是一个慢显示器件,因此在执行每条指令之前必然要确认模块的忙标志为低电平,表示不忙,不然此指令失效。
要显示字符时要先输入显示字符地址,也确实是告知模块在哪里显示字符,图10-57是1602的内部显示地址。
图10-571602LCD内部显示地址
例如第二行第一个字符的地址是40H,那么是不是直接写入40H就能够够将光标定位在第二行第一个字符的位置呢?
如此不行,因为写入显示地址时要求最高位D7恒定为高电平1因此实际写入的数据应该是01000000B(40H)+B(80H)=B(C0H)。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符光阴标是自动右移的,无需人工干与。
每次输入指令前都要判定液晶模块是不是处于忙的状态。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有:
阿拉伯数字、英文字母的大小写、经常使用的符号、和日文化名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,咱们就能够看到字母“A”
图10-58字符代码与图形对应图
10.8.2.51602LCD的一样初始化(复位)进程
延时15mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:
显示模式设置
写指令08H:
显示关闭
写指令01H:
显示清屏
写指令06H:
显示光标移动设置
写指令0CH:
显示开及光标设置
10.8.31602LCD的软硬件设计实例
在1602LCD第一行显示网站名:
在第二行显示联系:
8。
实验前应先将显示切换开关心换到LCD工作状态。
图10-591602LCD实验演示图
10.8.3.1硬件原理图
1602液晶显示模块能够和单片机AT89C51直接接口,电路如图10-60所示。
图10-60硬件原理图
10.8.3.2程序流程图
图10-61软件流程图
10.8.3.3软件代码
/***************************************************************************/
/*杭州电子&运算机工作室*/
/*演示程序*/
/*目标器件:
AT89S51*/
/*晶振:
*/
/*编译环境:
Keil*/
/***************************************************************************/
/*********************************包括头文件********************************/
#include<>
#include<>
/*********************************端口概念**********************************/
sbitrs=P2^0;
sbitrw=P2^1;
sbitep=P2^2;
/********************************显示数据表*********************************/
unsignedcharcodedis1[]={""};
unsignedcharcodedis2[]={"8"};
/*****************************************************************************
函数功能:
LCD延时子程序
入口参数:
ms
出口参数:
*****************************************************************************/
voiddelay(unsignedcharms)
{
unsignedchari;
while(ms--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*****************************************************************************
函数功能:
测试LCD忙碌状态
入口参数:
出口参数:
result
*****************************************************************************/
bitlcd_bz()
{
bitresult;
rs=0;
rw=1;
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P0&0x80);
ep=0;
returnresult;
}
/*****************************************************************************
函数功能:
写指令数据到LCD子程序
入口参数:
cmd
出口参数:
*****************************************************************************/
voidlcd_wcmd(unsignedcharcmd)
{
while(lcd_bz());//判定LCD是不是忙碌
rs=0;
rw=0;
ep=0;
_nop_();
_nop_();
P0=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
/*****************************************************************************
函数功能:
设定显示位置子程序
入口参数:
pos
出口参数:
*****************************************************************************/
voidlcd_pos(unsignedcharpos)
{
lcd_wcmd(pos|0x80);
}
/*****************************************************************************
函数功能:
写入显示数据到LCD子程序
入口参数:
dat
出口参数:
*****************************************************************************/
voidlcd_wdat(unsignedchardat)
{
while(lcd_bz());//判定LCD是不是忙碌
rs=1;
rw=0;
ep=0;
P0=dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
/*****************************************************************************
函数功能:
LCD初始化子程序
入口参数:
出口参数:
*****************************************************************************/
voidlcd_init()
{
lcd_wcmd(0x38);
delay
(1);
lcd_wcmd(0x0c);
delay
(1);
lcd_wcmd(0x06);
delay
(1);
lcd_wcmd(0x01);
delay
(1);
}
/*****************************************************************************
函数功能:
主程序
入口参数:
出口参数:
*****************************************************************************/
voidmain(void)
{
unsignedchari;
lcd_init();//初始化LCD
delay(10);
lcd_pos(0x01);//设置显示位置
i=0;
while(dis1[i]!
='\0')
{
lcd_wdat(dis1[i]);//显示字符
i++;
}
lcd_pos(0x42);//设置显示位置
i=0;
while(dis2[i]!
='\0')
{
lcd_wdat(dis2[i]);//显示字符
i++;
}
while
(1);
}