讲解LCD1602自定义字符原理

前言:

许多小伙伴在初步了解LCD1602基本原理后,想要向高阶玩法进行拓展(比如这个LCD1602显示自定义字符),但又感觉基础不够,原理不懂,代码难以下手,这篇文章就来讲解一下如何实现LCD1602自定义字符。

原理拆解:

步骤总览:

1.进行必要的初始化

2.用指令向CGRAM中写入点阵要显示字符的数据(即输入显示内容的数据)

3.用指令确定DDRAM的地址(即确定显示位置)

4.向DDRAM写入CGRAM该字符的地址(即确定显示内容)

1.初始化

基本的初始化就包括以下几个:
八位数据接口,两行显示,5*7点阵
显示开,光标关,闪烁关
数据读写操作后,光标自动加一,画面不动
光标复位,清屏

顺便插一嘴为什么要进行初始化:
在HD44780U资料中说到:

讲解LCD1602自定义字符原理_第1张图片

所以我们可知,当上电后,LCD1602初始状态是无显示,无光标闪烁的,所以要进行初始化。

2.输入显示内容

引入:

初始化完成后,我们怎么告诉LCD1602要显示什么内容呢?CGRAM就是一个专门接收用户自定义字符数据的寄存器,我们只需告诉CGRAM我们想要显示的数据,LCD1602就知道要显示什么了。

怎么写:

那么我们怎么告诉CGRAM我们要写入数据呢?这就需要我们用到CGRAM地址设置指令

然后我们先了解CGRAM寄存器的结构:

讲解LCD1602自定义字符原理_第2张图片 

1.总共有16个位置(但是其实8个位置,另外8个是重复的(即到后面确定显示内容是对同一位置可用两个地址))

2.CGRAM的每一个位置都对应屏幕中一个点阵

讲解LCD1602自定义字符原理_第3张图片

3.我们只要把自定义字符的点阵亮灭数据(0灭1亮)写入我们想要存储的CGRAM位置,就完成输入显示内容步骤。

了解完CGRAM的结构,就可以开始向CGRAM写自定义字符的点阵亮灭数据,写数据有以下注意点:
1.亮灭数据是一行一行写的

2.亮灭数据前三位是000(因为是5*8点阵,数据又是八位,所以要前三位是000)

以自定义字符'R'为例,带*号的就是为0,然后依次用指令向CGRAM写入字符'R'的每一行亮灭数据

讲解LCD1602自定义字符原理_第4张图片

3.确定显示位置

引入:

现在LCD1602已经知道我们要显示的字符的数据,那是不是还要知道在屏幕的哪里显示,所以就要用到DDRAM地址设置指令:

怎么写:

我们先来看DDRAM的作用和DDRAM地址和屏幕对应关系:

简单来说:DDRAM的作用就是闪存,我们向DDRAM写入数据,它就会让LCD1602在屏幕显示对应的内容。

对应关系如图:

讲解LCD1602自定义字符原理_第5张图片

1.一行有40个地址,能显示的只有前16个地址

2.注意设置地址的数据不是DDRAM的数据(因为DDRAM地址设置指令最高位固定为1)

所以写入屏幕第一位置是0x80(1000 0000)而不是0x00

4.确定显示内容

引入:

当LCD1602知道要把自定义字符显示在哪个位置时,是不是还要知道在那个位置要显示什么内容(不同于第一个输入显示内容,第一个相当于告诉LCD1602自定义字符长啥样,这个是让LCD1602把自定义字符显示在特定位置,一个是输入,一个是输出)

怎么写:

直接通过向DDRAM写入CGRAM中想要显示内容地址的数据即可(不是指令)

就是CGRAM寄存器前面的高4位和低4位

代码例子:

#include "regx52.h"
#include "LCD1602.h"
#include "delay.h"

void main()
{
	//LCD1602的初始化
	LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
	LCD_WriteCommand(0x0c);//显示开,光标开,闪烁关
	LCD_WriteCommand(0x01);//光标复位,清屏
	LCD_WriteCommand(0x06);//数据读写操作后,AC自动加一,画面不动
	
	while(1)
	{
		//输入显示内容数据
		LCD_WriteCommand(0x40);	//选择CGRAM的第一个位置的第一行
		LCD_WriteData(0x1e);//输入字符'R'第一行亮灭数据
		LCD_WriteCommand(0x41);	//选择CGRAM的第一个位置的第二行
		LCD_WriteData(0x11);//输入字符'R'第二行亮灭数据
		LCD_WriteCommand(0x42);	//选择CGRAM的第一个位置的第三行
		LCD_WriteData(0x11);//输入字符'R'第三行亮灭数据
		LCD_WriteCommand(0x43);	//选择CGRAM的第一个位置的第四行
		LCD_WriteData(0x1e);//输入字符'R'第四行亮灭数据
		LCD_WriteCommand(0x44);	//选择CGRAM的第一个位置的
		LCD_WriteData(0x14);//输入字符'R'第五行亮灭数据
		LCD_WriteCommand(0x45);	//选择CGRAM的第一个位置的第六行
		LCD_WriteData(0x12);//输入字符'R'第六行亮灭数据
		LCD_WriteCommand(0x46);	//选择CGRAM的第一个位置的第七行
		LCD_WriteData(0x11);//输入字符'R'第七行亮灭数据
		LCD_WriteCommand(0x47);	//选择CGRAM的第一个位置的第八行
		LCD_WriteData(0x00);//输入字符'R'第八行亮灭数据
		
		//确定显示位置
		LCD_WriteCommand(0x80);
		
		//确定显示内容
		LCD_WriteData(0x08);//CGRAM第一个位置的地址
		//或
		//LCD_WriteData(0x00);
		
	}
}

结果如图:

讲解LCD1602自定义字符原理_第6张图片

笔者有话:

要显示步骤看似简单,实现起来代码重复且冗长,可以看看我的另一篇文章https://blog.csdn.net/m0_73964304/article/details/132504276

已经实现函数封装,相信经过上面的学习,你应该知道其代码原理了。

你可能感兴趣的:(51单片机,c语言,显示器)