LCD1602介绍
外观
主要技术参数
显示容量: 16X2个字符
芯片工作电压: 4.5~5.5V
工作电流: 2.0mA(5.0V)
模块最佳工作电压: 5.0V
字符尺寸: 2.95X4.35(WXH)mm
接口说明
并口传输模式
VSS 电源地
VDD 电源正极(5V)
V0 液晶显示偏压信号
RS 数据/命令选择端(H/L)
RW 读/写选择端(H/L)
E 使能信号
D0 Data I/O
D1 Data I/O
D2 Data I/O
D3 Data I/O
D4 Data I/O
D5 Data I/O
D6 Data I/O
D7 Data I/O
A 背光源正极
K 背光源负极
IIC/I2C模式
GND 电源地
VCC 电源正极(5V)
SDA 数据I/O口
SCL 数据时钟
单片机实现
并口传输模式
基本操作时序:
读状态:
输入:RS=L,RW=H,E=H
输出:D0~D7=状态字
写指令:
输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲
输出:无
读数据:
输入:RS=H,RW=H,E=H
输出:DO~D7=数据
写数据:
输入:RS=H,RW=L,D0~D7=数据,E=高脉冲
输出:无
RAM地址映射图:
指令说明
1、清屏指令(clear display) RS=L,RW=L,D0~D7=0000_0001
功能:
清除液晶显示器,即将DDRAM中的内容全部填入20H(空白字符)
光标撤回至显示屏左上角
将地址计数器(AC)设为0
光标移动方向为从左向右,并且DDRAM的自增量为1(I/D=1)
2、光标归位指令(Return Home)RS=L,RW=L,D0~D7=0000_001X
功能:
将地址计数器(AC)设为00H
DDRAM内容保持不变,光标移至左上角
3、进入模式设置指令(Entry Mode Set)
功能:
设定每次写入1位数据后光标移位方向并且设定光标每次写入一个字符后是否移动 。
I/D = 0时光标左移,DDRAM地址自增1
I/D = 1时光标右移,DDRAM地址自增1(当从CGRAM中读取或写入数据时,CGRAM操作与DDRAM相同)
SH = 0 且 DDRAM是读操作(CGRAM读或写),整个屏幕不移动
SH = 1 且DDRAM是写操作,整个屏幕移动,移动方向由I/D决定。
4、显示开关控制(Display ON/OFF Control)
功能:
D = 1 , 显示功能开
D = 0 , 显示功能关,但是DDRAM中的数据依然保留
C = 1 , 有光标
C = 0 , 没有光标
B = 1 , 光标闪烁
B = 0 , 光标不闪烁
5、设置显示屏或光标移动方向的指令
功能:
整屏的移动或光标移动
S/C =0 R/L =0 光标左移 ,地址计数器减1(即显示内容和光标一起左移)
S/C =0 R/L =1 光标右移 ,地址计数器加1(即显示内容和光标一起右移)
S/C =1 R/L =0 显示内容左移 ,光标不移动
S/C =1 R/L =1 显示内容右移 ,光标不移动
6、功能设定指令
功能:
设定数据总线位数、显示的行数及字形。
DL=1 ,数据总线是8位
DL=0 ,数据总线是4位
N=0 ,显示一行
N=1 ,显示两行
F=0 ,5*8 点阵/字符
F=1 ,5*11点阵/字符
7.设置DDRAM(光标)地址
功能:
设置地址计数器AC的值,实则上是设置光标所在的位置。
DDRAM的地址与显示屏对照关系(N=LOW)
八线模式单片机实现代码
非常感谢MSP430F5529&LCD1602程序的作者Aliqiji提供思路和代码!
端口操作宏定义
#define DataDir P3DIR //D0~D7分别对应P3.0-P3.7
#define DataPort P3OUT
#define CLR_RS P1OUT&=~BIT3; //RS = P1.3
#define SET_RS P1OUT|=BIT3;
#define CLR_RW P1OUT&=~BIT4; //RW = P1.4
#define SET_RW P1OUT|=BIT4;
#define CLR_EN P1OUT&=~BIT5; //EN = P1.5
#define SET_EN P1OUT|=BIT5;
初始化端口
void GPIO_init(){
P1DIR |= BIT3+BIT4+BIT5; //控制线端口设为输出状态
DataDir = 0xFF;
}
精确延时
void delay_ms(unsigned int ms){ //For MSP430F5529
for(;ms>0;ms--) __delay_cycles(1000);
}
写指令
void LCD1602_WriteCMD(unsigned char cmd)
{
CLR_EN;
CLR_RS; //指令
CLR_RW; //写
DataPort=cmd; //指令数据传到P0口待发送给LCD1602
SET_EN;
CLR_EN; //产生下降沿
delay_ms(1);
}
写数据
void LCD1602_WriteDATA(unsigned char Data)
{
CLR_EN;
SET_RS; //数据
CLR_RW; //写
DataPort=Data;
SET_EN;
CLR_EN; //产生下降沿
delay_ms(1);
}
LCD1602初始化
void LCD1602_Init()
{
GPIO_init();
LCD1602_WriteCMD(0x38); // 置功能,8位总线,双行显示,显示5X7的点阵字符
LCD1602_WriteCMD(0x0f); // 显示开关控制,开显示, 有光标,闪烁
LCD1602_WriteCMD(0x06); // 光标和显示位置设置, 光标移动方向右移,屏幕上所有文字不动
LCD1602_WriteCMD(0x01); // 清显示,指令码01H,光标复位到地址00H位置
delay_ms(10);
}
在当前指针位置显示单个字符
void DispChar(unsigned char data)
{
LCD1602_WriteDATA(data);
}
在当前指针位置显示字符串
void DispStr(unsigned char *str)
{
while(*str != 0){
DispChar(*str++);
}
}
设置指针位置
这部分的内容在前文指令说明中***设置DDRAM(光标)地址*** 处有所提及。
设置指针在第一行最左端
LCD1602_WriteCMD(0x80);
设置指针在第二行最左端
LCD1602_WriteCMD(0x80 + 0x40);
四线模式单片机实现代码
在显示速度要求不高的情况下,八线并口模式占用了过多的单片机管脚,如果管脚资源紧张,可以试一试使用四线模式。
四线模式是指只使用数据端口D4~D7完成与八线模式一样的操作,但不同的是,四线模式只能写而不能读。
四线模式的时序操作与八线模式不同点在于,一个指令或者一个数据,需要传输两次,也就是EN产生两次下降沿,第一次下降沿的时候传输高四位数据,第二次下降沿的时候传输低四位数据。
那么,我们应该怎么修改上述代码来实现四线模式呢~请看下文
端口操作宏定义
#define DataDir P3DIR
#define DataPort P3OUT
#define CLR_RS P1OUT&=~BIT3; //RS = P1.3
#define SET_RS P1OUT|=BIT3;
#define CLR_RW P1OUT&=~BIT4; //RW = P1.4
#define SET_RW P1OUT|=BIT4;
#define CLR_EN P1OUT&=~BIT5; //EN = P1.5
#define SET_EN P1OUT|=BIT5;
初始化端口
由于我当时写的综合代码中,P3.4端口被占用,所以我采用了P3.0,P3.5,P3.6,P3.7四个端口作为数据口。
void GPIO_init(){
P1DIR |= BIT3+BIT4+BIT5; //控制线端口设为输出状态
DataDir = BIT0+BIT5+BIT6+BIT7;
}
设置数据端口
void Set_DataPort(unsigned char Data){
if(Data&BIT4) P3OUT |= BIT0;
else P3OUT &= ~BIT0;
if(Data&BIT5) P3OUT |= BIT5;
else P3OUT &= ~BIT5;
if(Data&BIT6) P3OUT |= BIT6;
else P3OUT &= ~BIT6;
if(Data&BIT7) P3OUT |= BIT7;
else P3OUT &= ~BIT7;
}
写指令
void LCD1602_WriteCMD(unsigned char cmd)
{
CLR_EN;
CLR_RS; //指令
Set_DataPort(cmd&0b11110000); //指令数据传到P0口待发送给LCD1602
SET_EN; //LCD1602使能口
CLR_EN; //产生下降沿
Set_DataPort((cmd&0b00001111)<<4); //指令数据传到P0口待发送给LCD1602
SET_EN;
CLR_EN
delay_ms(1);
}
写数据
void LCD1602_WriteDATA(unsigned char data)
{
CLR_EN;
SET_RS; //指令
Set_DataPort(data&0b11110000); //数据传到P0口待发送给LCD1602
SET_EN; //LCD1602使能口
CLR_EN; //产生下降沿
Set_DataPort((data&0b00001111)<<4); //数据传到P0口待发送给LCD1602
SET_EN;
CLR_EN
delay_ms(1);
}
LCD1602初始化
void LCD1602_Init()
{
GPIO_init();
LCD1602_WriteCMD(0b00101000); // 置功能,4位总线,双行显示,显示5X7的点阵字符 //00101000
LCD1602_WriteCMD(0b00001100); // 显示开关控制,开显示, 有光标,闪烁
LCD1602_WriteCMD(0b00000110); // 光标和显示位置设置, 光标移动方向右移,屏幕上所有文字不动
LCD1602_WriteCMD(0b00000001); // 清显示,指令码01H,光标复位到地址00H位置
delay_ms(10);
}
单片机接线
接线按照1.3接口说明以及代码中所选择的端口接即可,背光源A、K一般情况下是不用接的。
特别要说明的是,V0(液晶显示偏压信号)的接线,数据手册中说它要接一个电位器到地以调节对比度,如下图所示。
所以我们可以把它接到MSP430F5529的拨码电位器(P6.5)上,接上之后就可以通过拨动拨码电位器调节屏幕的对比度啦!
结语
通过学习LCD1602的操作,我们可以了解到单片机与外设间进行并口通信的一般原理。并口通信速度快,但是占用的管脚多,接线麻烦,在管脚资源紧张的情况下还会导致很多其他的问题,虽然LCD1602提供的四线模式可以在一定程度上缓和这种矛盾,但是有没有其他更省管脚资源的方法呢?答案是有的,那就是采用串口通信,下篇文章我将讲讲利用I2C协议与LCD1602进行串口通信~
上一篇:MSP430G2553、F5529、FR5994+LCD1602八位液晶显示程序
下一篇:LCD1602动态显示--基于MSP430F149单片机
推荐阅读最新更新时间:2024-11-03 16:10
设计资源 培训 开发板 精华推荐
- LT1192 的典型应用 - 超高速运算放大器
- LIS2DE12适配器板,标准DIL24插座
- AM2F-2409SH52Z 9V 2W DC-DC 转换器的典型应用
- LTC3330 的典型应用 - 具有能量收集电池寿命延长器的纳米功率降压-升压型 DC/DC
- TCA62723FMG CMOS集成电路的典型应用Silicon Monolithic
- AM1/4S-0507SZ 7.2V 0.25 瓦 DC-DC 转换器的典型应用
- DC933A,使用 LT5512 HF/VHF/UHF 下变频混频器的演示板
- DER-52 - 3.9W电源
- LF60ABDT-TR 6V 多路低压降稳压器电源的典型应用,带 ON/OFF 拨动开关
- RD-406,使用 FSBB15CH60D 15A/600V Motion SPM 3 系列的参考设计,用于电机控制应用