• 讲解LCD1602自定义字符原理


    前言:

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

    原理拆解:

    步骤总览:

    1.进行必要的初始化

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

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

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

    1.初始化

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

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

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

    2.输入显示内容

    引入:

    初始化完成后,我们怎么告诉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'的每一行亮灭数据

    3.确定显示位置

    引入:

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

    怎么写:

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

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

    对应关系如图:

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

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

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

    4.确定显示内容

    引入:

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

    怎么写:

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

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

    代码例子:

    1. #include "regx52.h"
    2. #include "LCD1602.h"
    3. #include "delay.h"
    4. void main()
    5. {
    6. //LCD1602的初始化
    7. LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
    8. LCD_WriteCommand(0x0c);//显示开,光标开,闪烁关
    9. LCD_WriteCommand(0x01);//光标复位,清屏
    10. LCD_WriteCommand(0x06);//数据读写操作后,AC自动加一,画面不动
    11. while(1)
    12. {
    13. //输入显示内容数据
    14. LCD_WriteCommand(0x40); //选择CGRAM的第一个位置的第一行
    15. LCD_WriteData(0x1e);//输入字符'R'第一行亮灭数据
    16. LCD_WriteCommand(0x41); //选择CGRAM的第一个位置的第二行
    17. LCD_WriteData(0x11);//输入字符'R'第二行亮灭数据
    18. LCD_WriteCommand(0x42); //选择CGRAM的第一个位置的第三行
    19. LCD_WriteData(0x11);//输入字符'R'第三行亮灭数据
    20. LCD_WriteCommand(0x43); //选择CGRAM的第一个位置的第四行
    21. LCD_WriteData(0x1e);//输入字符'R'第四行亮灭数据
    22. LCD_WriteCommand(0x44); //选择CGRAM的第一个位置的
    23. LCD_WriteData(0x14);//输入字符'R'第五行亮灭数据
    24. LCD_WriteCommand(0x45); //选择CGRAM的第一个位置的第六行
    25. LCD_WriteData(0x12);//输入字符'R'第六行亮灭数据
    26. LCD_WriteCommand(0x46); //选择CGRAM的第一个位置的第七行
    27. LCD_WriteData(0x11);//输入字符'R'第七行亮灭数据
    28. LCD_WriteCommand(0x47); //选择CGRAM的第一个位置的第八行
    29. LCD_WriteData(0x00);//输入字符'R'第八行亮灭数据
    30. //确定显示位置
    31. LCD_WriteCommand(0x80);
    32. //确定显示内容
    33. LCD_WriteData(0x08);//CGRAM第一个位置的地址
    34. //
    35. //LCD_WriteData(0x00);
    36. }
    37. }

    结果如图:

    笔者有话:

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

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

  • 相关阅读:
    【SOPHON】算能盒子SE-16的配套x86交叉编译环境搭建
    RabbitMq(一)
    HTML制作一个介绍自己家乡的网站——贵阳,排版整洁,内容丰富,主题鲜明
    Git & GitHub VSCode 简单使用
    SpringMVC实现增删改查
    如何使用ArcGIS Pro生成带计曲线等高线
    大数据-Hadoop-基础篇-第九章-Storm
    查看docker容器中的ip
    多路转接(使用poll实现)
    go gin 单图上传
  • 原文地址:https://blog.csdn.net/m0_73964304/article/details/132645825