LCD1602.noteLCD1602是一种工业字符型液晶,能够同时显示16*02即32个字符。LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,即可以显示图形。
简介:
它由若干个5*7或者5*10等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到字符间距和行间距的作用,正因为如此所以他不能很好的显示图形(用自定义CGRAM,显示效果也不好)。
CGRAM(Custom Glyph RAM) 代表图像定义(自定义字形)功能,这个在1602液晶显示器上有用
到。
1602采用标准的引脚,其中:
第1引脚:GND为电源地
第2引脚:VCC接5V电源正极
第3引脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4引脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0 时选择指令寄存器。
第5引脚:RW为读写信号线,高电平1时进行读操作,低电平0时进行写操作。
第6引脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳
变时执行指令。
第7~14引脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电
源。第15引脚背光正极,第16引脚背光负极。
特性
3.3V或5V工作电压,对比度可调
内含复位电路
提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能
有80字节显示数据存储器DDRAM
内建有192个5X7点阵的字型的字符发生器CGROM
8个可由用户自定义的5X7的字符发生器CGRAM
特征应用
微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。
操作控制
注:关于E=H脉冲--开始时初始化E为0,然后置E为1。
字符集
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母"A"的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母"A"。
在单片机编程中还可以用字符型常量或变量赋值,如'A'。因为CGROM储存的字符代码与我们PC中的字符代码是基本一致的,因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1='A'这样的方法。PC在编译时就把'A'先转换为41H代码了。
字符代码0x00~0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。
0x20~0x7F为标准的ASCII码,0xA0~0xFF为日文字符和希腊文字符,其余字符码(0x10~0x1F及0x80~0x9F)没有定义。
以下是1602的16进制ASCII码表地址:读的时候,先读上面那行,再读左边那列,如:感叹号!的ASCII为0x21,字母B的ASCII为0x42(前面加0x表示十六进制)
指令集
指令码
功能令:
RS |
R/W |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
说明 |
|
清显示 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H" |
归位 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
* |
设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容 |
进入模式设置指令 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
S |
I/D=1,光标或闪烁向右移动,AC增加1。I/D=0,光标或闪烁向左移动,AC减少1,S整个显示移动 |
显示开关控制指令 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
[D=1: 整体显示 ON],[C=1: 游标ON],[B=1:游标位置反白允许] |
光标或显示移位指令 |
0 |
0 |
0 |
0 |
0 |
1 |
S/C |
R/L |
* |
* |
光标或显示移位指令可使光标或显示在没有读写数据的情况下,向左或向右移动,指令不改变DDRAM 的内容 |
功能设定 |
0 |
0 |
0 |
0 |
1 |
DL |
N |
F |
* |
* |
[DL=0/1:4/8位数据],[N=0/1,单行/双行显示],[F=0/1,5*8/5*10点阵显示模式] |
设置CGRAM地址 |
0 |
0 |
0 |
1 |
AC5 |
AC4 |
AC3 |
AC2 |
AC1 |
AC0 |
CGRAM地址设置指令设置CGRAM地址指针, |
设定DDRAM地址 |
0 |
0 |
1 |
0 |
AC5 |
AC4 |
AC3 |
AC2 |
AC1 |
AC0 |
DDRAM地址设置指令设置DDRAM地址。一行地址范围00H~4FH,两行DDRAM地址第一行00H~27H,第二行40H~67H,加上高2位,[一行:80H-A7H],[二行:C0H-E7H] |
读忙标志和地址 |
0 |
1 |
BF |
AC6 |
AC5 |
AC4 |
AC3 |
AC2 |
AC1 |
AC0 |
BF:忙标志位,BF=1,模块正在进行内部操作,此时模块不接受任何外部指令和数据。BF=0,模块可以接受外部的指令和数据;同时可以读出地址计数器(AC)的值。 |
写RAM指令 |
1 |
0 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
将数据D7-D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM),将用户自定义的字符写入CGRAM中,D7~D5为000,D4~D0为5点的字模数据 |
读RAM指令 |
1 |
1 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
从内部RAM读取数据D7--D0(DDRAM/CGRAM/IRAM/GRAM) |
单片机与LCD模块之间有四种基本操作:
写命令
读状态
写显示数据
读显示数据
#define DataPort P0
sbit RS = P2^4;
sbit RW = P2^5;
sbit EN = P2^6;
#define RS_CLR RS = 0
#define RS_SET RS = 1
#define RW_CLR RW = 0
#define RW_SET RW = 1
#define EN_CLR EN = 0
#define EN_SET EN = 1
RS |
R/W |
操作 |
0 |
0 |
写命令操作(初始化、光标定位等) |
0 |
1 |
读状态操作(读忙标志) |
1 |
0 |
写数据操作(要显示的内容) |
1 |
1 |
读数据操作(可以把显示存储区中的数据反读出来) |
LCD上电时,都必须按照一定的时序对LCD进行初始化操作,主要任务是设置LCD的工作方式、显示状态、清屏、输入方式、光标位置等。
LCD中CGRAM的用法:
要让LCD1602显示自定义字符,就得用到CGRAM指令,CGROM字码表中最左边16字节是自定义CGRAM,实际只有8个字节可用.它的字符码是00H---07H这8个地址,从指令表看可以看到RS=0;RW=0;DB7与DB6分别为01,只有DB0--DB6 六位为地址为,DB6 DB5 DB4都为0代表这8个自定义字符,后3位是8个字模数据的地址;
CGRAM地址: 01000000 0x40 首地址,代表字模数据从第一行开放入
01000001 0x41 从第二行开始,上一行空出来
01000010 0x42
01000011 0x43
01000100 0x44
01000101 0x45
01000110 0x46
01000111 0x47
举例说明:我们向这8个字节写入字模数据,显示个"日"字;
如果CGRAM地址设置为0x40:则"日"字的第一行就是从8行最上面开始写,即0x1f就是放到了最上面
如果开始设置CGRAM地址写入0x41:这样的话"日"字的第一行就放在了8行的第二行
//LCD1602显示自定义字符测试程序
//STC89C52RC 12MHz
#include
#define uint unsigned int
#define uchar unsigned char
sbit rs=P3^5;//1602数据命令选择线
//sbit rw=P3^6;rw=0;rw直接接GND 一直写不读
sbit en=P3^4;//1602使能控制线
/*P0口接1602的D0-D7********************/
uchar code table[]={
0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00, //℃,代码 0x00
0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00, //一,代码 0x01
0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00, //二,代码 0x02
0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00, //三,代码 0x03
0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00, //四,代码 0x04
0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00, //五,代码 0x05
0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00, //六,代码 0x06
0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00, //日,代码 0x07
};
void delay(uint t) //延时函数 用延时函数代替忙检测
{
uint x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
/*********************************************/
void lcd_wcom(uchar com) //1602写命令函数
{
rs=0;
//rw=0;
P0=com;
delay(5);
en=1;
en=0;
}
void lcd_wdat(uchar dat)//1602写数据函数
{
rs=1;
//rw=0;
P0=dat;
delay(5);
en=1;
en=0;
}
void lcd_init()
{
lcd_wcom(0x38);//8位数据,5*8字形
lcd_wcom(0x0c);//开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06);//显示地址递增,即写一个数据后,显示位置右移一位
lcd_wcom(0x01);//清屏
}
void main()
{
uchar i;
lcd_init();
lcd_wcom(0x40);//设置CGRAM地址,设置为00处,从8行中第一行开始 ①第一步设置CGRAM地址
for(i=0;i<64;i++)//写入数组中数据 ②装入数组里要显示的数据
{
lcd_wdat(table[i]);
}
lcd_wcom(0x80); //设置字符显示位置 第一行第一个位置 ③设置显示地址,然后发送数据
lcd_wdat(0x00); //给1602发送字符数据 显示℃
delay(5);
lcd_wcom(0x81);
lcd_wdat(0x01); // 显示"一"
delay(5);
lcd_wcom(0x82);
lcd_wdat(0x02); //显示"二"
delay(5);
lcd_wcom(0x83);
lcd_wdat(0x03); //显示"三"
delay(5);
lcd_wcom(0x84);
lcd_wdat(0x04); //显示"四"
delay(5);
lcd_wcom(0x85);
lcd_wdat(0x05); //显示"五"
delay(5);
lcd_wcom(0x86);
lcd_wdat(0x06); //显示"六"
delay(5);
lcd_wcom(0x87);
lcd_wdat(0x07); //显示"日"
delay(5);
while(1);
}