液晶LCD1602简介
LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。为了降低成本,绝大多数制造商都直接将裸片做到板子上。
液晶LCD1602技术参数
1、显示容量:16×2个字符。
2、芯片工作电压:4.5~5.5V。
3、工作电流:2.0mA(5.0V)。
4、模块最佳的工作电压:5.0V。
5、字符尺寸:2.95mm×4.35mm(宽×高)。
液晶LCD1602引脚功能
LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明见下表。
各引脚的功能介绍如下。
1、引脚1:VSS为地电源。
2、引脚2:VDD接5V正电源。
3、引脚3:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”现象,使用时可以通过一个10kQ的电位器调整其对比度。
4、引脚4:RS为寄存器选择脚,高电平时选择数据寄存器、低电平时选择指令寄存器。
5、引脚5:R/W为读/写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或显示地址;当RS为低电平,R/W为高电平时,可以读忙信号;当RS为高电平,R/W为低电平时,可以写入数据。
6、引脚6:E端为使能端,当E端由高电平跳变为低电平时,液晶模块执行命令。
7、引脚7~14:D0~D7为8位双向数据线。
8、引脚15:背光源正极。
9、引脚16:背光源负极。
液晶LCD1602驱动源代码
/***********************LCD驱动基本代码*********************
* 单片机:51单片机
* 开发环境:keil uVision3
* 名称:1602驱动基本代码
**************************************************************/
#include<reg51.h> //包含头文件
#include<intrins.h>
#define LCD_Data P0
#define Busy 0x80
sbit LCD_RS = P1^0;
sbit LCD_RW = P1^1;
sbit LCD_E = P2^5;
unsigned char code welcome[] = {"YOU ARE WELCOME"};
unsigned char code mcu[] = {"SL-51A"};
void Delay5Ms(void);
void WriteDataLCD(unsigned char WDLCD);
void WriteCommandLCD(unsigned char WCLCD,BuysC);
unsigned char ReadDataLCD(void);
unsigned char ReadStatusLCD(void);
void LCDInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsignedchar DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsignedchar code *DData);
void Info_display(void);
/*************************5ms延时函数***************************/
void Delay5Ms(void)
{
unsigned int TempCyc =3552;
while(TempCyc--);
}
/**************************写数据函数***************************/
void WriteDataLCD(unsigned char WDLCD)
{
ReadStatusLCD(); //检测忙
LCD_Data = WDLCD;
LCD_E = 0; //若晶振速度太高可以在这后加小的延时
LCD_E = 0; //延时
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 1;
LCD_E = 0;
}
/*************************写指令函数****************************/
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCD(); //根据需要检测忙
LCD_Data = WCLCD;
LCD_E = 0;
LCD_E = 0;
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 1;
LCD_E = 0;
}
/**************************读状态函数***************************/
unsigned char ReadStatusLCD(void)
{
LCD_Data = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
while (LCD_Data &Busy); //检测忙信号
return(LCD_Data);
}
/***************************LCD初始化***************************/
void LCDInit(void) //LCD初始化
{
LCD_Data = 0;
WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,1); //显示模式设置, 开始要求每次检测忙信
WriteCommandLCD(0x08,1); //关闭显示
WriteCommandLCD(0x01,1); //显示清屏
WriteCommandLCD(0x06,1); //显示光标移动设置
WriteCommandLCD(0x0C,1); //显示开及光标设置
}
/**********************按指定位置显示一个字符*********************/
void DisplayOneChar(unsigned char X, unsigned char Y, unsignedchar DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码
WriteDataLCD(DData);
}
/***********************按指定位置显示一串字符********************/
void DisplayListChar(unsigned char X, unsigned char Y, unsignedchar code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while(DData[ListLength]>=0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y,DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
void main(void)
{
LCDInit();
DisplayListChar(5,0,mcu);
DisplayListChar(0,1,welcome);
while(1){;}
}