×

lcd1602引脚图及功能

lcd1602引脚图及功能(Protues中的LCD1602(lm016l)咋只有14个引脚的在Protues中有16引脚的没)

admin admin 发表于2023-01-24 17:52:54 浏览600 评论0

抢沙发发表评论

本文目录

Protues中的LCD1602(lm016l)咋只有14个引脚的在Protues中有16引脚的没

1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线

  VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中:
引脚符号功能说明
1VSS一般接地
2VDD接电源(+5V)
3V0液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
4RSRS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
5R/WR/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
6EE(或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 flang)
15BLA背光电源正极
16BLK背光 电源负极
在PROTUES中,一些引脚都是默认的,和51单片机的40脚意思差不多

基于DS1302与AT89C51的实时日历时钟的LCD显示程序你还有么还有图的

2.3.6 显示模块的设计
本设计中由于要对时间、温度进行显示,所以选择液晶显示屏1602模块作为输出。1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。管脚功能如表2-1所示。
表2-1 LCD1602引脚功能
引脚符号功能说明
1VSS一般接地
2VDD接电源(+5V)
3V0液晶显示器对比度调整端。
4RSRS为寄存器选择。
5R/WR/W为读写信号线。
6EE(或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位(最高位)
LCD1602主要管脚介绍:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生鬼影使用时可以通过一个10K的电位器调整对比度。RS为寄存器选择端,高电平时选择数据寄存器,低电平时选择指令寄存器。R/W为读写信号线端,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址;当RS为高电平R/W 为低电平时可以写入数据。E为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
将LCD1602的RS端和P2.0,R/W端和P2.1, E 端和P2.2相连,当RS=0时,对LCD1602写入指令;当RS=1时,对LCD1602写入数据。当R/W端接高电平时芯片处于读数据状态,反之处于写数据状态,E端为使能信号端。当R/W为高电平,E端也为高电平,RS为低电平时,液晶显示屏显示需要显示的示数。图2.11为1602液晶显示屏与单片机的硬件连接图。
图2.11 LCD液晶显示与单片机硬件连线图
附录二 部分程序说明
void delay(uint xms) //*******延时函数,有参函数*****//
{ uint x,y;
for(x=xms;x》0;x--)
for(y=110;y》0;y--);
}
//******ds18b20芯片有关子程序******/
void DS18B20_init() //****初始化
{ uint i; tem_ds=0;
i=160; while(i》0) //给DS18B20单总线至少480uS的低电平信号
i--; tem_ds=1; //拉高15~60uS
i=8; while(i》0) i--;
}
void temwritebit(bit instruc_data) //*****写一位*******//
{ int time;
if(instruc_data)
{ tem_ds=0;
time=3; //延时14us
while(time》0)
time--;
tem_ds=1; //写“1“
time=8; //延时35us
while(time》0)
time--;
}
else
{
tem_ds=0; //写0
time=14; //延时62us
while(time》0)
time--;
}
tem_ds=1; //释放数据线
time++;time++;
}
bit temreadbit() //*********读一位*********//
{ uint i;
bit datbit;
tem_ds=0;
i++;
tem_ds=1;
i++;i++;
datbit=tem_ds; //读数据
i=10; //延时45 
while(i》0)
i--;
tem_ds=1;
return(datbit);
}
uchar temreadbyte() //********读字节*********//
{ uchar i,j,dat;
dat=0;
for(i=0;i《8;i++)
{ j=temreadbit() ;
dat=(j《《7)|(dat》》1);
}
return(dat);
}
void temwritebyte(uchar instru) //********写字节*********//
{ int i;
for(i=0;i《8;i++)
{temwritebit(instru&01);
instru》》=1;
}
}
uint get_tem() //********获取温度*******//
{ uchar tem_L,tem_H;
DS18B20_init();
delay(1);
temwritebyte(0xcc); //写跳过ROM指令;
temwritebyte(0xbe); //读数据
tem_L=temreadbyte();
tem_H=temreadbyte();
tem=tem_H《《8|tem_L;
f_tem=tem*0.0625;
tem=f_tem ;
return (tem);
}
//******液晶相关程序******/
write_1602com(uchar com) //****液晶写入指令函数****//
{ rs=0; //数据/指令选择置为指令
rw=0; //读写选择置为写
P0=com; //送入数据
delay(1);
en=1; //拉高使能端,为制造有效的下降沿做准备
delay(1);
en=0; //en由高变低,产生下降沿,液晶执行命令
}
write_1602dat(uchar dat) //***液晶写入数据函数****//
{ rs=1; //数据指令选择置为数据
rw=0; //读写选择置为写
P0=dat; //送入数据
delay(1);
en=1; //en置高电平,为制造下降沿做准备
delay(1);
en=0; //en由高变低,产生下降沿,液晶执行命令
}
lcd_init() //***液晶初始化函数****//
{ write_1602com(0x38); //设置液晶工作模式 意思:16*2行显示,5*7点阵,8位数据
write_1602com(0x01); //清显示
write_1602com(0x06); //整屏不移动,光标自动右移
write_1602com(yh+1); //日历显示固定符号从第一行第1个位置之后开始显示
write_1602com(0x0c); //开显示不显示光标
for(a=0;a《14;a++)
{ write_1602dat(tab1); //向液晶屏写日历显示的固定符号部分
delay(3);
}
write_1602com(er+2); //时间显示固定符号写入位置,从第2个位置后开始显示
for(a=0;a《8;a++)
{write_1602dat(tab2); //写显示时间固定符号,两个冒号
delay(3);
}
}
/***************DS1302有关子函数********************/
void write_byte(uchar dat) //*******写一个字节*****//
{ ACC=dat;
RST=1;
for(a=8;a》0;a--)
{ IO=ACC0;
SCLK=0; /*在控制指令字输入后的下一个SCLK时钟的上升沿时*/
SCLK=1; /*数据被写入DS1302*/
ACC=ACC》》1;
}
}
uchar read_byte() //******读一个字节******//
{ RST=1;
for(a=8;a》0;a--)
{ ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC》》1;
}
return (ACC);
}
void write_1302(uchar add,uchar dat) //****向1302芯片写函数,指定写入地址,数据**//
{ RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add) //****从1302读数据函数,指定读取数据来源地址***//
{ uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd) //*****BCD码转十进制函数****//
{ uchar Decimal;
Decimal=bcd》》4; //BCD高四位表示十位,低四位个位,8421码;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
void ds1302_init() //***1302芯片初始化子函数(2010-01-07,12:00:00,week4)***//
{ RST=0;
SCLK=0;
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00
write_1302(0x82,0x00); //向DS1302内写分寄存器82H写入初始分数据00
write_1302(0x84,0x12); //向DS1302内写小时寄存器84H写入初始小时数据12
write_1302(0x8a,0x04); //向DS1302内写周寄存器8aH写入初始周数据4
write_1302(0x86,0x07); //向DS1302内写日期寄存器86H写入初始日期数据07
write_1302(0x88,0x01); //向DS1302内写月份寄存器88H写入初始月份数据01
write_1302(0x8c,0x10); //向DS1302内写年份寄存器8cH写入初始年份数据10
write_1302(0x8e,0x80); //打开写保护
}
void write_temp(uchar add,uchar dat) //****向LCD写温度数据,并指定显示位置****//
{ uchar gw,sw;
gw=dat%10; //取得个位数字
sw=dat/10; //取得十位数字
write_1602com(er+add); //er是头文件规定的值0x80+0x40
write_1602dat(0x30+sw); //数字+30得到该数字的LCD1602显示码
write_1602dat(0x30+gw); //数字+30得到该数字的LCD1602显示码
write_1602dat(0xdf); //显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码
write_1602dat(0x43); //显示“C“符号,0x43是液晶屏字符库里大写C的地址码
}
void write_sfm(uchar add,uchar dat) //向LCD写时分秒,有显示位置加显示数据,两个参数
{uchar gw,sw;
gw=dat%10; //取得个位数字
sw=dat/10; //取得十位数字
write_1602com(er+add); //er是头文件规定的值0x80+0x40//年月日显示将er改为yh即可,其他相同;
write_1602dat(0x30+sw); //数字+30得到该数字的LCD1602显示码
write_1602dat(0x30+gw); //数字+30得到该数字的LCD1602显示码
}
void write_week(uchar week) //****写星期函数*****//
{ write_1602com(yh+0x0c); //星期字符的显示位置
switch(week)
{ case 1:write_1602dat(’M’); //星期数为1时,显示
write_1602dat(’O’);
write_1602dat(’N’);
break; //下面六种选择形式相同将括号中的字符相应修改就行了
}
}
void keyscan() //****************键盘扫描有关函数**********************
{ if(key1==0) //key1为功能键(设置键)
{delay(9); //延时,用于消抖动
if(key1==0) //延时后再次确认按键按下
{buzzer=0; //蜂鸣器短响一次
delay(20);
buzzer=1;
while(!key1); //按键等待释放
key1n++;
if(key1n==9)
key1n=1; //设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环
switch(key1n)
{ case 1: TR0=0; //关闭定时器
write_1602com(er+0x09); //设置按键按动一次,秒位置显示光标
write_1602com(0x0f); //设置光标为闪烁
temp=(miao)/10*16+(miao)%10; //秒数据写入DS1302
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp); //miao
write_1302(0x8e,0x80);
break;
case 2: write_1602com(er+6); //按2次fen位置显示光标
write_1602com(0x0f); //下面case3~case7基本相同,改变地址就行了
case 8: write_1602com(0x0c); //按动到第8次,设置光标不闪烁
TR0=1;//打开定时器
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao数据写入DS1302
write_1302(0x8e,0x80);
break;
}
}
}
//------------------------------加键key2----------------------------
if(key1n!=0) //当key1按下以下。再按以下键才有效(按键次数不等于零)
{if(key2==0) //上调键
{delay(10);
if(key2==0)
{buzzer=0; //蜂鸣器短响一次
delay(20);
buzzer=1;
while(!key2);
switch(key1n)
{ case 1:miao++; //设置键按动1次,调秒
if(miao==60)
miao=0;
write_sfm(0x08,miao);
temp=(miao)/10*16+(miao)%10; //十进制转换成DS1302要求的BCD码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x80,temp); ;//向DS1302内写秒寄存器80H写入调整后的数据BCD码
write_1302(0x8e,0x80); //打开写保护
write_1602com(er+0x09); //因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
//下面case2~case7和case1相同将相应的地址改一下就行了。
}
}
}
下面的key3与加键key2形式基本相同;
}
}
void init() //定时器、计数器设置函数
{ TMOD=0x01; //指定定时/计数器的工作方式为1
TH0=0; //定时器T0的高四位=0
TL0=0; //定时器T0的低四位=0
EA=1; //系统允许有开放的中断
ET0=1; //允许T0中断
TR0=1; //开启中断,启动定时器
}
void main() //*********主函数********
{ lcd_init(); //调用液晶屏初始化子函数
ds1302_init(); //调用DS1302时钟的初始化子函数
init(); //调用定时计数器的设置子函数
buzzer=0; //蜂鸣器长响一次
delay(80);
buzzer=1;
while(1) //无限循环下面的语句:
{keyscan();} //调用键盘扫描子函数
}
Void timer0() interrupt 1 //取得并显示日历和时间
{ TH0=0; //重复初始值
TL0=0;
DS18B20_init();
delay(1);
temwritebyte(0xcc); //写跳过ROM指令;
temwritebyte(0x44); //启动温度转换;
flag=get_tem(); //将18b20运行返回的函数结果送到变量flag中,用于显示
//读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样):
miao = BCD_Decimal(read_1302(0x81));//下面分秒年月日形式相同,改变地址就可以了
//显示温度、秒、时、分数据:
write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示
write_sfm(8,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数)
write_sfm(5,fen);//分,从第二行第5个字符后开始显示
write_sfm(2,shi);//小时,从第二行第2个字符后开始显示
//显示日、月、年数据:
write_nyr(9,ri);//日期,从第二行第9个字符后开始显示
write_nyr(6,yue);//月份,从第二行第6个字符后开始显示
write_nyr(3,nian);//年,从第二行第3个字符后开始显示
write_week(week);
}

proteus中lcd1602

proteus中的LCD1602,并不是叫这个名,而是叫LM016L,所以,你搜LCD1602肯定是找不到的。所在的类别、子类及名称如下图
仿真效果如下图
如果非要改成LCD1602,可以的名称改一下就行,不影响仿真效果的。如下图

LCD1602与LCD12864

在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。
那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的’A’在字模的记载方式如图1所示:
图1 “A”字模图
而中文的“你”在字模中的记载却如图2所示:
图2 “你”字模图
12864点阵型LCD简介
12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。可完成图形显示,也可以显示8×4个(16×16点阵)汉字。
管脚号
管脚名称
LEVER
管脚功能描述

1
VSS
0
电源地

2
VDD
+5.0V
电源电压

3
V0
-
液晶显示器驱动电压

4
D/I(RS)
H/L
D/I=“H”,表示DB7∽DB0为显示数据
D/I=“L”,表示DB7∽DB0为显示指令数据

5
R/W
H/L
R/W=“H”,E=“H”数据被读到DB7∽DB0
R/W=“L”,E=“H→L”数据被写到IR或DR

6
E
H/L
R/W=“L”,E信号下降沿锁存DB7∽DB0
R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0

7
DB0
H/L
数据线

8
DB1
H/L
数据线

9
DB2
H/L
数据线

10
DB3
H/L
数据线

11
DB4
H/L
数据线

12
DB5
H/L
数据线

13
DB6
H/L
数据线

14
DB7
H/L
数据线

15
CS1
H/L
H:选择芯片(右半屏)信号

16
CS2
H/L
H:选择芯片(左半屏)信号

17
RET
H/L
复位信号,低电平复位

18
VOUT
-10V
LCD驱动负电压

19
LED+
-
LED背光板电源

20
LED-
-
LED背光板电源
表1:12864LCD的引脚说明
在使用12864LCD前先必须了解以下功能器件才能进行编程。12864内部功能器件及相关功能如下:
1. 指令寄存器(IR)
IR是用于寄存指令码,与数据寄存器数据相对应。当D/I=0时,在E信号下降沿的作用下,指令码写入IR。
2.数据寄存器(DR)
DR是用于寄存数据的,与指令寄存器寄存指令相对应。当D/I=1时,在下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7∽DB0数据总线。DR和DDRAM之间的数据传输是模块内部自动执行的。
3.忙标志:BF
BF标志提供内部工作情况。BF=1表示模块在内部操作,此时模块不接受外部指令和数据。BF=0时,模块为准备状态,随时可接受外部指令和数据。
利用STATUS READ指令,可以将BF读到DB7总线,从检验模块之工作状态。
4.显示控制触发器DFF
此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY OFF),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。
DDF的状态是指令DISPLAY ON/OFF和RST信号控制的。
5.XY地址计数器
XY地址计数器是一个9位计数器。高3位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。
X地址计数器是没有记数功能的,只能用指令设置。
Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。
6.显示数据RAM(DDRAM)
DDRAM是存储图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择。DDRAM与地址和显示位置的关系见DDRAM地址表。
7.Z地址计数器
Z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST复位后Z地址计数器为0。
Z地址计数器可以用指令DISPLAY START LINE预置。因此,显示屏幕的起始行就由此指令控制,即DDRAM的数据从哪一行开始显示在屏幕的第一行。此模块的DDRAM共64行,屏幕可以循环滚动显示64行。
12864LCD的指令系统及时序
该类液晶显示模块(即KS0108B及其兼容控制驱动器)的指令系统比较简单,总共只有七种。其指令表如表2所示:
指令名称
控制信号
控制代码

