一.原理图及引脚说明

在这里插入图片描述

可由Rb1电位器控制LCD的对比度

编号 引脚名   引脚说明 编号 引脚名 引脚说明
1  VSS 电源地 9 D2 Data I/O
2 VDD 电源正极 10 D3 Data I/O
3  VL 对比度调节 11 D4 Data I/O
4 RS 数据/指令选择段(H/L) 12 D5 Data I/O
5 R/W 读/写选择段(H/L) 13 D6 Data I/O
6 E   使能信号 14 D7 Data I/O
7  D0 Data I/O 15 BLA 背光源正极
8 D1 Data I/O 16 BLK 背光源负级

二.控制接口说明

1.1602的存储器

DDRAM:作为显示用的RAM,其地址直接和屏幕上的位置相对应,具体可看第4点;
CGROM:字模存储ROM,里面存入了ascall码字符,显示时自动调用,无需修改;
CGRAM:用户自建字模RAM,可自行向其中添加想要的字模,6位地址码,每个字符占8个字节,所以最多存8个字符。

2.基本操作时序
序号 基本操作 时序
1 读状态 RS=L,R/W=H,E=H,D0~7=状态字
2 写指令 RS=L,R/W=L,D0~7=指令码,E=高脉冲
3 读数据 RS=H,R/W=H,E=H,D0~7=数据
4 写数据 RS=H,R/W=L,D0~7=数据,E=高脉冲

3.状态字说明

STA7:读写操作使能,1—禁止,0—允许
STA6~0:当前数据地址指针的数值

对应代码:

//读状态
void read_state(void)
{
	unsigned char sta;			//状态读取存储变量
	LCD1602_DB=0xff;	
	LCD1602_RS=0;
	LCD1602_RW=1;
	LCD1602_E=1;
	do
	{
		LCD1602_E=1;
		sta=LCD1602_DB;	//把状态字读取到sta变量中,可通过最高位判断液晶是否处于忙态,1时为忙 
		LCD1602_E=0;	//释放总线,防止影响其他模块
	}while(sta&0x80);	//判断最高位,直到允许读写时跳出循环
}

//写指令
void write_cmd(unsigned char cmd)
{
	read_state();
	LCD1602_RS=0; 	//RS=0->指令
	LCD1602_RW=0;	//R/W=0->写
	LCD1602_DB=cmd;	//写入指令
	LCD1602_E=1;	
	LCD1602_E=0;			
}
 
 //写数据
void write_data(unsigned char date)
{
	read_state();
	LCD1602_RS=1;   //RS=1->数据
	LCD1602_RW=0;	//R/W=0->写
	LCD1602_DB=date;	//写入数据
	LCD1602_E=1;
	LCD1602_E=0;
}
4.DDRAM地址映射图

在这里插入图片描述

5.指令说明

指令1:清显示

1.清除显示器,将DDRAM全部写入空白的ASCll码20H;
2.地址计数器AC的值设为0;
3.光标复位到地址00H的位置;

指令2:光标复位指令

1.光标复位到地址00H的位置;
2.地址计数器AC的值设为0;
3.DDRAM内容不变

指令3:光标和显示模式设置

1.I/D:光标移动方向。0—左移,1—右移;
2.S:屏幕上所有文字是否移动。0—关闭,1—右移

指令4:显示开关控制

1.D:控制整体显示的开关。0—关,1—开;
2.C:控制光标显示的开关。0—关,1—开;
3.B:控制光标闪烁的开关。0—关,1—开;

指令5:光标或显示移位

S/C R/L 功能
0 0 光标左移1格且地址计数器AC减1
0 1 光标右移1格且地址计数器AC加1
1 0 屏幕上所有字符左移1格但光标不变
1 1 屏幕上所有字符右移1格但光标不变

指令6:功能设置

设定数据总线位数、显示的行数及字型
1.DL:数据总线位数。0—4位,1—8位;
2.N:显示行数。0—1行,1—2行;
3. F:显示点阵类型。0—5X10点阵,1— 5X7点阵

指令7:设定CGRAM地址

设定下一个要存入数据的CGRAM的地址,该指令在向CGRAM时数据前使用。

指令8:设定DDRAM地址

设定下一个要存入数据的DDRAM的地址,该指令在向DDRAM写数据(即显示)时使用。

指令9:读取忙信号或AC地址

1.BF:液晶显示器是否忙。0—不忙,可接收,1—忙,暂时无法接收;
2.读取计数器AC的地址;

指令10:写数据到CGRAM或DDRAM

1.将字符码写入DDRAM,以使液晶显示屏显示出相对于的字符;
2.使用者自己设计的图形存入CGRAM;

指令11:从CGRAM或DDRAM读出数据

读取CGRAM或DDRAM中的内容。

初始化代码:

//LCD初始化设置
void lcd_init()
{		
	LCD1602_E=0;		 //使能关(操作前关使能使用时打开)
	write_cmd(0x3c);     //设置16*2显示,5*7点阵,8位数据口
	write_cmd(0x0c);     //设置开显示,不显示光标
	write_cmd(0x06);     //设置写一个字符后地址指针自动加1
	write_cmd(0x01);     //显示清0,数据指针清0
}

//x为列,范围0~39
//y为行,0——第1行,1——第2行
//将坐标转换为对应的RAM地址,实际指针地址为0x80+RAM映射地址,0x80为指令固定位
void LCD1602_SetRAM(unsigned char x,unsigned char y)
{
    unsigned char addr;
    if(y == 0)
        addr = 0x80 + x;
    else
        addr = 0xc0 + x;
    write_cmd(addr);
}

//对应位置显示字符串
void LCD1602_Show(unsigned char x,unsigned y,unsigned char *str)
{
    LCD1602_SetRAM(x,y);
    while(*str != '\0')
    {
        write_data(*str++);
    }
}
#define LCD1602_DB P0

sbit LCD1602_RS=P2^0;  //RS,数据/命令选择端(H/L)
sbit LCD1602_RW=P2^1;  //R/W,读/写选择端(H/L)
sbit LCD1602_E=P1^2;  // E,使能信号

void read_state(void);//读状态,直到lcd不忙才继续执行其他操作
void write_cmd(unsigned char com);//写指令
void write_data(unsigned char date);//写数据
void lcd_init();//LCD初始化
void LCD1602_SetRAM(unsigned char x,unsigned char y);//设置显示RAM起始地址(x,y对应屏上字符坐标)
void LCD1602_Show(unsigned char x,unsigned y,unsigned char *str);//显示字符串

void main()
{
	lcd_init();
	LCD1602_Show(0,0,"Hello everyone!");	//第一行显示Hello everyone!
	//向CGRAM中存入字符:write_cmd(0X40+num);num为8的倍数(0~56)
	//然后用write_data(data);循环写入8个字节,即一个字符对应的8行
	//如果要将CGRAM中自己存入的字符显示到屏幕上
	//可先write_cmd(addr);addr为DDRAM的地址
	//然后write_data(num);num=1~8,即CGRAM中的8个字符
	//注意首先要保证CGRAM中已经存入字符
 	while(1)
	{	
//		write_cmd(0x18);	//显示器字符左移
		//添加适当的延时函数		
	}					 
}

注意:用此开发板时,如果插上LCD1602,可能会对其他模块产生影响,例如数码管无法正常显示等。