目录
前言
1 LCD1602简介
1.1 特点
1.2 引脚说明
1.3 引脚连接情况
2 写操作
2.1 写操作时序图
3 LCD1602内部资源及显示原理
3.1 控制指令
3.2 RAM地址映射
大家好啊,我叫DW,今天分享一个刚买的LCD1602模块,希望和大家一起学习一起进步!
LCD1602字面意思就是每行可以显示16个字符,一个可以显示2行内容
管脚号 | 名称 | 功能 |
---|---|---|
1 | Vss | 电源地GND |
2 | Vdd | 电源电压+5V |
3 | VO | LCD驱动电压可调(对比度) |
4 | RS | 寄存器输入端。 RS=0,当MPU进行写模块操作时,指向指令寄存器; RS=1,无论MPU读操作还是写操作时,均指向数据寄存器; |
5 | R/W | 读写输入控制端。 R/W=1,读操作; R/W=0,写操作。 |
6 | E | E端是使能端,高电平有效,当E端由高电平跳变成低电平的时候,液晶模块执行命令 |
7-14 | DB0--DB7 | 8位双向数据总线 |
15 | A | 背光的正端+5V |
16 | K | 背光的负端0V |
管脚号 | 名称 | 与STM32连接情况 |
---|---|---|
1 | Vss | GND |
2 | Vdd | 5V |
3 | VO | 连接一个10K电位器在接GND |
4 | RS | PB6 |
5 | R/W | PB7 |
6 | E | PB8 |
11-14 | DB4--DB7 | PC2 PC3 PA0 PA6(本实验采用四根数据线,大家可以根据需求选择排在一起的引脚,便于连线) |
15 | A | 5V(可以加一个小电阻限流) |
16 | K | GND |
给个小提示,程序烧录进去,若没有显示内容
1.检查引脚是否正确
2.调节10K电位器
写数据前准备工作
(1) 写指令:RS=0(拉低);写数据:RS=1(拉高)。
(2)写操作 :RW=0(拉低);
(3)拉低E引脚,E=0,并将数据引脚封装(D4-D7)
void WriteData(u8 data)
{
GPIO_WriteBit(GPIOA, D7,(BitAction)((data & 0x80) >> 7 )); //D7
GPIO_WriteBit(GPIOA, D6,(BitAction)((data & 0x40) >> 6 )); //D6
GPIO_WriteBit(GPIOC, D5,(BitAction)((data & 0x20) >> 5 )); //D5
GPIO_WriteBit(GPIOC, D4,(BitAction)((data & 0x10) >> 4 )); //D4
}
写数据
(4)我们只用到写操作,下降沿有效,故将E拉高,延时3ms,再将其拉低。由于我用了四根数据线,故需要把八位数据分两次发送,先送高四位,在送低四位,因此发送指令和数据的函数如下:
//写指令写数据合并成一个函数
void LCD1602_Write_Cmd_Data(u8 cmd,u8 data){
(cmd) ? RS_High:RS_Low;
RW_Low;
EN_Low;
WriteData(data|0x0f);//高四位
delay_ms(3);
EN_High;
delay_ms(3);
EN_Low;
WriteData((data<<4)|0x0f);//低四位
delay_ms(3);
EN_High;
delay_ms(3);
EN_Low;
}
LCD1602有11个控制指令,今天我就写几个本文用到的指令,其它用不到的指令大家有兴趣可以自己查看数据手册
(1)功能设置指令
功能设置命令DL:高电平时为4位总线,低电平时为8位总线。N:低电平时为单行显示,高电平时双行显示。F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
0x38:162显示,57点阵,8位数据口(基本设置显示模式)
0x32:8线转4线
(2)显示开关控制
指令4:显示开关控制。D: 控制整体显示的开与关,高电平表示开显示,低电平表示关显示。C:控制光标的开与关,高电平表示有光标,低电平表示无光标。B: 控制光标是否闪烁,高电平闪烁,低电平不闪烁。
0x0c:开显示,光标关闭且不闪烁
(3)置输入模式
指令3:光标和显示模式设置 I/D: 光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
0x06:文字不动,地址+1
(4)清屏
0x01:清除屏幕显示
所有指令初始化如下:
void LCD1602_Init(void){
LCD1602_Write_Cmd_Data(CMD,0x38);//基本设置显示模式
LCD1602_Write_Cmd_Data(CMD,0x32);//8线转4线
LCD1602_Write_Cmd_Data(CMD,0x0c);//开显示,光标关闭
LCD1602_Write_Cmd_Data(CMD,0x06);//文字不动。地址+1
LCD1602_Write_Cmd_Data(CMD,0x01);//清屏
}
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。内部显示地址如下图:
由这幅图我们可以知道,第一行第一个字符的位置为:0x00,第二行第二个字符的 位置为0x40。
例如第一行第一个字符的地址是00H,那么是否直接写入00H就可以将光标定位在第一行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1,所以
实际写入的数据应该是0000 0000B (00H) + 1000 0000B(80H) = 1000 0000B(80H).
因此,按照这个规律,编写如下函数:
//光标标显示 (x,y)对应屏幕上的字符坐标
void LCD1602_Set_Cursor(u8 x,u8 y){
u8 addr;
if(y==0)
addr = x + 0x00;//第一行
else
addr = x + 0x40;//第二行
LCD1602_Write_Cmd_Data(CMD,addr|0x80);
}
接下来,我们只需要编写一个字符串的显示函数即可,其函数如下:
//字符串显示
void LCD1602_Show_Str(u8 x,u8 y,u8 *str){
LCD1602_Set_Cursor(x,y);//写坐标
while(*str != '\0'){
LCD1602_Write_Cmd_Data(DAT,*str++);//写数据
}
}
最后我们只需要调用void LCD1602_Show_Str(u8 x,u8 y,u8 *str)函数就可以显示我们想要的字符,比如在第一行显示:geigedianzan,代码如下:
LCD1602_Show_Str(0,0,(u8*)"geigedianzan");
好了,看一下效果吧,如果有不好的地方,恳请大家指出来哦,谢谢各位,有用的话给个赞吧!!例程在我的资源里,需要自提。