4.11 LCD1602显示屏
4.11.1 原理图介绍
图4-11-1
图4-11-2
根据原理图得知:
LCD1602的数据脚接P0口。
RD(RS)引脚接P2.6
WR(RW)引脚接P2.5
LCDE(E)引脚接P2.7
4.11.2 LCD1602字符屏幕介绍
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号的点阵型液晶模块。
它是由若干个5x7或者5x11的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。
图4-11-3
图4-11-4
图4-11-5
4.11.3 时序介绍
图4-11-6
图4-11-8
图4-11-9
LCD1602液晶模块的读/写操作、显示屏和光标的操作都是通过指令编程来实现的(其中,1为高电平,0为低电平),分别介绍如下。
(1)指令1:清屏。指令码01H,光标复位到地址00H。
(2)指令2:光标复位。光标复位到地址00H。
(3)指令3:输入方式设置。其中,I/D表示光标的移动方向,高电平右移,低电平左移;S表示显示屏上所有文字是否左移或右移,高电平表示有效,低电平表示无效。
(4)指令4:显示开关控制。其中,D用于控制整体显示的开与关,高电平表示开显示,低电平表示关显示;C用于控制光标的开与关,高电平表示有光标,低电平表示无光标;B用于控制光标是否闪烁,高电平闪烁,低电平不闪烁。
(5)指令5:光标或字符移位控制。其中,S/C表示在高电平时移动显示的文字,低电平时移动光标。
(6)指令6:功能设置命令。其中,DL表示在高电平时为4位总线,低电平时为8位总线;N表示在低电平时为单行显示,高电平时双行显示;F表示在低电平时显示5×7的点阵字符,高电平时显示5×10的点阵字符。
(7)指令7:字符发生器RAM地址设置。
(8)指令8:DDRAM地址设置。
(9)指令9:读忙信号和光标地址。其中,BF为忙标志位,高电平表示忙,此时模块不能接收命令或数据,如果为低电平则表示不忙。
(10)指令10:写数据。
(11)指令11:读数据。
4.11.4 示例代码
下面代码实现在LCD1602屏幕上显示两排字母数字。
图4-11-10
示例代码:
#include <reg51.h>
sbit lcd_1602_RS=P2^6; //区分命令和数据
sbit lcd_1602_R_W=P2^5; //读写区分
sbit lcd_1602_E=P2^7; //使能信号
#define lcd_1602_data_cmd P0 //发送接收数据和命令
//1602的初始化函数
void LCD1602_Init(void)
{
LCD1602_WriteCmd(0x38); //设置显示模式
LCD1602_WriteCmd(0x06); //设置数据指针自增
LCD1602_WriteCmd(0x0C); //设置光标显示关闭,开启显示
LCD1602_WriteCmd(0x01); //清屏
}
//1602写数据
void LCD1602_WriteData(unsigned char dat)
{
lcd_1602_RS=1;//表示写数据
lcd_1602_R_W=0;//表示写操作
lcd_1602_data_cmd=dat;//写入的数据
lcd_1602_E=1;//高脉冲
DelayMs(5);
lcd_1602_E=0;
}
//1602写命令
void LCD1602_WriteCmd(unsigned char cmd)
{
lcd_1602_RS=0;
lcd_1602_R_W=0;
lcd_1602_data_cmd=cmd;
lcd_1602_E=1;
DelayMs(5);
lcd_1602_E=0;
}
/*
设置光标地址
x : 显示的位置
y :显示的行数 0表示1行显示 1表示第2行显示
*/
void LCD1602_SetCursorAddr(unsigned char x,unsigned char y)
{
unsigned char addr=0;
if(y==1) //表示设置在第2行显示
{
addr=x+0x40; //第二行地址
}
else
{
addr=x+0x00; //第一行地址
}
LCD1602_WriteCmd(0x80|addr); //加上0x80表示设置地址
}
/*
设置显示的数据
*dat :表示要显示的数据
len :显示数据的长度
*/
void LCD1602_DisplayData(unsigned char *dat,unsigned char len)
{
while(len--)
{
LCD1602_WriteData(*dat++);
}
}
code u8 str1[]="ABCDEFGHIJ"; //字符串结尾 '\0'
code u8 str2[]="1234567890"; //字符串结尾 '\0'
int main()
{
LCD1602_Init(); //1602初始化
DelayMs(50);
LCD1602_SetCursorAddr(0x3,0x0); //设置光标地址
LCD1602_DisplayData(str1,strlen(str1)); //在1602上显示数据
LCD1602_SetCursorAddr(0x3,0x1); //设置光标地址
LCD1602_DisplayData(str2,strlen(str2)); //在1602上显示数据
while(1)
{
}
}