一.原理图及引脚说明
可由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.指令说明
序号 | 指令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 清显示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
2 | 光标返回 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | * |
3 | 光标和显示模式设置 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S |
4 | 显示开/关控制 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B |
5 | 光标或字符移位 | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | * | * |
6 | 功能设置 | 0 | 0 | 0 | 0 | 1 | DL | N | F | * | * |
7 | 设置字符发生存储器地址 | 0 | 0 | 0 | 1 | A5 | A4 | A3 | A2 | A1 | A0 |
8 | 设置数据存储器地址 | 0 | 0 | 1 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
9 | 读忙标志或AC地址 | 0 | 1 | BF | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
10 | 写数据到CGRAM/DDRAM | 1 | 0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
11 | 从CGRAM/DDRAM读数据 | 1 | 1 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
指令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,可能会对其他模块产生影响,例如数码管无法正常显示等。