原文地址:https://circuitdigest.com/microcontroller-projects/arduino-lcd-interfacing-tutorial
将16x2 LCD与Arduino连接方法
经过**迪利普·拉贾(Dilip Raja)** 2015年6月4日19
为了在人的世界和机器的世界之间建立良好的沟通,显示单元扮演着重要的角色。因此,它们是嵌入式系统的重要组成部分。显示单元-不论大小,都遵循相同的基本原理。除了图形显示和3D支付等复杂的显示单元外,还必须知道如何使用16x1和16x2单元之类的简单显示。16x1显示单元将包含16个字符,并在一行中。的16×2 LCD将在总16英寸1 32个字符第一 线和另一条16在2次 线。在此必须理解,每个字符中都有5x10 = 50像素,因此要显示一个字符,所有50像素必须一起工作。但是我们不必担心,因为人机界面中还有另一个控制器(HD44780)负责控制像素。(您可以在LCD单元中看到它,它是背面的黑眼圈)。
在本教程中,我们将使用ARDUINO UNO连接16x2 LCD。与普通的开发板不同,将LCD连接到ARDUINO的过程非常简单。在这里,我们不必担心数据发送和接收。我们只需要定义引脚号,它就可以在LCD上显示数据了。
所需组件
硬件: ARDUINO UNO,电源(5v),JHD_162ALCD(16x2LCD),100uF电容器。
软体: Arduino IDE(Arduino nightly)。
电路图和说明
16x2 LCD显示模块
带有HD44780控制器的16x2 LCD显示模块
之所以命名为**16×2 LCD,**是因为;它有16列和2行。有很多可用的组合,例如8×1、8×2、10×2、16×1等。但是最常用的是16 * 2 LCD,因此我们在这里使用它。
上面提到的所有LCD显示屏都将具有16针,并且编程方法也相同,因此选择权留给您。以下是16x2 LCD模块的引脚排列和引脚描述:
序号 | 引脚号 | 引脚名称 | 引脚类型 | 引脚说明 | 引脚连接 |
---|---|---|---|---|---|
1 | 引脚1 | GND | 电源极引脚 | 这是LCD的接地引脚 | 连接到MCU /电源的接地 |
2 | 引脚2 | VCC | 电源极引脚 | 这是LCD的电源电压引脚 | 连接到电源的电源引脚 |
3 | 引脚3 | V0 / VEE | 控制引脚 | 调整液晶显示屏的对比度。 | 连接到可以提供0-5V电源的可变POT |
4 | 引脚4 | 寄存器选择 | 控制引脚 | 在命令/数据寄存器之间切换 | 连接到MCU引脚并获得0或1。0- > Command Mode 1-> Data Mode |
5 | 引脚5 | 读/写 | 控制引脚 | 在读/写操作之间切换LCD | 连接到MCU引脚并获得0或1。0- >写入操作 1->读取操作 |
6 | 引脚6 | 使能 | 控制引脚 | 必须保持高电平才能执行读/写操作 | 连接到MCU并始终保持高电平。 |
7 | 引脚7-14 | 数据位(0-7) | 数据/命令引脚 | 用于将命令或数据发送到LCD的引脚。 | 在4线模式下, 只有4个引脚(0-3)连接到MCU。在8线模式下,所有8个引脚(0-7)连接到MCU。 |
8 | 引脚15 | LED正极 | LED接脚 | 正常的LED状操作可照亮LCD | 连接到+ 5V |
9 | 引脚16 | LED负极 | LED接脚 | 正常的LED像操作一样点亮连接到GND的LCD。 | 接地 |
如果您不了解所有引脚的功能也可以,我将在下面详细解释。现在,让我们回头看一下LCD:
好吧,这两个黑色圆圈像是LCD背面的东西吗?
这些黑圈由接口IC及其相关组件组成,可帮助我们将此LCD与MCU配合使用。因为我们的LCD是16 * 2点矩阵LCD,所以它将总共有(16 * 2 = 32)32个字符,每个字符将由5 * 8像素点组成。下图显示了一个启用了所有像素的单个字符。
所以现在,我们知道每个字符都有(5 * 8 = 40)40个像素,对于32个字符,我们将有(32 * 40)1280个像素。此外,还应指示LCD有关像素的位置。
在MCU的帮助下处理所有事情将是一项繁重的任务,因此使用了HD44780之类的接口IC,该接口IC安装在LCD模块本身上。该IC的功能是从MCU获取命令和数据,并对它们进行处理,以在我们的LCD屏幕上显示有意义的信息。
让我们讨论必须由控制引脚控制的LCD中可用的不同类型的模式和选项。
*LCD的4位和8位模式*
LCD可以在两种不同的模式下工作,即4位模式和8位模式。在**4位模式下,**我们先将数据半字节发送,首先是高半字节,然后是低半字节。对于那些不知道什么是半字节的人:半字节是一组四位,因此字节的低四位(D0-D3)形成低四位,而高四位(D4-D7)一个字节的形式从较高的半字节开始。这使我们能够发送8位数据。
而**在8位模式下,**由于我们使用了所有8条数据线,因此可以一键直接发送8位数据。
现在您一定已经猜到了,是的,8位模式比4位模式更快,更完美。但是主要的缺点是它需要将8条数据线连接到微控制器。这将使我们用完MCU的I / O引脚,因此广泛使用4位模式。没有控制引脚用于设置这些模式。这只是编程方式的变化。
*LCD的读写模式:*
如前所述,LCD本身包含一个接口IC。MCU可以对该接口IC进行读取或写入。在大多数情况下,我们只会写IC,因为读取会使它变得更复杂,而且这种情况很少见。如果需要,可以读取诸如光标位置,状态完成中断等信息,但这不在本教程的讨论范围之内。
大多数LCD中使用的接口IC是**HD44780U,**为了对LCD进行编程,我们应该学习IC的完整数据表。该数据表是这里给出。
*LCD命令:*
LCD中有一些预设命令指令,我们需要通过一些微控制器将这些指令发送到LCD。以下是一些重要的命令说明:
十六进制代码 | LCD指令寄存器的命令 |
---|---|
0F | LCD亮,光标亮 |
01 | 清除显示画面 |
02 | 回家 |
04 | 减少光标(向左移动光标) |
06 | 增量光标(向右移动光标) |
05 | 右移显示 |
07 | 左移显示 |
0E | 显示开,光标闪烁 |
80 | 强制光标到第一行的开头 |
C0 | 强制光标移至第二行的开头 |
38 | 2行和5×7矩阵 |
83 | 光标线1位置3 |
3C | 激活第二行 |
08 | 显示关闭,光标关闭 |
C1 | 跳至第二行,位置1 |
0C | 显示开启,光标关闭 |
C1 | 跳至第二行,位置1 |
C2 | 跳至第二行,位置2 |
在16x2 LCD中,如果有背光,则全部有16个引脚,如果没有背光,则有14个引脚。一个人可以给背光灯插针供电或悬空。现在,在14个引脚中,有8个数据引脚(7-14或D0-D7),2个电源引脚(1&2或VSS&VDD或GND&+ 5v),第三个用于对比度控制的引脚(VEE控制字符的粗细)如图所示)和3个控制引脚(RS&RW&E)。
在电路中,可以观察到我只接了两个控制引脚,这给了灵活性。对比度位和READ / WRITE并不经常使用,因此它们可以接地。这使LCD处于最高对比度和读取模式。我们只需要控制ENABLE和RS引脚即可相应地发送字符和数据。
LCD的连接如下所示:
-
PIN1或VSS接地
-
PIN2或VDD或VCC至+ 5v电源
-
PIN3或VEE接地(为初学者提供最大对比度)
-
PIN4或RS(寄存器选择)到ARDUINO UNO的PIN0
-
PIN5或RW(读/写)接地(将LCD置于读模式可简化用户的通信)
-
PIN6或E(启用)到ARDUINO UNO的PIN1
-
PIN11或D4至ARDUINO UNO的PIN8
-
PIN12或D5至ARDUINO UNO的PIN9
-
PIN13或D6至ARDUINO UNO的PIN10
-
PIN14或D7至ARDUINO UNO的PIN11
ARDUINO IDE允许用户以4位模式使用LCD。这种通信类型使用户能够减少ARDUINO上的引脚使用,这与其他ARDUINO无需单独编程以在4 it模式下使用有关,因为默认情况下ARDUINO设置为以4位模式进行通信。在电路中,您可以看到我们使用了4位通信(D4-D7)。
因此,仅从上表的观察,我们就将LCD的6个引脚连接到控制器,其中4个引脚是数据引脚,另外2个是控制引脚。
上图显示了连接到ARDUINO UNO的16x2 LCD的电路图。
原理
要将LCD连接到ARDUINO UNO,我们需要了解一些事情。
#include <LiquidCrystal.h>
lcd.begin(16,2);
LiquidCrystal LCD(0,1,8,9,10,11);
lcd.print(“ hello,world!”);
如上表所示,我们只需要查看这四行即可在ARDUINO和LCD之间建立通信。
首先,我们需要启用头文件(’#include <LiquidCrystal.h>’),该头文件中写入了指令,这使用户能够以4位模式将LCD连接到UNO,而不会产生任何绒毛。使用此头文件,我们不必将数据一点一点地发送到LCD,这一切都将得到解决,我们也不必编写用于向LCD发送数据或命令的程序。
其次,我们需要告诉主板我们在这里使用哪种类型的LCD。由于我们有许多不同类型的LCD(例如20x4、16x2、16x1等)。在这里,我们将16x2 LCD连接到UNO,因此得到“ lcd.begin(16,2);”。对于16x1,我们得到’lcd.begin(16,1);’。
在此说明中,我们将告诉主板我们引脚的连接位置。连接的引脚需要按“ RS,En,D4,D5,D6,D7”的顺序表示。这些引脚应正确表示。由于我们已将RS连接到PIN0等,如电路图所示,我们将板上的引脚号表示为LiquidCrystal lcd(0,1,8,9,10,11);
。需要在LCD中显示的数据应写为lcd.print(“ hello,world!”);
。使用此命令,LCD会显示“ hello,world!”。
如您所见,我们不必担心任何其他事情,我们只需要初始化即可,UNO将准备显示数据。我们不必在此处编写程序循环来通过BYTE发送数据BYTE。
LCD和UNO之间的通信方式在下面给出的C代码中逐步说明:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(0, 1, 8, 9, 10, 11); /// REGISTER SELECT PIN,ENABLE PIN,D4 PIN,D5 PIN, D6 PIN, D7 PIN
void setup()
{
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
}
void loop()
{
// set the cursor to column 0, line 1
lcd.print(" CIRCUIT DIGEST");//print name
lcd.setCursor(0, 1); // set the cursor to column 0, line 2
lcd.print("www.circuitdigest.com");//print name
delay(750);//delay of 0.75sec
lcd.scrollDisplayLeft();//shifting data on LCD
lcd.setCursor(0, 0);// set the cursor to column 0, line1
}