1602 液晶显示模块 + HD44780 控制芯片 使用指北

2023-12-16 08:08

本文主要是介绍1602 液晶显示模块 + HD44780 控制芯片 使用指北,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习单片机少不了用到液晶显示模块,说到液晶显示模块想必一定要学习1602这款,1602只是个显示模块的代号,并不是指具体哪一个厂商的哪一款产品。“16”的意思是显示屏上“每一行显示16个字符”,“02”的意思是显示屏上可以显示2行。

1602的控制芯片,也就是MCU(Microcontroller Unit)是HD44780,只有通过MCU,1602才能按照我们的设计进行显示。

在学习1602之初,对于如何操作这款液晶显示模块不甚了解,网上的文章查了不少,但感觉还是一知半解,大部分资料存在两个问题:第一是不够完整,有很多名词和概念解释得不够清楚,内容节选自某些芯片厂商的数据手册,厂商是按照一定顺序和逻辑编写的技术文档,如果仅是节选,就无法以正常的思维方式了解全部;第二是缺乏细节,对某一点解释得不够透彻。所以看完之后我就进入了“半瓶子”状态,说自己会不能说错,的确也知道一些,说不会也不冤枉,因为真的不会实际操作。为了学得彻底,我还是决定老老实实、认认真真的从最基本的知识和概念入手,进行学习和研究。既然1602是由MCU控制的,那咱们就来学习HD44780这款MCU的知识。网上下载了HITACHI生产的HD44780U的资料,一起看看。

一. 总体介绍

  1. HD44780U是一款“点阵式(dot-matrix)液晶(liquid crystal)显示控制器”
  2. 能够配合4位或者8位微处理器驱动点阵式液晶显示模块
  3. 能够显示1行或者2行,每行8个字符的信息
  4. 可以显示5X8点阵字符,也可以显示5X10点阵字符
  5. 扩展了“字符生成器(charator generator )ROM”,也被称为“CGROM”,使之可以显示208个字符(使用5X8点阵字符显示),或者32个字符(使用5X10点阵字符显示),总共240个不同的字符显

