1602液晶显示屏

作者:hardihuang   hardihuang   
教程与Arduino Uno接口16x2字符LCD

希望您的Arduino项目显示状态消息或传感器读数吗?那么这些LCD显示器可能是最合适的选择。它们是极为常见的快捷方式,可以为您的项目添加可读的界面。

本教程将介绍使用角色液晶显示器启动和运行所需的所有知识。不仅基于16×2(1602)的任何字符LCD(例如16×4、16×1、20×4等)都是基于日立公司称为HD44780的并行接口LCD控制器芯片的。因为,Arduino社区已经开发了一个库来处理HD44780 LCD。这样我们就可以立即将它们连接起来。

你知道吗?
LCD是液晶显示器的缩写。它基本上是一个使用液晶显示可见图像的显示单元。 当电流施加到这种特殊类型的晶体上时,它变成不透明,挡住了屏幕后面的背光。结果,与其他区域相比,特定区域将变暗。这就是在屏幕上显示字符的方式。

硬件总览 #

这些LCD非常适合仅显示文本/字符,因此被称为“字符LCD”。显示器具有LED背光灯,可以两行显示32个ASCII字符,每行显示16个字符。

16x2字符LCD 5x8像素矩阵网格
每个矩形包含5×8像素的网格

如果仔细观察,实际上可以看到显示屏上每个字符的小矩形以及组成字符的像素。这些矩形中的每一个都是5×8像素的网格。

尽管它们仅显示文本,但它们的大小和颜色确实多种多样:例如16×1、16×4、20×4,蓝色背景为白色文本,绿色为黑色文本,等等。

好消息是,所有这些显示器都是“可互换的”-如果您用一个显示器构建项目,则只需拔下它,然后使用您选择的另一个尺寸/彩色LCD。您的代码可能必须调整为更大的尺寸,但至少接线是相同的!

16×2字符LCD引脚排列 #

在深入研究连接和示例代码之前,让我们首先看一下LCD引脚排列。

16x2字符LCD显示引脚

地线 应该连接到Arduino的地面。

VCC 是LCD的电源,我们连接了Arduino上的5伏引脚。

Vo(LCD对比度)控制LCD的对比度和亮度。使用带有电位计的简单分压器,我们可以对对比度进行微调。

RS(寄存器选择)引脚可以让Arduino告知LCD它是发送命令还是发送数据。基本上,该引脚用于区分命令和数据。

例如,当RS引脚设置为LOW时,我们将向LCD发送命令(例如将光标设置到特定位置,清除显示,向右滚动显示,依此类推)。当RS引脚设置为HIGH时,我们将向LCD发送数据/字符。

读/写(R / W)LCD上的PIN引脚用于控制您是要从LCD读取数据还是向LCD写入数据。由于我们只是将此LCD用作输出设备,因此我们将将此引脚连接为LOW。这将强制其进入“写入”模式。

E(启用)引脚用于启用显示。这意味着,当此引脚设置为LOW时,LCD不会理会R / W,RS和数据总线线路的状况。当此引脚设置为高电平时,LCD正在处理传入的数据。

D0-D7(数据总线)是承载我们发送到显示器的8位数据的引脚。例如,如果我们想在显示屏上看到大写的“ A”字符,我们会将这些引脚设置为LCD的0100 0001(根据ASCII表)。

AK(阳极和阴极) 引脚用于控制LCD的背光。

测试字符LCD #

现在我们来研究有趣的东西。让我们测试一下您的LCD。

首先,将Arduino Uno的5V和GND引脚连接到面包板电源轨,并将LCD插入面包板。

现在,我们将打开LCD的电源。LCD具有两个独立的电源连接;一个(引脚1和2引脚)用于LCD本身,另一个(引脚15和16引脚)用于LCD背光。将LCD上的引脚1和16连接到GND,LCD上的引脚2和15连接到5V。

提示

绝大多数LCD都具有用于LED背光的内置串联电阻。如果碰巧有一个不带电阻的LCD,则需要在5V和引脚15之间加一个。 要计算串联电阻的值,请从数据手册中查找最大背光电流和典型的背光电压降。并使用简单的欧姆定律就可以计算出电阻值。 如果找不到数据表,则使用220欧姆电阻应该是安全的,但是,该值过高可能会使背光略微变暗。

接下来,我们将在LCD上建立引脚3的连接,该引脚控制显示屏的对比度和亮度。为了进行精细的对比度调整,我们将在5V和GND之间连接一个10K电位器。将电位器的中心引脚(抽头)连接到LCD的引脚3。

通过旋转电位计测试16x2字符LCD对比度
旋转电位器旋钮调整LCD对比度

