1602液晶也叫1602字符型液晶,16x02,每行16个字符显示两行。它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。
#度娘告知
1602液晶上有16个引脚,上面依次标了上述符号,与单片机上的接口依次对应连接即可,如图:
想知道如何操作液晶屏就需要看清楚自己单片机上与液晶屏连接引脚的控制原理图,我使用的是郭天祥的51单片机中的原理图。线上标的相同符号的地方是连在一起的。
1.直接接地
2.接VCC
3.接在一个滑动变阻上再与地相接 。VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
4.接RS->P3.5 。RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
5.直接接地(因为我们一般都只让液晶屏显示即写入,所以这个单片机原理图直接接地)
6.LCDEN使能端->P3.4。当E端由高电平跳变成低电平时,液晶模块执行命令。
7-14.数据写入->P0
15.接一个电阻后(电阻为了限流,延长LCD的使用寿命也防止烧坏背光灯)与VCC连接(液晶屏背光正极)
16.直接接地(液晶屏背光负极)
指令1:清屏指令。
(1)清楚液晶显示器,即将DDRAM的内容全部填入空白的ASCII码20H
(2)地址计数器(AC)的值设为0
(3)光标复位到地址00H位置(显示器的左上方)
指令2:光标复位指令。
(1)光标返回地址00H
(2)AC值设为0
(3)DDRAM的内容不变
指令3:光标和显示模式设置。设定每次输入1位数据后光标的移位方向,并且设定输入后字符是否移动。
I/D(光标移动方向): 高:右移 低:左移
S(屏幕上所有文字是否移动):高 :有效右移 低:无效
指令4:显示开关控制。控制显示器开/关、光标显示/关闭以及光标是否闪烁
D(控制整体显示的开与关):高:开显示 低:关显示
C(控制光标的开与关): 高:有光标 低:无光标
B(控制光标是否闪烁): 高:闪烁 低:不闪烁
指令5:光标或显示移位。
S/C(移动文字/标) | R/L | |
0 | 0 | 光标左移1格且AC-1 |
0 | 1 | 光标右移1格且AC+1 |
1 | 0 | 显示器上字符全部左移1格但光标不动 |
1 | 1 | 显示器上字符全部右移1格但光标不动 |
指令6:功能设置命令。设定数据总线位数、显示的行数及字型。
DL(数据总线位数):高:8 低:4
N(显示行数) :高:2 低:1
F(显示点阵类型) :高:5*7点阵 低:5*10点阵
指令7:设定CGRAM地址指令。
设定下一个要存入数据的CGRAM的地址。
指令8:设定DDRAM地址指令。
设定下一个要存入数据的DDRAM的地址。
指令9:读取忙信号或AC地址指令。
(1)读取忙信号BF的内容
BF(液晶显示器是否忙):高:忙,暂时无法接收单片机送来的数据或指令 低:可接收
(2)读取地址计数器(AC)的内容
指令10:数据写入DDRAM或CGRAM指令。
(1)将字符码写入DDRAM,以使液晶显示屏显示出相对于的字符
(2)使用者自己设计的图形存入CGRAM
指令11:从CGRAM或DDRAM读出数据的指令。读取DDRAM或CGRAM中的内容。
/*
用液晶1602以从右侧移入方式第一行显示“Hello everyone!”
第二行显示“Welcome to my blog!”
*/
#include
#include //strlen包含的头文件
#define uint unsigned int
#define uint8 unsigned char
uint8 code table[]="Hello everyone!";
uint8 code table1[]="Welcome to my blog!";
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uint8 num;
void delay(uint z);
void write_com(uint8 com);
void write_data(uint8 date);
void init();
void Write1602_Str(uint addr,uint length,uint *pbuf);
void main()
{
init();
Write1602_Str(0x80+0x10,strlen(table),table); //Hello everyone!
Write1602_Str(0x80+0x50,strlen(table1),table1); //Welcome to my blog!
while(1)
{
write_com(0x18);
delay(200); //移动速度,可自定
}
}
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=0;j<921;j++);
}
void write_com(uint8 com)
{
lcdrs=0; //RS=0->指令
// R/W我的单片机上引脚直接接地了所以不用设置
delay(1); //tsp1
P0=com; //DB0-DB7
delay(1); //tsp2
lcden=1; //tR
delay(1); //tpW
lcden=0; //tF、tHD1、tHD2
}
void write_data(uint8 date)
{
lcdrs=1; //RS=1->数据
delay(1);
P0=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void init()
{
dula=0; //段选位关闭,因为P0口同时也是控制数据管的口
wela=0; //同上
lcden=0; //使能关(操作之前看时序图都需要E开始是0后来变为1)
write_com(0x38); //设置16*2显示,5*7点阵,8位数据口
write_com(0x0e); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清0,数据指针清0
}
void Write1602_Str(uint8 addr,uint8 length,uint8 *pbuf)
{
uint8 i;
write_com(addr);
for(i=0;i