许多小伙伴在初步了解LCD1602基本原理后,想要向高阶玩法进行拓展(比如这个LCD1602显示自定义字符),但又感觉基础不够,原理不懂,代码难以下手,这篇文章就来讲解一下如何实现LCD1602自定义字符。
1.进行必要的初始化
2.用指令向CGRAM中写入点阵要显示字符的数据(即输入显示内容的数据)
3.用指令确定DDRAM的地址(即确定显示位置)
4.向DDRAM写入CGRAM该字符的地址(即确定显示内容)
基本的初始化就包括以下几个:
八位数据接口,两行显示,5*7点阵
显示开,光标关,闪烁关
数据读写操作后,光标自动加一,画面不动
光标复位,清屏
顺便插一嘴为什么要进行初始化:
在HD44780U资料中说到:
所以我们可知,当上电后,LCD1602初始状态是无显示,无光标闪烁的,所以要进行初始化。
初始化完成后,我们怎么告诉LCD1602要显示什么内容呢?CGRAM就是一个专门接收用户自定义字符数据的寄存器,我们只需告诉CGRAM我们想要显示的数据,LCD1602就知道要显示什么了。
那么我们怎么告诉CGRAM我们要写入数据呢?这就需要我们用到CGRAM地址设置指令
然后我们先了解CGRAM寄存器的结构:
1.总共有16个位置(但是其实8个位置,另外8个是重复的(即到后面确定显示内容是对同一位置可用两个地址))
2.CGRAM的每一个位置都对应屏幕中一个点阵
3.我们只要把自定义字符的点阵亮灭数据(0灭1亮)写入我们想要存储的CGRAM位置,就完成输入显示内容步骤。
了解完CGRAM的结构,就可以开始向CGRAM写自定义字符的点阵亮灭数据,写数据有以下注意点:
1.亮灭数据是一行一行写的
2.亮灭数据前三位是000(因为是5*8点阵,数据又是八位,所以要前三位是000)
以自定义字符'R'为例,带*号的就是为0,然后依次用指令向CGRAM写入字符'R'的每一行亮灭数据
现在LCD1602已经知道我们要显示的字符的数据,那是不是还要知道在屏幕的哪里显示,所以就要用到DDRAM地址设置指令:
我们先来看DDRAM的作用和DDRAM地址和屏幕对应关系:
简单来说:DDRAM的作用就是闪存,我们向DDRAM写入数据,它就会让LCD1602在屏幕显示对应的内容。
对应关系如图:
1.一行有40个地址,能显示的只有前16个地址
2.注意设置地址的数据不是DDRAM的数据(因为DDRAM地址设置指令最高位固定为1)
所以写入屏幕第一位置是0x80(1000 0000)而不是0x00
当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);
-
- }
- }
结果如图:
要显示步骤看似简单,实现起来代码重复且冗长,可以看看我的另一篇文章https://blog.csdn.net/m0_73964304/article/details/132504276
已经实现函数封装,相信经过上面的学习,你应该知道其代码原理了。