二. 功能介绍

  1. 寄存器选择标志 Register Selector(RS)

    a. 芯片包括2个8位寄存器,一个是指令寄存器(instruction register,简称 IR),另一个是数据寄存器(data register,简称 DR)

    b. IR存储指令,例如“清屏”指令,“光标移动”指令等,除此之外,IR还存储用于显示数据的地址信息,这里的“地址”指的是“显示数据随机存储器(DDRAM)”或者“字符生成随机存储器(CGRAM)”中存储的地址信息,DDRAM和CGRAM在后面介绍

    c. DR存储数据,当需要传输数据到显示模块时,数据是需要传送给MCU中的DDRAM或者CGRAM这样的存储器中,在这个过程中,数据先存储在DR当中,在传送到DDRAM或者CGRAM中。同理,从显示模块的MCU中读取数据时,也需要使用DR充当中转站,需要注意的是,DR和DDRAM或者CGRAM的传输是自动完成的。另外,既然写入和读取都与DDRAM或者CGRAM有关系,那么如何知道数据写入或者读取DDRAM或者CGRAM中的哪个位置呢,这就要用到IR中存储的相关地址信息。还有一点需要说明,在进行读取操作时,当前一个地址中的数据读取完毕后,位于DDRAM或者CGRAM中的下一个地址中的数据会被自动发送到DR中等待MCU的下一次读取。想一想,写入数据时候,地址会不会自动转移到下一位呢?

    d. MCU设置了“寄存器选择标志 (Register Selector)”来判断应该使用哪个寄存器,使用者需要设置RS的电平用以实现相关寄存器的选择。
     
  2. 读写操作选择标志 Read/Write (R/W)

    通过设置“读写操作选择标志”为高、低电平通知MCU应该进行“读”或者“写”哪一种操作

    R/W与RS配合设置可以实现多种操作,如下图

  3. 忙标志(Busy Flag)

    当Bush Flag,简称BF为1时,MCU处于“忙”状态,所谓“忙”的意思是说MCU还处于内部操作当中,你也可以认为是MCU“发呆”了,此时,MCU不接受任何指令。只有BF为0时才意味着MCU“清醒”了,这时才能和外界通讯,从而接受指令。注意,当设置R/W和RS实现读取指令时,MCU在DB7位(也就是读出的二进制数列的最高位)读取BF的状态值(0或者1),这样,就可以根据BF的值判断MCU的“清醒的”还是“正在发呆”。
     
  4. 地址计数器(Address Counter,简称 AC)

    地址计数器,简称AC,是用来存储地址信息的,当IR中写入了一个地址信息,它就被发送给AC,AC既可以存储DDRAM的地址信息,也可以存储CGRAM的地址信息,至于如何区分,则是写入IR时通过指定的一些格式进行实现的。在读出(或者写入)DDRAM或者CGRAM后,AC中的值会自动加1或者减1。
     
  5. 显示数据随机存储器 (Display Data RAM,简称DDRAM)

    a. DDRAM可以被认为是“显存”,存储在其中的内容就会被显示屏显示,DDRAM是随机存储器,意味着我们可以向其中写入信息,写入什么信息就显示什么信息,但断电后DDRAM中的信息就被“释放”了。其中一共可以存储并显示80个字符,每个字符有一个地址,这个地址用8位二进制数表示。其中有几点需要注意。

    b. 第一点:显示屏上能够显示的字符不足80个,1602显示模块每行最多能显示16个字符,其余的字符是无法同时在屏幕上显示的,为何要设置如此多的又不能同时显示的字符呢,其实是为了能做到“滚屏”,在此不做展开,请自行想象。而不同的芯片显示的字符长度是不同的,使用时需要查看数据手册。1602可以设置成同时显示2行,每行16个字符,地址如下图,发现其中第一行最后一个字符的地址和第二行第一字符的地址并不连续,使用时需要注意。



    c. 第二点:你会发现在使用DDRAM地址的时候,指令格式的范例中都是7位,不是8位吗?怎么变成7位了呢,原因是HD4478U芯片中设置了最多80个字符,也就意味着最多有80个地址,最大地址用十六进制表示为4F,用二进制表示就是1001111,所以最大就是7位二进制数,那么第8位即最高位用做什么呢?在设置DDRAM地址的时候第8位要预先设定为1,这一点后面还会提及。

    d. 第三点:当设置了“滚屏”功能时,显示屏可以显示DDRAM中被隐藏的其他储存单元中的字符,而显示内容按照储存单元“首尾相接”的顺序进行排布,并且两行同时滚动。例如上、下两行显示完最后两个字符(上图中地址27和67),滚动后接着显示的就是第一个字符(上图中地址00和40)。
     
  6. 字符生成只读存储器(Character Generator ROM,简称CGROM)

    a. CGROM存储了240个已经被定义好的字符,其中包括208个5X8点阵的字符,32个5X10点阵的字符。

    b. CGROM其实就是一个“字符表”,每个字符都有一个标识,以二进制表示的8位数字表示,这个标识被称为 Character Codes,即“字符码”,想要显示哪个字符直接向DDRAM中写入这个“字符码”就可以了。

    c. CGROM为只读存储器,不能修改。
     
  7. 字符生成随机存储器(Character Generator RAM,简称CGRAM)

    a. CGRAM是随机存储器,意味着可以写入和修改信息,但是在断电后就CGRAM中的内容就释放了。我们可以用CGRAM编写CGROM中没有的字符。

    b. 对于5X8点阵显示方式,可以编写总共8个自定义字符,对于5X10点阵显示方式,可以编写总共4个自定义字符。

    c. 与CGROM的设计相同,CGRAM中的每个“自定义”字符也有一个标识,以二进制表示的8位数字表示,与CGROM中的字符的“字符码”不同的是,CGRAM中的每一个字符的字符码其高4位二进制数值都是0,低4位二进制数值的前三位即第0、1、2位用来表示不同的字符,对于5X8点阵显示方式,这三位的字符码从“000”到“111”。低4位的第4位是“无效”位,意思是可以被设置为0,也可以被设置为1。

    d. 与每个字符码相对应的是字符的“地址码”,地址码由6位二进制(0~5)表示,对于不同的显示方式,设定是不同的。对于5X8点阵显示方式,这个6位地址码的高3位与“字符码”的第三位相同,而低3位则表示8个不同的字节单元的地址(000~111)。这8个字节是用来构建字符形状的,这也就“点阵”概念的具体实现方式,还记得5X8吗?这8个字节就代表了点阵中的8行。那么5又是什么呢?5就是点阵中一行内的每个点,也就是对应每个字节的各个位,由于每个字节是8位,所以在设置的时候每个字节只用其中的低5位,即0~4,高3位即5~7是无效位,一般置0。在设置时,8个字节的最后一个字节是光标位置,可以置0或者1。通过这种方法组成的字形被称为“字模”(Character Pattern)。5X10显示方式稍有不同,顾名思义,其用到11个字节表示字形,而其地址码仍然由6位组成,所以必须用低4位表示不同的字节单元地址(0000~1010),高2位与“字符码”的低2位相同以表示不同的字符码,同样,地址的最后一位地址即1010对应的字节是光标位置。5X10显示方式的字符码同样是8位的,但第0位和3位是无效位。两种显示方式的字模表如下图




     
  8. DDRAM、CGROM、CGRAM三者之间的关系

    DDRAM用来存储需要显示的符号,所以被称为显存,需要显示什么符号,就必须把相应的符号放在DDRAM中;CGROM用来存储标准的符号,这些标准符号是预先存放在CGROM中的,使用时需要把需要的字符的字符码写入DDRAM就可以显示了。大部分字符都可以在CGROM中找到,对于找不到的字符则需要自定义,这时就用到CGRAM了,在使用前需要把字符用字模编辑的方式存储在CGRAM中,再把CGRAM的字符的字符码写入DDRAM中就可以显示了。