就是这样!现在打开Arduino,您将看到背光灯亮起。在旋转电位器上的旋钮时,您应该注意到出现了矩形的第一行。如果发生这种情况,恭喜!您的LCD运转良好。

接线–将16×2字符LCD与Arduino Uno连接 #

在开始上传代码并将数据发送到显示器之前,让我们将LCD连接到Arduino。

LCD上有很多针脚(总共16个针脚),我们将向您展示如何进行接线。但是,好消息是,对于我们连接到Arduino而言,并非所有这些引脚都是必需的。

我们知道有8条数据行将原始数据传送到显示器。但是,HD44780 LCD的设计方式是我们可以仅使用4个数据引脚(4位模式)而不是8个(8位模式)与LCD通讯。这为我们节省了4个引脚!

4位和8位模式之间的区别
使用8位模式的速度更快,因为使用4位模式所需的时间是原来的一半。因为在8位模式下,您只需一次写入数据。但是,在4位模式下,您必须将一个字节分成2个半字节,将其中一个半字节右移4位,然后执行2个写操作。 因此,4位模式通常用于保存I / O引脚。但是,当应用程序需要速度并且至少有10个I / O引脚可用时,最好使用8位模式。

因此,回顾一下,我们将使用4位模式连接LCD,因此仅需要6个引脚即可:RS,EN,D7,D6,D5和D4与LCD通讯。

现在,让我们将LCD显示器连接到Arduino。LCD的四个数据引脚(D4-D7)将连接到#4-7的Arduino数字引脚。LCD上的Enable引脚将连接到Arduino#2,LCD上的RS引脚将连接到Arduino#1。

下图显示了如何接线。

Arduino用16x2字符LCD接线Fritzing连接
16×2字符LCD和Arduino UNO的接线连接

这样,您现在就可以上传一些代码并打印显示了。

Arduino代码 #

以下测试草图将打印“ Hello World!”。液晶显示屏上显示信息。尝试一下草图,然后我们将对其进行详细剖析。

// include the library code:
#include <LiquidCrystal.h>

// Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() 
{
	// set up the LCD's number of columns and rows:
	lcd.begin(16, 2);

	// Clears the LCD screen
	lcd.clear();
}

void loop() 
{
	// Print a message to the LCD.
	lcd.print(" Hello world!");

	// set the cursor to column 0, line 1
	// (note: line 1 is the second row, since counting begins with 0):
	lcd.setCursor(0, 1);
	// Print a message to the LCD.
	lcd.print(" LCD Tutorial");
}

如果一切正常,您应该在显示屏上看到类似的内容。

将16x2字符LCD与Arduino Hello world程序输出接口

代码说明:

草图首先包括LiquidCrystal库。如本教程前面所述,Arduino社区具有一个名为LiquidCrystal的库,该库使对LCD模块的编程变得不那么困难。您可以在Arduino的官方网站上找到有关该库的更多信息。

// include the library code:
#include <LiquidCrystal.h>

接下来,我们必须创建一个LiquidCrystal对象。该对象使用6个参数,并指定将哪些Arduino引脚连接至LCD的RS引脚,使能引脚和数据引脚:d4,d5,d6和d7。

// Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

现在,您已经声明了LiquidCrystal对象,您可以访问特定于LCD的特殊方法(即函数)。

在“设置”功能中:我们将使用两个功能:第一个功能是begin()。这用于指定显示器的尺寸,即显示器具有多少列和行。如果使用的是16×2字符LCD,则传递参数16和2;否则,输入0。如果您使用的是20×4 LCD,请传递参数20和4。

第二个功能是clear()。这将清除LCD屏幕并将光标移到左上角。

lcd.begin(16, 2);
lcd.clear();

在“循环”功能中:我们将使用该print()功能来显示在屏幕第一行看到的消息。

// Print a message to the LCD.
lcd.print(" Hello world!");

接下来,我们将通过调用函数setCursor()将光标位置设置为第二行。光标位置指定了您需要在LCD上显示新文本的位置。左上角被视为col = 0,第0行

lcd.setCursor(0, 1);
lcd.print(" LCD Tutorial");

LiquidCrystal库中的其他有用功能 #

您可以对LiquidCrystal对象使用一些有用的功能。下面列出了其中的几个:

  • 如果您只想将光标放在LCD的左上方而不清除显示,请使用 home()
  • 有许多应用程序,例如turbo C ++编译器或notepad ++,其中按键盘上的“插入”键可更改光标。就像这样,您可以使用blink()或在LCD上更改光标lcd.cursor()
  • blink()功能显示5×8像素的闪烁块,同时lcd.cursor()在将要写入下一个字符的位置显示下划线(行)。
  • 您可以使用该noBlink()功能关闭闪烁的LCD光标并lcd.noCursor()隐藏LCD光标。
  • 您可以使用将滚动条的内容向右滚动一个空格lcd.scrollDisplayRight()或向左滚动一个空格lcd.scrollDisplayLeft()。如果要连续滚动文本,则需要在“ for循环”中使用这些功能。

