1.LCD1602简介
1602字符型液晶也叫1602液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。字符型液晶,能够同时显示16x02即32个字符。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。
实物图如下:

2.LCD1602工作原理
LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,1602原理图如下:

各引脚接口说明如下:

1引脚:VSS为地电源。
2引脚:VDD接5V正电源。
3引脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
4引脚: RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
5引脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
6引脚: E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
7—14引脚:D0~D7为8位双向数据线。
15引脚:背光源正极。
16引脚:背光源负极。
3.LCD1602指令说明

指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置ID:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。D: 控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM地址设置。指令8: DDRAM地址设置。
指令8: DDRAM地址设置。
指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。.
4.LCD1602的时序
单片机时序是指单片机执行指令时应发出的控制信号的时间序列。这些控制信号在时间上的相互关系就是CPU的时序。它是一系列具有时间顺序的脉冲信号。
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明: 1为.高电平、0为低电平)。在这里时序=高低电平+时间
通过输入RS,RW高低电平,来控制读写数据和命令。

读操作时序

写操作时序
时序参数表

5.LCD1602的RAM地址映射及标准字库表
LCD1602内部显示地址表

16进制的0x27表示1进制为39,又因为是从0x00开始的,所以第一行有40个字节,(一个字节显示一个字符),可显示40个字符。
字符代码与图形对应表

6.LCD1602基本操作
(1)初始化液晶屏
void Lcd_Init() //初始化函数
{
LcdWrCmd(0x01); // 指令1 ——清屏指令
LcdWrCmd(0x06); // 指令3 ——RAM地址设置指令,游标向右移动,AC自动加一
LcdWrCmd(0x0c); // 指令4 ——开关控制,显示开,游标关,闪烁关
LcdWrCmd(0x38); // 指令6——显示模式设置,8位数据总线,两行显示模式,5*7点阵+游标显示模式
}
(2)指定显示的位置
void Lcd_Show(uchar x, uchar y) //定位函数
{
uchar addr; //x表示第几个显示,y表示第几行显示
if(0==y) //y=0,表示在第一行,y=1,表示在第二行
{
addr = 0x00 + x; //第一行首地址为0x00
}
else
addr = 0x40+x; //第二行首地址为0x40
LcdWrCmd(addr|0x80); //DRAM地址设置
}
(3)在指定位置显示
void main() //主函数
{
Lcd_Init(); // 初始化
Lcd_Show(0,0); //定位 从1行的第1个位置开始显示
while(*str1 !='\0') //判断是否显示完字符串
{
LcdWrDat(*str1++) ; // 把字符串一个一个放到相应位置
}
Lcd_Show(0,1); //定位 从2行的第1个位置开始显示
while(*str2!='\0')
{
LcdWrDat(*str2++) ;
}
while(1)
{
}
}
7 Proteus实验效果图

8.C51代码
#include<reg51.h> //定义头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
#define LcdDB P0// 数据端口
uchar code table1[] = "0123456789012345"; //定义数组
uchar code table2[] = "abcdefghABCDEFGH";
uchar *str1 = table1; //定义指针,把数组的首地址赋给它
uchar *str2 = table2; //数组名表示数组首元素的地址
void LcdBusy();
void LcdWrCmd(uchar Cmd);
void LcdWrDat(uchar Dat);
void Lcd_Init();
void Lcd_Show(uchar x, uchar y); //函数声明
sbit LcdRS = P2^2;
sbit LcdRW = P2^1;
sbit LcdE = P2^0; // 定义引脚
void LcdBusy() //判忙函数
{
uchar temp;
LcdDB = 0xff; // 复位
LcdRS = 0; // 0 指令
LcdRW = 1; // 1 读
do{
LcdE = 1; // 拉高
temp = LcdDB; // 将 LCD 状态保存在 temp 中,用于判忙
LcdE = 0; // 负跳变使能
}while(temp & 0x80); // 结果为 1表示忙,继续循环;结果为 0表示闲,可以进行后面的操作
}
void LcdWrCmd(uchar Cmd) //写命令函数
{
LcdBusy(); // 判忙
LcdRS = 0; //0表示命令,1表示数据
LcdRW = 0; // 0表示写,1表示读
LcdDB = Cmd; // 送指令
LcdE = 1;
LcdE = 0; //使能拉低
}
void LcdWrDat(uchar Dat) //写数据函数
{
LcdBusy(); // 判忙
LcdRS = 1; // 1 数据
LcdRW = 0; // 0 写
LcdDB = Dat; // 送数据
LcdE = 1;
LcdE = 0; //使能拉低
}
void Lcd_Init() //初始化函数
{
LcdWrCmd(0x01); // 指令1 ——清屏指令
LcdWrCmd(0x06); // 指令3 ——RAM地址设置指令,游标向右移动,AC自动加一
LcdWrCmd(0x0c); // 指令4 ——开关控制,显示开,游标关,闪烁关
LcdWrCmd(0x38); // 指令6——显示模式设置,8位数据总线,两行显示模式,5*7点阵+游标显示模式
}
void Lcd_Show(uchar x, uchar y) //定位函数
{
uchar addr; //x表示第几个显示,y表示第几行显示
if(0==y) //y=0,表示在第一行,y=1,表示在第二行
{
addr = 0x00 + x; //第一行首地址为0x00
}
else
addr = 0x40+x; //第二行首地址为0x40
LcdWrCmd(addr|0x80); //DRAM地址设置
}
void main() //主函数
{
Lcd_Init(); // 初始化
Lcd_Show(0,0); //定位 从1行的第1个位置开始显示
while(*str1 !='\0') //判断是否显示完字符串
{
LcdWrDat(*str1++) ; // 把字符串一个一个放到相应位置
}
Lcd_Show(0,1); //定位 从2行的第1个位置开始显示
while(*str2!='\0')
{
LcdWrDat(*str2++) ;
}
while(1)
{
}
}
本文详细介绍了LCD1602液晶显示的工作原理,包括其接口、指令说明、时序、RAM地址映射和标准字库表。通过Proteus实验,展示了液晶屏的基本操作,如初始化、定位和显示字符,并提供了C51代码示例。
6858

被折叠的 条评论
为什么被折叠?



