LCD1602简介
主要技术参数
显示容量 | 16*2个字符 |
---|---|
芯片工作电压 | 4.5~5.5V |
工作电流 | 2.mA(5.0V) |
字符尺寸 | 2.95*4.35(WXH)mm |
接口信号说明
编号 | 符号 | 引脚说明 |
---|---|---|
1 | VSS | 电源地 |
2 | VDD | 电源正极 |
3 | VL | 液晶显示偏压信号 |
4 | RS | 数据/命令选择端 |
5 | R/W | 读/写选择端 |
6 | E | 使能端 |
7~14 | D0~D7 | Data I/O |
15 | BLA | 背光源正极 |
16 | BLK | 背光源负极 |
1、基本时序:
1.1 读状态: 输入:RS=L,RW=H,E=H 输出:D0~D7=状态字
1.2 写指令:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲 输出:无
1.3 读数据:输入:RS=H,RW=H,E=H 输出:D0~D7=数据
1.4 写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲, 输出:无
2、状态字说明
STA7 | STA6 | STA5 | STA4 | STA3 | STA2 | STA1 | STA0 |
---|---|---|---|---|---|---|---|
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
STA0~6 | 当前数据地址指针的数值 | |
---|---|---|
STA7 | 读写操作使能 | 1:禁止 0:允许 |
proteus仿真之LCD1602字符串显示实验。
效果如下图:
源程序如下:
// 用LCD显示字符 ' abcd ’
#include<reg52.h> // 包含单片机寄存器的头文件
#include<intrins.h> // 包含 _nop_() 函数定义的头文件
typedef unsigned char uchar;
typedef unsigned int uint;
sbit LCD_RS = P1^0; // 数据/命令选择端
sbit LCD_RW = P1^1; // 读/写选择端
sbit LCD_EN = P1^2; // 使能端
sbit LCD_BF = P0^7; // 忙碌标志位
// 延时函数 1ms (3j+2)*i=(3x33+2)x10=1010(微秒) 可以认为是1毫秒
void delay1ms()
{
uchar i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++);
}
// 延时若干毫秒 人口参数:n
void delay(uchar n)
{
uchar i;
for(i=0;i<n;i++)
delay1ms();
}
/***************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。 result=1,忙碌, result=0 ,不忙
****************************************************/
uchar Busy_Test()
{
bit result;
LCD_RS = 0; // 根据规定,RS为低电平,RW为高电平时,可以读状态
LCD_RW = 1;
LCD_EN = 1; // E=1时,才可以读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); // 空操作四个机器周期,给硬件反应时间
result = LCD_BF; //将忙碌标志电平赋给result
LCD_EN = 0;
return result;
}
/*********************************************
函数功能:将模式指令或显示地址写入液晶模块
人口参数:dictate
*********************************************/
void Write_Instruction(uchar dictate)
{
while(Busy_Test() == 1); // 如果忙碌就等待
LCD_RS = 0; // 根据规定,RS和R/W同时为电平时,可以写人指令
LCD_RW = 0;
LCD_EN = 0; // E置低电平(根据表8-6,写指令时,E为高脉冲)
// 就是让E从0到1发生跳变,所以先置0
_nop_();
_nop_(); // 空操作两个机器周期,给硬件反应时间
P0 = dictate;
_nop_();
_nop_();
_nop_();
_nop_(); // 空操作四个机器周期,给硬件反应时间
LCD_EN = 1; // E 置高电平
_nop_();
_nop_();
_nop_();
_nop_(); // 空操作四个机器周期,给硬件反应时间
LCD_EN = 0 ; // 当 E 由高电平跳变到低电平时,液晶模块开始执行
}
/*********************************************
函数功能 : 指定字符显示的实际地址
人口参数:x
*********************************************/
void Write_Address(uchar x)
{
Write_Instruction(x|0x80); // 显示位置的确定方法规定为 “80H+地址码x”
}
/****************************************************
函数功能 :将数据(字符的标准ASCII码)写入液晶模块
人口参数 :y(为字符常量)
****************************************************/
void Write_Date(uchar y)
{
while(Busy_Test() == 1);
LCD_RS = 1; // RS为高电平,RW为低电平时,可以写入数据
LCD_RW = 0;
LCD_EN = 0; // E置低电平(根据表8-6,写指令时,E为高脉冲)
// 就是让E从0到1发生跳变,所以先置0
P0 = y; // 将数据送入P2口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_(); // 空操作四个机器周期,给硬件反应时间
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_(); // 空操作四个机器周期,给硬件反应时间
LCD_EN = 0;
}
/******************************************************
函数功能 :对LCD是显示模式进行初始化设置
******************************************************/
void Lcd_Init(void)
{
Busy_Test();
delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
Write_Instruction(0x38); // 显示模式设置:16 x 2 显示,5 x 7 点阵,8位数据接口
delay(5); // 延时5ms
Write_Instruction(0x38);
delay(5);
Write_Instruction(0x0E); // 显示模式设置:显示开,
delay(5);
Write_Instruction(0x0d); // 显示模式设置:光标右移,字符不移
delay(5);
Write_Instruction(0x01); //清屏指令,将以前的显示内容清除
delay(5);
}
void main(void)
{
uchar date[4] = {"acbd"};
uchar i;
Lcd_Init(); //调用LCD初始化函数
Write_Address(0x00); // 将显示地址指定为第一行第1列
for (i=0;i<4;i++)
{
Write_Date(date[i]);
}
while(1);
}