三. 初始化与指令

  1. 初始化

    HD44780U这款芯片带有内部的“上电自动初始化”功能,例如设置“清屏”、“功能设置”、“显示控制”等,当某些情形不能使芯片实现内部初始化时,就必须使用在线的“指令”初始化进行设置,在线的“指令”初始化就是我们使用各个指令通过MPU(Microprocessor Unit)来实现。
     
  2. 在线指令初始化

    MPU可以控制HD44780U的指令寄存器(IR)、数据寄存器(DR),MPU发送各种信号用以设置各种功能,例如寄存器选择(RS)、读/写选择(R/W)、数据总线(DB0~DB7)

    a. 清屏(Clear Display):
        格式:0  0  0  0  0  0  0  0  0  1
        作用:清除整个屏幕并且设置DDRAM的地址为0x00

    b. 归位(Return Home):
        格式:0  0  0  0  0  0  0  0  1  -(“-”代表无效位,可以置0)
        作用:设置DDRAM的地址为0x00,将显示内容回归至最初位置,DDRAM中的内容保持不变(不清屏)

    c. 模式设置(Entry Mode Set)
        格式:0  0  0  0  0  0  0  1  I/D  S
        作用:设置光标的移动方向(也就是DDRAM地址值),指定显示内容是否滚动
        说明:I/D = 1:光标自动增1(DDRAM地址值自动增1);I/D = 0:光标自动减1(DDRAM地址值自动减1);S = 1:显示内容滚动(看起来像是光标不动而显示的内容移动,注意:读取DDRAM内容时显示内容不滚动,读取或者写入CGRAM时显示内容也不滚动)

    d. 显示开关控制(Display On/Off Control)
        格式:0  0  0  0  0  0  1  D  C  B
        作用:设置显示开或者关,光标开或者关,光标位置是否闪烁
        说明:D = 0 显示关闭;D = 1 显示开启;C = 1 显示光标;C = 0 不显示光标;B = 1 光标处的字符闪烁;B = 0 光标处的字符不闪烁

    e. 光标移动/显示滚动 (Cursor or Display Shift)
        格式:0  0  0  0  0  1  S/C  R/L  -  -(“-”代表无效位,可以置0)
        作用:设置光标移动或者显示滚动
        说明:S/C = 1 显示滚动;S/C = 0 光标移动;R/L = 1 向右移动;R/L = 1 向左移动;此功能设置在没有读/写操作时光标或者显示的移动,主要用于搜索或者修正显示内容,其功能不同于指令c中的显示滚动,设置显示滚动时光标跟随内容一同移动

    f. 功能设置(Function Set)
        格式:0  0  0  0  1  DL  N  F  -  -
        作用:设置信息长度,显示行数,字符点阵类型
        说明:DL = 1 总线为8位;DL = 0 总线为4位;N = 1 显示2行;N = 0 显示1行;F = 1 点阵为5X10;F = 0 点阵为5X8

    g. 设置CGRAM地址(Set CGRAM Address)
        格式:0  0  0  1  ACG  ACG  ACG  ACG  ACG  ACG
        作用:设置CGRAM的地址,注意此指令执行后需要执行传输CGRAM中数据的指令

    h. 设置DDRAM地址(Set DDRAM Address)
        格式:0  0  1  ADD  ADD  ADD  ADD  ADD  ADD  ADD
        作用:设置DDRAM的地址,注意此指令执行后需要执行传输DDRAM中数据的指令

    i. 读取“忙状态”以及地址(Read Busy Flag & Address)
        格式:0  1  BF  AC  AC  AC  AC  AC  AC  AC
        作用:读取“忙状态”并且读取地址计数器(Address Counter)中的地址

    j. 向DDRAM或者CGRAM中写入数据
        格式:1  0  字符码
        注意:写入数据后地址计数器(Address Counter)中的地址自动加1

    k. 读取DDRAM或者CGRAM中的数据
        格式:1  1  字符码
        注意:读取数据后地址计数器(Address Counter)中的地址自动加1
     
  3. 指令列表如下图


通过以上的介绍相信大家对1602这款显示模块有了进一步的了解,在使用中还需要注意很多注意事项,建议大家仔细研读厂商的MCU控制芯片数据手册。

说句题外话,如我在文章开头讲到的,我感觉网上很多资料介绍得不够详实,而且千篇一律,作者写文章仿佛有个前提,就是假设读者已经具备一定的基础知识和概念了,
所以介绍得就不是特别细致,其实进行学习的人往往就是没什么基础才来看这些文章,导致最后稀里糊涂。看了很多国外的书籍,作者把读者看做“小白”,从基础讲起,
使得读者的理解“渐入佳境”,达到自学而且学会的目的,希望咱们国内的同道有所借鉴,当然,有些文章的起点比较高,介绍的就是“高起点,深层次”的知识,那另当别论。

以上内容均为本人自己的理解,供学习使用,如有错误还请斧正。文章纯手打,如果转发请注明出处。谢谢!

这篇关于1602 液晶显示模块 + HD44780 控制芯片 使用指北的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/499762

相关文章

golang1.23版本之前 Timer Reset方法无法正确使用

《golang1.23版本之前TimerReset方法无法正确使用》在Go1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避... 目录golang1.23 之前 Reset ​到底有什么问题golang1.23 之前到底应该如何正确的

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超