字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式 LCD,目前常用 16*1,
16*2,20*2 和 40*2 行等的模块。
LCD1602是一种16*2字符型液晶显示屏,实物如图示:
主要技术参数:
显示容量:16×2个字符
芯片工作电压:4.5——5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
引脚定义:
1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。
接线图:
指令说明:
初始化设置
初始化过程:
延时
写指令38H
延时
写指令38H
延时
写指令38H
(每次写指令、读/写数据操作之前均需检测信号)
写指令38H:显示模式设置
写指令08H:显示关闭
写指令01H:显示清屏
写指令06H:显示光标移动设置
写指令0CH:显示开及光标设置
显示地址:
1602字符液晶显示可分为上下两部分各16位进行显示,处于不同行时的字符显示地址如下:
控制时序图:
1.读操作时序图:
2.写操作时序图:
3.时序参数:
ASCII表:
代码实现:
LCD1602.c文件
#include <REG52.H>
#define LCD_DatePort P0
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
void LCD_Delay() //@12.000MHz 1ms
{
unsigned char i, j;
i = 2;j = 239;
do
{
while (--j);
} while (--i);
}
void LCD_WriteCommand(unsigned char Command) //写入指令
{
LCD_RS=0;
LCD_RW=0;
LCD_DatePort=Command;
LCD_E=1;
LCD_Delay();
LCD_E=0;
LCD_Delay();
}
void LCD_WriteDate(unsigned char Date) //写入数据
{
LCD_RS=1;
LCD_RW=0;
LCD_DatePort=Date;
LCD_E=1;
LCD_Delay();
LCD_E=0;
LCD_Delay();
}
void LCD_Init() //LCD初始化
{
LCD_WriteCommand(0x38);//设置16x2显示 5x7矩阵 8位数据接口
LCD_WriteCommand(0x0e);//显示开关控制指令 0000 1DCB D显示 C光标 B光标闪烁
LCD_WriteCommand(0x06);//模式设置指令 0x07写入新数据后光标左移 显示屏幕右移一个字符 0x06写入新数据后光标左移 显示屏幕不移动 0x05写入新数据后光标右移 显示屏幕右移一个字符 0x04写入新数据后光标右移 显示屏幕不移动
LCD_WriteCommand(0x01);//清屏指令
}
void LCD_SetCursor(unsigned char Line,Column) //光标位置
{
if(Line==1)
{
LCD_WriteCommand(0x80|(Column-1));
}
else
{
LCD_WriteCommand(0x80|(Column-1)+0x40);
}
}
void LCD_ShowChar(unsigned char Line,Column,Date) //显示一个字符
{
LCD_SetCursor(Line,Column);
LCD_WriteDate(Date);
}
void LCD_ShowString(unsigned char Line,Column,unsigned char *String) //显示字符串
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=0;String[i]!=0;i++)
{
LCD_WriteDate(String[i]);
}
}
int LCD_Pow(unsigned int X,Y) //幂函数
{
unsigned char i;
unsigned int result=1;
for(i=0;i<Y;i++)
{
result*=X;
}
return result;
}
void LCD_ShowNumber(unsigned char Line,Column,unsigned int Number,unsigned char Length) //显示数字
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
LCD_WriteDate(Number/LCD_Pow(10,i-1)%10+'0');
}
}
void LCD_ShowHEX(unsigned char Line,Column,unsigned int Number,unsigned char Length) //显示十进制数字
{
unsigned char i,g;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
g=Number/LCD_Pow(16,i-1)%16;
if(g<10)
{
LCD_WriteDate(Number/LCD_Pow(16,i-1)%16+'0');
}
else
{
LCD_WriteDate(Number/LCD_Pow(16,i-1)%16+'A'-10);
}
}
}
LCD1602.h文件
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include <REG52.H>
void LCD_Init(); //初始化
void LCD_ShowChar(unsigned char Line,Column,Date); //写入字符
void LCD_ShowString(unsigned char Line,Column,unsigned char *String); //写入字符串
void LCD_ShowNumber(unsigned char Line,Column,unsigned int Number,unsigned char Length); //写入数字
void LCD_ShowHEX(unsigned char Line,Column,unsigned int Number,unsigned char Length);//写入十六进制数
void LCD_WriteCommand(unsigned char Command); //写入指令
#endif