16×2字符LCD的自定义字符生成 #

如果在显示屏上发现字符枯燥无味,则可以为LCD创建自己的自定义字符(字形)和符号。当您要显示不属于标准ASCII字符集的字符时,它们非常有用。

CGROM和CGRAM

所有基于Hitachi HD44780控制器的LCD显示器都有两种类型的存储器,它们存储定义的字符,称为CGROM和CGRAM(字符发生器ROM和RAM)。CGROM存储器是非易失性的,不能修改,而;CGRAM存储器易失,可以随时修改。

CGROM用于存储所有可通过使用其ASCII码显示的永久字体。例如,如果我们写0x41,那么在显示屏上我们得到字符“ A”。CGRAM是可用于存储用户定义的字符的另一种内存。

该RAM限制为64个字节。含义,用于基于5×8像素的LCD;CGRAM中最多可以存储8个用户定义的字符。对于基于5×10像素的LCD,只能存储4个用户定义的字符。

正如我们在本教程前面所讨论的那样,显示器上的字符以5×8像素矩阵形成,因此您需要在该矩阵内定义自定义字符。要定义字符,您将使用LiquidCrystal库的createChar()函数。

要使用createChar()该功能,请先设置一个8字节的数组。数组中的每个字节(仅考虑5位)在5×8矩阵中定义了一行字符。而字节中的零和一则指示该行中的哪些像素应打开,哪些像素应被关闭。

下图演示了如何在显示器上使用这些自定义字符。

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// make some custom characters:
byte Heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
0b00000
};

byte Bell[8] = {
0b00100,
0b01110,
0b01110,
0b01110,
0b11111,
0b00000,
0b00100,
0b00000
};


byte Alien[8] = {
0b11111,
0b10101,
0b11111,
0b11111,
0b01110,
0b01010,
0b11011,
0b00000
};

byte Check[8] = {
0b00000,
0b00001,
0b00011,
0b10110,
0b11100,
0b01000,
0b00000,
0b00000
};

byte Speaker[8] = {
0b00001,
0b00011,
0b01111,
0b01111,
0b01111,
0b00011,
0b00001,
0b00000
};


byte Sound[8] = {
0b00001,
0b00011,
0b00101,
0b01001,
0b01001,
0b01011,
0b11011,
0b11000
};


byte Skull[8] = {
0b00000,
0b01110,
0b10101,
0b11011,
0b01110,
0b01110,
0b00000,
0b00000
};

byte Lock[8] = {
0b01110,
0b10001,
0b10001,
0b11111,
0b11011,
0b11011,
0b11111,
0b00000
};

void setup() 
{
	// initialize LCD and set up the number of columns and rows: 
	lcd.begin(16, 2);

	// create a new character
	lcd.createChar(0, Heart);
	// create a new character
	lcd.createChar(1, Bell);
	// create a new character
	lcd.createChar(2, Alien);
	// create a new character
	lcd.createChar(3, Check);
	// create a new character
	lcd.createChar(4, Speaker);
	// create a new character
	lcd.createChar(5, Sound);
	// create a new character
	lcd.createChar(6, Skull);
	// create a new character
	lcd.createChar(7, Lock);

	// Clears the LCD screen
	lcd.clear();

	// Print a message to the lcd.
	lcd.print("Custom Character");
}

// Print All the custom characters
void loop() 
{ 
	lcd.setCursor(0, 1);
	lcd.write(byte(0));

	lcd.setCursor(2, 1);
	lcd.write(byte(1));

	lcd.setCursor(4, 1);
	lcd.write(byte(2));

	lcd.setCursor(6, 1);
	lcd.write(byte(3));

	lcd.setCursor(8, 1);
	lcd.write(byte(4));

	lcd.setCursor(10, 1);
	lcd.write(byte(5));

	lcd.setCursor(12, 1);
	lcd.write(byte(6));

	lcd.setCursor(14, 1);
	lcd.write(byte(7));
}

包含库之后,我们需要初始化八个字节的自定义字符数组。

byte Heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
0b00000
};

在设置中,我们必须使用createChar()函数创建自定义字符。该函数有两个参数。第一个是0到7之间的数字,以保留8个受支持的自定义字符之一。第二个参数是字节数组的名称。

// create a new character
lcd.createChar(0, Heart);

在循环的下一步中,要显示自定义字符,请使用write()function,并使用保留的字符号作为参数。

// byte(0) represents Heart character.
lcd.write(byte(0));
将16x2 LCD与Arduino自定义字符生成程序输出接口

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注