1.简介

LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片。与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的内容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示汉字,它的并行驱动方式与LCD1602相差无几,所以,在这里花点时间是值得的。

一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。这块LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。如图1所示:

lcd1602液晶(LCD1602液晶显示屏应用)(1)

2.硬件参数

(1) LCD1602主要技术参数

a.显示容量:16×2个字符

b.芯片工作电压:4.5—5.5V

c.工作电流:2.0mA(5.0V)

d.模块最佳工作电压:5.0V

e.字符尺寸:2.95×4.35(W×H)mm

(2) 引脚定义

lcd1602液晶(LCD1602液晶显示屏应用)(2)

首先,1602液晶显示屏除了电源、地以外,有3个控制引脚 RS R/W E 和8个数据引脚DB0-7。建议8个数据引脚接在同一组上,程序写起来比较简单。硬件连接参考如图。

lcd1602液晶(LCD1602液晶显示屏应用)(3)

当我们想在指定位置写入内容时,要先指定地址,如在第一行第一位写入,地址位是00H,再加上DB7的1,即80H(0010000000),第二行第一位是40H,再加上DB7的1,即C0H(0011000000),依次类推。

LCD的已有的字模存储在CGROM中,自定义的存储在CGRAM,留给自定义的位置只有8个地址,字模地址为01000000-01000111八个地址,也就是最多自定义8个符号或者图形。

lcd1602液晶(LCD1602液晶显示屏应用)(4)

根据这条指令,来写一个摄氏度℃的自定义符号,对应图如下

lcd1602液晶(LCD1602液晶显示屏应用)(5)

**上面的数据也可以用8X8的字模软件进行获取字符数据**

用zimo221软件, 新建一个8*8的图像,留出左边3列,用右边5列点出自定义字符,选择取模方式C51,就可得到对应的编码

lcd1602液晶(LCD1602液晶显示屏应用)(6)

字符对应的数组为table【】={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00},将℃写入指定的位置之前,要先把对应数组写入CGRAM存储,再写入DDRAM显示。如果直接用已有的字符,可以直接把数组写入DDRAM显示。

区分清楚自定义字符和已有字符,程序就简单了。主要步骤是延时函数、写指令、写数据、初始化、主函数。

下面举两个例子,写入常规字符串12345,写入字符串℃。

```c

程序一

#include<reg52.h> //包含头文件

#define uint unsigned int //预定义

#define uchar unsigned char

sbit rs=P2^6; //1602的数据/指令选择控制线

sbit rw=P2^5; //1602的读写控制线

sbit en=P2^7; //1602的使能控制线

/*P0口接1602的D0~D7*/

uchar code table[]="1234"; //要显示的内容放入数组table

void delay(uint n) //延时函数

{

uint x,y;

for(x=n;x>0;x--)

for(y=110;y>0;y--);

}

void lcd_wcom(uchar com) //1602写命令函数

{

rs=0; //选择指令寄存器

rw=0; //选择写

P0=com; //把命令字送入P2

delay(5); //延时一小会儿,让1602准备接收数据

en=1; //使能线电平变化,命令送入1602的8位数据口

en=0;

}

void lcd_wdat(uchar dat) //1602写数据函数

{

rs=1; //选择数据寄存器

rw=0; //选择写

P0=dat; //把要显示的数据送入P2

delay(5); //延时一小会儿,让1602准备接收数据

en=1; //使能线电平变化,数据送入1602的8位数据口

en=0;

}

void lcd_init() //1602初始化函数

{

lcd_wcom(0x38); //8位数据,双列,5*7字形

lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁

lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位

lcd_wcom(0x01); //清屏

}

void main() //主函数

{

uchar m=0;

lcd_init(); //液晶初始化

lcd_wcom(0x80); //显示地址设为80H(即00H,)上排第一位

for(m=0;m<4;m ) //将table[]中的数据依次写入1602显示

{

lcd_wdat(table[m]);

delay(200);

}

while(1); //动态停机

}

```

```c

程序二

#include<reg52.h> //包含头文件

#define uint unsigned int //预定义

#define uchar unsigned char

sbit rs=P2^6; //1602的数据/指令选择控制线

sbit rw=P2^5; //1602的读写控制线

sbit en=P2^7; //1602的使能控制线

/*P0口接1602的D0~D7*/

uchar code table[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}; //要显示的内容放入数组table

void delay(uint n) //延时函数

{

uint x,y;

for(x=n;x>0;x--)

for(y=110;y>0;y--);

}

void lcd_wcom(uchar com) //1602写命令函数

{

rs=0; //选择指令寄存器

rw=0; //选择写

P0=com; //把命令字送入P2

delay(5); //延时一小会儿,让1602准备接收数据

en=1; //使能线电平变化,命令送入1602的8位数据口

en=0;

}

void lcd_wdat(uchar dat) //1602写数据函数

{

rs=1; //选择数据寄存器

rw=0; //选择写

P0=dat; //把要显示的数据送入P2

delay(5); //延时一小会儿,让1602准备接收数据

en=1; //使能线电平变化,数据送入1602的8位数据口

en=0;

}

void lcd_init() //1602初始化函数

{

lcd_wcom(0x38); //8位数据,双列,5*7字形

lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁

lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位

lcd_wcom(0x01); //清屏

}

void main() //主函数

{

uchar m;

lcd_init(); //液晶初始化

lcd_wcom(0x40);//设定CGRAM地址,把自定义字符存储进去

for(m=0;m<8;m ) //将table[]中的数据依次写入1602显示

{

lcd_wdat(table[m]);

delay(200);

}

lcd_wcom(0x85); //显示地址设为85H,上排中间位

lcd_wdat(0);

while(1); //动态停机

}

```

总结:区分DDRAM和CGRAM,DDRAM是字符对应在屏幕上的位置,CGRAM是把自己定义的字符存在8个字节里,即lcd_wcom(0x40)。