4.STM32F103-LCD1602显示字符

目录

前言

1  LCD1602简介

1.1 特点

         1.2 引脚说明

1.3 引脚连接情况

2  写操作

2.1 写操作时序图

3  LCD1602内部资源及显示原理

3.1 控制指令

3.2 RAM地址映射


前言

大家好啊,我叫DW,今天分享一个刚买的LCD1602模块,希望和大家一起学习一起进步!

4.STM32F103-LCD1602显示字符_第1张图片


1  LCD1602简介

1.1 特点

LCD1602字面意思就是每行可以显示16个字符,一个可以显示2行内容

1.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

1.3 引脚连接情况

管脚号 名称 与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电位器

2  写操作

2.1 写操作时序图

4.STM32F103-LCD1602显示字符_第2张图片

解析:

写数据前准备工作

(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;
}

3  LCD1602内部资源及显示原理

3.1 控制指令

4.STM32F103-LCD1602显示字符_第3张图片

LCD1602有11个控制指令,今天我就写几个本文用到的指令,其它用不到的指令大家有兴趣可以自己查看数据手册

(1)功能设置指令

32f4284217a44cc7b97e078ce071a2ef.png

功能设置命令DL:高电平时为4位总线,低电平时为8位总线。N:低电平时为单行显示,高电平时双行显示。F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。

0x38:162显示,57点阵,8位数据口(基本设置显示模式)

0x32:8线转4线

(2)显示开关控制

6cffd441986a42cb9f175bf45ac7c074.png

 指令4:显示开关控制。D: 控制整体显示的开与关,高电平表示开显示,低电平表示关显示。C:控制光标的开与关,高电平表示有光标,低电平表示无光标。B: 控制光标是否闪烁,高电平闪烁,低电平不闪烁。

0x0c:开显示,光标关闭且不闪烁

(3)置输入模式

288c65d7c78a4ea9bf6a83fca538aaa3.png

指令3:光标和显示模式设置 I/D: 光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。

0x06:文字不动,地址+1 

(4)清屏

78a8a087caa94cbea2fa2db9902014e9.png

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);//清屏
}

3.2 RAM地址映射

要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。内部显示地址如下图:

4.STM32F103-LCD1602显示字符_第4张图片
 

由这幅图我们可以知道,第一行第一个字符的位置为: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");

好了,看一下效果吧,如果有不好的地方,恳请大家指出来哦,谢谢各位,有用的话给个赞吧!!例程在我的资源里,需要自提。

4.STM32F103-LCD1602显示字符_第5张图片

你可能感兴趣的:(STM32,stm32,c语言)