聪明文档网

聪明文档网

最新最全的文档下载
当前位置: 首页> 第四讲: LCD(1602)介绍使用与实验

第四讲: LCD(1602)介绍使用与实验

时间:    下载该word文档
第四讲LCD1602)介绍、使用与实验
郧阳师专电工电子实验教学中心艾庆生

我们接下来的课程实验里,基本都采用自己设计的单片机最小系统板(母版)通过搭接不同的模块,实现和满足我们的实验要求。(故要求同学们最好每个人都自己焊接一块该母版)
一、LED数码管的优缺点(与LCD液晶比较)

二、LCD1602显示器资料
1602是液晶里较简单的一种,它只能显示固定的2行字符(每行16个字符)不能任意显示点阵图形。1.外形尺寸和形状如下图


1

2.主要技术参数

3.16根引脚说明
1602采用标准的16脚接口,其中:
1脚:VSS为地电源
2脚:VDD5V正电源
3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度
最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS
RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。714脚:D0D78位双向数据线。15脚:背光源正极16脚:背光源负极


2

4.1602的字符发生存储器(CGROM
1602液晶模块内部的字符发生存储器(CGROM已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母A”的代码是01000001B41H,显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A

5.160211条控制指令

它的读写操作、屏幕和光标的操作都是通过指令编程来实现的(说明:1高电平、0为低电平)(当RS0时,全是命令或读状态,为1时,是读写数

3

据。
指令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地址设置指令8DDRAM地址设置
指令9读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能
接收命令或者数据,如果为低电平表示不忙。
指令10写数据指令11读数据
三、LCD160251单片机接口
有两种方式:总线连接和直接连接方式,如下图所示。

4


我们的母版的连接图如下所示,采用的是直接连接方式。


原理图


PCB板截图
5


焊上液晶160212864插座后的图

正在液晶显示的实物图
四、液晶1602的编程1.读忙标志
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
6


2.先输入显示字符地址
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。

比如第二行第一个字符的地址是40H那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7
1

01000000B
40H+10000000B(80H=11000000B(C0H3.初始化过程
初始化过程
7



五、编程(汇编语言)
;**************************************************;STC89C52单片机&LCD1602测试程序;版本V1.02008/07/20;作者:王怀博
;**************************************************

LCM_RS
EQUP2.0;定义控制接口EQUP2.1
EQUP2.2
LCM_RWLCM_E
LCM_DATAEQUP1;定义数据接口;**************************************************;主程序

ORG

0000H
LJMPMAIN
SP,#60H;堆栈指针指向70H
MAIN:MOV
LCALLINITIAL;调用启动LCM子程序进行初始化LCALLCLS;调用清除LCM子程序

8

MOVA,#80H;A送立即数80H设定显示地址为第一行第一列LCALLWRITE_COM;调用写指令到LCM子程序MOV

DPTR,#LINE1;将第一行字符串的启始地址送如DPTR
LCALLDISP;调用显示字符串到LCM子程序
LCALLYS20MS



MOVA,#0C0H;A送立即数0C0H设显示地址为第二行第一列
LCALLWRITE_COM;调用写指令到LCM子程序
MOV

DPTR,#LINE2;将第二行字符串的启始地址送如DPTR
LCALLDISP;调用显示字符串到LCM子程序LCALLYS20MS
LCALLYS20MS
LJMP

MAIN
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>INITIAL:MOV
A,#38H;启动LCM子程序
LCALLWRITE_COMMOV
A,#0EH
LCALLWRITE_COMMOVA,#06HLCALLRET
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>CHECK_BUSY:PUSHACC;查询忙碌信号子程序BUSY_LOOP:CLRLCM_ESETBLCM_RWCLRLCM_RSSETBLCM_EMOVA,LCM_DATACLRLCM_E
JBACC.7,BUSY_LOOP
WRITE_COM
9

POPACC
LCALLDELRET
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>WRITE_COM:LCALLCHECK_BUSY;写指令到LCM子程序CLRLCM_ECLRLCM_RSCLRLCM_RWSETBLCM_EMOVLCM_DATA,ACLRLCM_ERET
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>WRITE_DATA:LCALLCHECK_BUSY;写数据到LCM子程序CLRLCM_ESETBLCM_RSCLRLCM_RWSETBLCM_EMOVLCM_DATA,ACLRLCM_ERET
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>CLS:MOVLCALLRET
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>DEL:MOVD1:MOVDJNZ
R2,#5;2.7MS延时子程序R3,#248R3,$
A,#01H;清除LCM子程序WRITE_COM
10

DJNZRET
R2,D1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>DISP:PUSHACC;A的内容压栈DISP_LOOP:CLRA;A清零MOVCJZ
A,@A+DPTR;查表将字符串内容送入AEND_DISP;若查到的内容为0则终止查表
LCALLWRITE_DATA;调用写数据到LCM子程序INCSJMPEND_DISP:POPRET
DPTR;DPTR1指向下一个对象DISP_LOOP;跳转到DISP_LOOP循环执行ACC;弹出压栈内容至A


;************************************************;延时20MS子程序
YS20MS:MOVR6,#250YS0:MOVR5,#250DJNZR5,$


DJNZR6,YS0RET
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>LINE1:DB"MainboardTest",00H;第一行字符串LINE2:DB"E&EDemoCenter",00H;第二行字符串
;************************************************************ENDC语言)
/*********LCD总函数库调用说明*******************使用时在main开始中加LcdReset(;语句*********Lcd1Char(X,Y,'V';//某位置显示某一字符*****X要显示列的位置
11

Y要显示行的位置
'V'要显示的单个字符,必须要用''括起来;''0x20为空字符,表示在该位置消除字符;****LcdNChar(X,Y,N,*P;//连续显示N个字符******X要显示的列的位置
Y要显示的行的位置(1602只有01N要显示的字符的个数
*P表示显示的字符存放的位置指针*///#defineunsignedcharunsignedchar//#defineunsignedintunsignedint
#includereg52.h
unsignedcharcodexianshi0[8]="Welcome!";
unsignedcharcodexianshi1[16]="0123456789ABCDEF";
sbitlcdrs=P2^0;//设置RS的口sbitlcdrw=P2^1;//设置R/Wsbitlcden=P2^2;//设置EN的口//整个p1为数据并口传输
voiddelay(unsignedintz{}
/*******************************************************************//*检查LCD忙状态*//*lcd_busy1时,忙,等待。lcd-busy0,闲,可写指令与数据。*/
unsignedintx,y;for(x=z;x>0;x--
for(y=110;y>0;y--;
12

/*******************************************************************/voidlcd_busy(
{bitresult;
do{
lcdrs=0;//选择命令寄存器lcdrw=1;//选择“读”操作lcden=1;//使能LCD1602delay(5;
P1=0xFF;//为读入做准备
result=(bit(P1&0x80;//读入P1.7lcden=0;//释放LCD1602
}
while(result;//判断P1.7,若为高电平返回继续读
}
voidwrite_com(unsignedcharcom//发送指令函数{
lcdrs=0;//0为指令,1为数据lcdrw=0;
lcden=0;}
P1=com;delay(5;lcden=1;delay(5;lcden=0;
13

voidwrite_data(unsignedchardate//发送数据函数(0x20是空){
lcdrs=1;//0为指令,1为数据lcdrw=0;
lcden=0;}
voidLcdReset(//程序初始化{
delay(15;
write_com(0x38;//开启液晶
delay(5;//00001DCBwrite_com(0x38;//开启液晶delay(5;
write_com(0x38;//开启液晶delay(5;
lcd_busy(;//检测“忙”信号
write_com(0x0c;//显示液晶开/,光标,闪烁delay(5;
lcd_busy(;//检测“忙”信号
write_com(0x06;//光标后/+1,整屏右移delay(5;
lcd_busy(;//检测“忙”信号write_com(0x01;//清屏
delay(5;P1=date;delay(5;lcden=1;delay(5;lcden=0;
14

}
voidLocateXY(unsignedcharx,unsignedchary{
unsignedchartemp;
temp=x&0x0f;y&=0x01;
if(ytemp|=0x40;//如果在第2行,x的值要加40H
temp|=0x80;//然后无论是第0行还是第1行,都要再加80Hlcd_busy(;//检测“忙”信号
write_com(temp;}
voidLcd1Char(unsignedcharx,unsignedchary,unsignedchardate{
LocateXY(x,y;


lcd_busy(;//检测“忙”信号}
voidLcdNChar(unsignedcharx,unsignedchary,unsignedcharn,unsignedchar*ptr{
unsignedchari;
for(i=0;i{
Lcd1Char(x++,y,ptr[i];if(x==0x10write_data(date;

15



{
x=0;
y^=1;//按位异或}
voidmain({
unsignedchari;
LcdReset(;//液晶初始化for(i=0;i<8;i++{
Lcd1Char(i+4,0,xianshi0[i];}
LcdNChar(0,1,16,xianshi1;here:gotohere;}
2011-3-26二稿于师专2013-7-20三稿于师专(十堰)
}
}
16

  • 29.8

    ¥45 每天只需1.0元
    1个月 推荐
  • 9.9

    ¥15
    1天
  • 59.8

    ¥90
    3个月

选择支付方式

  • 微信付款
郑重提醒:支付后,系统自动为您完成注册

请使用微信扫码支付(元)

订单号:
支付后,系统自动为您完成注册
遇到问题请联系 在线客服

常用手机号:
用于找回密码
图片验证码:
看不清?点击更换
短信验证码:
新密码:
 
绑定后可用手机号登录
请不要关闭本页面,支付完成后请点击【支付完成】按钮
遇到问题请联系 在线客服