1、实物图
2、原理图
3、原理介绍
LCD1602:LCD1602液晶显示器是一种广泛使用的字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路及其扩展驱动电路,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。用于显示字母、数字和符号等的点阵式LCD,总共可以显示两行数据,每行可以显示16个数据。
在哪显示:
LCD1602可以显示16*2个字符且通过D0-D7八个引脚传输八位数据,每一个显示的位置都对应上图的一个地址。例如我想在第一行的第三个位置显示,那么就可以锁定上表中的“02”,换算成二进制就是0000 0010。听上去很简单,但是LCD1602有个特点就是写入显示地址时要求最高位 D7 恒定为高电平。所以我们想显示真实的地址应该为1000 0010。如果在第二行的第三个位置显示,那么就可以锁定上表中的“42”,换算成二进制就是0100 0010,加上最高位 D7 恒定为高电平。所以我们想显示真实的地址应该为1100 0010。
怎么显示:
在LCD1602的手册中给出了这样一个表格,我们想显示表格中的字符只需获取某个字符的高位和低位即可。例如我想显示“A”这个字符,就是0100 0001转换成16进制就是0x41,刚好对应‘A’的ASCLL码65。当然我们在编程的时候无需这样操作,只需输入字符即可,编译器会自动编译成对应的ASCLL码。
说到这里会发现无论是传输地址的指令还是传输字符的指令都是通过D0-D7这八根线进行传输,那么我们什么时候传输的数据,什么时候传输的是地址呢。我们靠的是在1602上的RS引脚,RS为高电平1时选择数据寄存器(写数据)、低电平0时选择指令寄存器(写地址)。
4、引脚定义
引脚号 | 符号 | 引脚说明 | 引脚号 | 符号 | 引脚说明 |
1 | VSS | 电源地 | 9 | D2 | 数据端口 |
2 | VDD | 电源正极 | 10 | D3 | 数据端口 |
3 | VO | 偏压信号 | 11 | D4 | 数据端口 |
4 | RS | 命令/数据 | 12 | D5 | 数据端口 |
5 | RW | 读/写 | 13 | D6 | 数据端口 |
6 | E | 使能 | 14 | D7 | 数据端口 |
7 | D0 | 数据端口 | 15 | A | 背光正极 |
8 | D1 | 数据端口 | 16 | K | 背光负极 |
- VSS接电源地。
- VDD接+5V。
- VO为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”现象,使用时可以通过一个10k的电位器调整其对比度。
- RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。
- RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态或数据。如果不需要进行读取操作,可以直接将其接VSS。
- E是执行命令的使能引脚,接单片机的一个I/O。
- D0—D7,并行数据输入/输出引脚。数据口如果接P0口,可以不接上拉排阻,因为P0口内部有总线驱动器。
- A背光正极,接VDD。
- K背光负极,接地。
驱动程序
LCD1602检测忙函数
/****
*******1602检测忙函数
*****/
void lcd1602_check_busy()
{
P0=0xff;
do
{
LCD1602_RS=0;
LCD1602_RW=1;
LCD1602_E=0;
LCD1602_E=1;
} while(LCD1602_BUSY==1);
LCD1602_E=0;
}
读忙信号指令:
说明:这个指令用来读取LCD1602状态。对于单片机来说,LCD1602属于慢速设备。当单片机向其发送一个指令后,它将去执行这个指令。这时如果单片机再次发送下一条指令,由于LCD1602速度较慢,前一条指令还未执行完毕,它将不接受这条新的指令,导致新的指令丢失。因此这条读忙指令可以用来判断LCD1602是否忙,能否接收单片机发来的指令。当BF=1,表示LCD1602正忙,不能接受单片机的指令;当BF=0,表示LCD1602空闲,可以接收单片机的指令。RS=0,表示是指令;RW=1,表示是读取。
LCD1602写数据函数
/****
*******1602写数据函数
*****/
void lcd1602_write_date(uchar date)
{
lcd1602_check_busy();
LCD1602_E=0;
LCD1602_PORT=date;
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_E=1;
LCD1602_E=0;
}
写数据指令
说明:RS=1,数据;RW=0,写。指令执行时,要在DB7—DB0上先设置好要写入的数据,然后执行写命令。
LCD1602写命令函数
/****
*******1602写命令函数
*****/
void lcd1602_write_com(uchar com)
{
lcd1602_check_busy();
LCD1602_E=0;
LCD1602_PORT=com;
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_E=1;
LCD1602_E=0;
}
说明:RS=0,指令;RW=0,写。指令执行时,要在DB7—DB0上先设置好要写入的指令,然后执行写命令。
LCD1602初始化函数
/****
*******LCD1602初始化函数
*****/
void Lcd1602_Init()
{
lcd1602_write_com(0x38);
lcd1602_write_com(0x0c);
lcd1602_write_com(0x06);
lcd1602_write_com(0x01);
}
- lcd1602_write_com(0x38);—-工作方式设置指令
功能设置指令设置模块数据接口宽度和LCD显示屏显示方式,即MPU与模块接口数据总线为4位或者是8位、LCD显示行数和显示字符点阵规格;所以建议用户最好在执行其它指令设置(读忙标志指令除外)之前,在程序的开始,进行功能设置指令的执行。
DL:数据接口宽度标志: DL=1,8位数据总线DB7 ~ DB0; DL=0,4位数据总线DB7 ~ DB4,DB3 ~ DB0不用,使用此方式传送数据,需分两次进行;
N:显示行数标志: N=1,两行显示模式; N=0,单行显示模式;
F:显示字符点阵字体标志: F=1:5×10点阵+游标显示模式; F=0:5×8点阵+游标显示模式。
说明:因为是写指令字,所以RS和RW都是0。LCD1602只能用并行方式驱动,不能用串行方式驱动。而并行方式又可以选择8位数据接口或4位数据接口。这里我们选择8位数据接口(D7—D0)。我们的设置是8位数据接口,两行显示,5×8点阵,即0b00111000也就是0x38。
- lcd1602_write_com(0x0c);—-显示开光控制指令
D:显示开/关控制标志:D=1,开显示;D=0,关显示; 关显示后,显示数据仍保持在DDRAM中,立即开显示可以再现;
C:游标显示控制标志:C=1,游标显示;C=0,游标不显示; 不显示游标并不影响模块其它显示功能;显示5×8点阵字符时,游标在第八行显示,显示5×10点阵字符时,游标在第十一行显示;
B:闪烁显示控制标志:B=1,游标所指位置上,交替显示全黑点阵和显示字符,产生闪烁效果,Fosc=250kHz时,闪烁频率为0.4ms左右;通过设置,游标可以与其所指位置的字符一起闪烁。
说明:这里的设置是显示开,不显示光标,光标不闪烁,设置为0x0c。
- lcd1602_write_com(0x06);—-进入模式设置指令
I/D:字符码写入或读出DDRAM后DDRAM地址指针AC变化方向标志: I/D=1,完成一个字符码传送后,游标右移,AC自动加1; I/D=0,完成一个字符码传送后,光标左移,AC自动减1;
S:显示移位元标志: S=1,将全部显示向右(I/D=0)或者向左(I/D=1)移位; S=0,显示不发生移位元;
说明:这里的设置是游标右移,显示不发生移位元,设置为0x0c。
- lcd1602_write_com(0x01);—-清屏指令
清显示指令将空位字符码20H送入全部DDRAM位址中,使DDRAM中的内容全部清除,显示消失;地址计数器AC=0,自动加1模式;显示归位,游标或者闪烁回到原点(显示屏左上角);但并不改变移位元设置模式。
LCD1602显示字符串函数
/****
*******LCD1602显示字符串函数
*******参量定义: hang:输入显示行数 1 第一行 2 第二行
******* add:偏移量,0-15
******* dat:所要显示的字符串,输入格式 ” ”
*****/
void lcd1602_display_str(uchar hang, uchar add, uchar *dat)
{
if(hang==1)
lcd1602_write_com(0x80+add); //第一行
else
lcd1602_write_com(0x80+0x40+add); //第二行
while(*dat != ‘�’)
{
lcd1602_write_date(*dat++);
}
}
为什么第一行是从0x80开始:
DDRAM位址设置指令设置DDRAM位址指针,它将DDRAM存储显示字符的字符码的首地址ADD6 ~ ADD0送入AC中,于是显示字符的码就可以写入DDRAM中或者从DDRAM中读出; 值得注意的是:在LCD显示屏一行显示方式下,DDRAM的位址范围为:00H ~ 4FH;两行显示方式下,DDRAM的位址范围为:第一行00H ~ 27H,第二行40H ~ 67H。因为DB7=1,所以第一行数据从0x80开始,第二行从0x80+0x40开始。
LCD1602显示流程设计
如图4-3所示为LCD1602显示流程,第一步,初始化设置,首先设置工作方式,设置成8位数据总线、两行显示模式、字体标志为5×8点阵+游标显示模式;其次,设置显示开/关控制,设置成开显示、不显示光标、光标不闪烁;接下来设置进入模式,设置成游标右移,显示不发生移位元;最后,进行清屏。第二步,检测LCD1602显示屏是否处于忙状态,设置RS=0,RW=0,E=1,利用do,while循环检测busy引脚电平,如果busy引脚是高电平,则代表此时LCD1602显示屏处于忙状态,不能接收单片机传来的指令,直到busy引脚为低电平。第三步,设置显示位置,设置RS=0,RW=0,E=1,数据口=需要显示的坐标。第四步,传入显示数据,设置RS=1,RW=0,E=1,数据口=需要显示的数据。