标题：LCD1602
简介
  工业字符型液晶，能够同时显示16x02即32个字符。（16列2行）
注：为了表示的方便 ，后文皆以1表示高电平，0表示低电平。
1602液晶也叫1602字符型液晶，它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成，每个点阵字符位都可以显示一个字符，每位之间有一个点距的间隔，每行之间也有间隔，起到了字符间距和行间距的作用，正因为如此所以它不能很好地显示图形（用自定义CGRAM，显示效果也不好）。 
1602LCD是指显示的内容为16X2,即可以显示两行，每行16个字符液晶模块（显示字符和数字）。 
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的，控制原理是完全相同的，因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
管脚功能
  LCD1602引脚图1602采用标准的16脚接口，其中：
第1脚：VSS为电源地
第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”。
因为1602识别的是ASCII码，试验可以用ASCII码直接赋值，在单片机编程中还可以用字符型常量或变量赋值，如'A’。
以下是1602的16进制ASCII码表地址：  读的时候，先读左边那列，再读上面那行，如：感叹号！的ASCII为0x21，字母B的ASCII为0x42（前面加0x表示十六进制）
指令集
1602通过D0~D7的8位数据端传输数据和指令。
显示模式设置： (初始化)
0011 1000 [0x38] 设置16×2显示，5×7点阵，8位数据接口；
显示开关及光标设置： (初始化)
0000 1DCB D显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)
0000 01NS N=1(读或写一个字符后地址指针加1 &光标加1)，
N=0(读或写一个字符后地址指针减1 &光标减1)，
S=1 且 N=1 (当写一个字符后，整屏显示左移)
s=0 当写一个字符后，整屏显示不移动
数据指针设置：
数据首地址为80H，所以数据地址为80H+地址码(0-27H，40-67H)
其他设置：
01H(显示清屏，数据指针=0，所有显示=0)；02H(显示回车，数据指针=0)。[1]
1602液晶显示器通用程序
/********************************************************************
* 文件名 ： 液晶1602显示.c * 描述 : 该程序实现了对液晶1602的控制。 ***********************************************************************/ 
#include "1602.h" #include "math.h" /******************************************************************** 
* 名称 : delay() * 功能 : 延时,延时时间大概为140US。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ 
void delay() { int i,j; for(i=0; i<=10; i++) for(j=0; j<=2; j++) ; } /******************************************************************** 
* 名称 : Convert(uchar In_Date) * 功能 : 因为电路设计时，P0.0--P0.7接法刚好了资料中的相反，所以设计该函数。 
* 输入 : 1602资料上的值 * 输出 : 送到1602的值 ***********************************************************************/ 
uchar Convert(uchar In_Date) { /* uchar i, Out_Date = 0, temp = 0; for(i=0; i<8; i++) { temp = (In_Date >> i) & 0x01; Out_Date |= (temp << (7 - i)); } return Out_Date; */ return In_Date; } /******************************************************************** 
* 名称 : enable(uchar del) 
* 功能 : 1602命令函数 
* 输入 : 输入的命令值 
* 输出 : 无 
***********************************************************************/ 
void enable(uchar del) { P0 = Convert(del); RS = 0; RW = 0; E = 0; delay(); E = 1; delay(); } /******************************************************************** 
* 名称 : write(uchar del) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无 ***********************************************************************/ 
void write(uchar del) { P0 = Convert(del); RS = 1; RW = 0; E = 0; delay(); E = 1; delay(); } /******************************************************************** 
* 名称 : L1602_init() * 功能 : 1602初始化，请参考1602的资料 * 输入 : 无 * 输出 : 无 ***********************************************************************/ 
void L1602_init(void) { enable(0x01); 
enable(0x38); enable(0x0c); enable(0x06); enable(0xd0); } /******************************************************************** 
* 名称 : L1602_char(uchar hang,uchar lie,char sign) 
* 功能 : 改变液晶中某位的值，如果要让第一行，第五个字符显示"b" ，调用该函数如下 L1602_char(1,5,'b') 
* 输入 : 行，列，需要输入1602的数据 
* 输出 : 无
***********************************************************************/ 
void L1602_char(uchar hang,uchar lie,char sign) 
{ uchar a; if(hang == 1) a = 0x80; 
if(hang == 2) a = 0xc0; 
a = a + lie - 1; 
enable(a); 
write(sign); } 
/******************************************************************** 
* 名称 : L1602_string(uchar hang,uchar lie,uchar *p) 
* 功能 : 改变液晶中某位的值，如果要让第一行，第五个字符开始显示"ab cd ef" ，调用该函数如下 L1602_string(1,5,"ab cd ef;")
* 输入 : 行，列，需要输入1602的数据
* 输出 : 无 
***********************************************************************/ 
void L1602_string(uchar hang,uchar lie,uchar *p) 
{ uchar a; if(hang == 1) a = 0x80; 
if(hang == 2) a = 0xc0; 
a = a + lie - 1; enable(a); 
while(1) 
{ if(*p == '\0') break; write(*p); p++; } 
} //显示整型的温湿度数据用，共占用4位，其中一位符号位 void L1602_int(uchar hang, uchar lie, int num) 
{ uint temp; uint gewei,shiwei,baiwei,sign; if (num >= 0) { sign = 0; } else 
{ sign = 1; } 
temp = abs(num); baiwei = temp / 100; temp = temp - baiwei*100; shiwei = temp 
/ 10; gewei = temp - shiwei*10; num = abs(num); if (num>=100) { if (sign == 1) 
//负数 
{ L1602_char(hang, lie, '-'); } 
L1602_char(hang, lie+1, baiwei+48); 
L1602_char(hang, lie+2, shiwei+48); 
L1602_char(hang, lie+3, gewei+48); } 
else if (num>=10) { if (sign == 1) 
{ L1602_char(hang, lie+1, '-'); } 
L1602_char(hang, lie+2, shiwei+48); 
L1602_char(hang, lie+3, gewei+48); } 
else { if (sign == 1) 
{ 
L1602_char(hang, lie+2, '-'); 
} 
L1602_char(hang, lie+3, gewei+48); 
}
[2] }