一、背景
我们学习过几种显示装置,例如静态数码管、动态数码管,串口通信等。但他们的显示具有局限性,现在我们来介绍一个新的显示字符的液晶显示器 LCD1602。接下来让我们一起进入LCD1602的学习旅程。
二、LCD1602的介绍
1、简介
1)、它是字符型液晶,能显示2行字符信息,每行又能显示16个字符。它只能显示字母,数字,符号的点阵型液晶模块,不能显示图片。
2)管脚图
3)LCD1602内部含有80个字节的DDRAM,用来寄存显示字符的。
注意,在写显示程序的时候,因为最高位要求是1,所以在写程序的时候,显示需要+0x80的数值。
2、常用指令
1)清屏指令:设置为0x01。
2)模式设置指令:一般设置为0x06。
I/D:0=写入新数据后光标左移,1=写入新数据后光标右移
S:0=写入新数据后显示屏不移动,1=写入数据后显示屏整体右移1个字符
3)显示开关控制指令:一般设置为0xC0
D:0=显示功能关 1=显示功能开
C:0=无光标,1=有光标
B:0=光标闪烁,1=光标不闪烁
4)功能设定指令:一般设置为0x38
DL:0=数据总线为4位,1=数据总线为8位
N:0=显示1行,1=显示2行
F:0=5x7 点阵/每字符 1=5x10点阵/每字符
5)设定显示屏或光标移动方向指令:0x18。滚动效果可以用这个实现,但是每次在写入数据之前都要调用一次。
S/C R/L 设定情况
0 0 光标左移1格,且AC值减1
0 1 光标右移1格,且AC值加1
1 0 显示器上字符全部左移一格,但光标不动
1 1 显示器上字符全部右移一格,但光标不动
3、写入数据时序图
4、电路图
三、实验程序
#include "lcd1602.h"
/**
*@brief 写命令函数
*@param 命令
*@retval 无
*/
void Lcd1602_WriteCmd(u8 cmd)
{
Lcd1602_RS = 0;//数据和命令选择:0表示命令,1表示数据
Lcd1602_WR = 0;//读写:0表示写,1表示数据
Lcd1602_EN = 0;
Lcd1602_DataPort = cmd;
Delay_ms(1);
Lcd1602_EN = 1;
Delay_ms(1);
Lcd1602_EN = 0;
}
/**
*@brief 写数据函数
*@param 数据
*@retval 无
*/
void Lcd1602_WriteData(u8 dat)
{
Lcd1602_RS = 1;//数据和命令选择:0表示命令,1表示数据
Lcd1602_WR = 0;//读写:0表示写,1表示数据
Lcd1602_EN = 0;
Lcd1602_DataPort = dat;
Delay_ms(1);
Lcd1602_EN = 1;
Delay_ms(1);
Lcd1602_EN = 0;
}
/**
*@brief 初始化函数,设置初始值
*@param 无
*@retval 无
*/
void Lcd1602_Init()
{
Lcd1602_WriteCmd(0x0c);//0000 1100 显示开,游标不显示,闪烁 (显示开/关控制)
Lcd1602_WriteCmd(0x06);//0000 0110 写入数据后光标自动右移,整屏不移动
Lcd1602_WriteCmd(0x38);//0011 1000 数据总线8位,
Lcd1602_WriteCmd(0x01);//清屏指令
}
/**
*@brief 显示字符串,如果第一行显示超过范围,到第二行继续显示,如果第三行超过范围,到第三行继续显示。
*@param x:显示行,y:显示位置
*@retval 无
*/
void Lcd1602_ShowString(u8 x,u8 y,u8 *str)
{
u8 i = 0;
if(x > 1 || y > 15) return;
if(x == 0)
{
while(*str != '\0')
{
if(y + i < 16)
{
Lcd1602_WriteCmd(y + i + 0x80);
}else{
Lcd1602_WriteCmd(i + y-16 + 0x80 + 0x40);
}
Lcd1602_WriteData(*str);
i++;
str++;
}
}else
{
while(*str != '\0')
{
if(y + i < 16)
{
Lcd1602_WriteCmd(y + i + 0x80 + 0x40);
}else{
Lcd1602_WriteCmd(y + i -16 + 0x80);
}
Lcd1602_WriteData(*str);
i++;
str++;
}
}
}
#include "public.h"
#include "lcd1602.h"
sbit LED1 = P2^0;
void main()
{
Lcd1602_Init();
while(1)
{
Lcd1602_WriteCmd(0x18);
Lcd1602_ShowString(0,0,"HelloWorld");
Lcd1602_ShowString(1,0,"I Love you");
Delay_ms(1000);
}
}
总结:LCD1602的实验程序已经写完了,是不是很简单,只要是对LCD1602有个了解就行了。主要的是初始化指令,写指令和写数据。
程序代码我已经上传到资源了:https://download.youkuaiyun.com/download/weixin_41392061/89944447