R/W
RS
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0

显示开关
0
0
0
0
1
1
1
1
1
1/0

显示起始行设置
0
0
1
1
X
X
X
X
X
X

页设置
0
0
1
0
1
1
1
X
X
X

列地址设置
0
0
0
1
X
X
X
X
X
X

读状态
1
0
BUSY
0
ON/OFF
RST
0
0
0
0

写数据
0
1
写数据

读数据
1
1
读数据
表2:12864LCD指令表
各功能指令分别介绍如下。
显示开/关指令
R/WRS
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0

00
00111111/0
当DB0=1时,LCD显示RAM中的内容;DB0=0时,关闭显示。
2、显示起始行(ROW)设置指令
R/WRS
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0

00
11显示起始行(0~63)
该指令设置了对应液晶屏最上一行的显示RAM的行号,有规律地改变显示起始行,可以使LCD实现显示滚屏的效果。
3、页(PAGE)设置指令
R/WRS
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0

00
10111页号(0~7)
显示RAM共64行,分8页,每页8行。
4、列地址(Y Address)设置指令
R/WRS
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0

00
01显示列地址(0~63)
设置了页地址和列地址,就唯一确定了显示RAM中的一个单元,这样MPU就可以
用读、写指令读出该单元中的内容或向该单元写进一个字节数据。
5、读状态指令
R/WRS
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0

10
BUSY0ON/OFFREST0000
该指令用来查询液晶显示模块内部控制器的状态,各参量含义如下:
BUSY:1-内部在工作0-正常状态
ON/OFF:1-显示关闭0-显示打开
RESET:1-复位状态0-正常状态
在BUSY和RESET状态时,除读状态指令外,其它指令均不对液晶显示模块产生作用。
在对液晶显示模块操作之前要查询BUSY状态,以确定是否可以对液晶显示模块进行操作。
6、写数据指令
R/WRS
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0

01
写数据
读数据指令
R/WRS
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0

11
读显示数据
读、写数据指令每执行完一次读、写操作,列地址就自动增一。必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。