在这个项目中,我将向您展示如何将 128X64 图形 LCD 与 Arduino UNO 连接。这个特殊的 LCD 模块基于 ST7920 LCD 控制器。因此,我们将首先了解图形 LCD 模块及其 LCD 控制器 ST7920。
然后我们将看到将 128×64 图形 LCD 与 Arduino UNO 板连接并显示一些位图图像的步骤。
介绍
在之前的 Arduino 项目中,我将诺基亚 5110 LCD 模块与 Arduino 连接起来。它也是一个图形液晶显示器,可以显示一些基本的位图图像和图形。但诺基亚 5110 LCD 模块的问题在于其分辨率。
84 x 48 像素的诺基亚 5110 LCD 可用于实现基于菜单的用户界面。由于尺寸小,生成的菜单将被限制为每页 3 或 4 个项目。
如果我们想要更大的显示器和更多的空间,那么显而易见的选择是选择更大更好的 128×64 图形 LCD 模块。
作为演示,在完成所有硬件连接后,我将在图形 LCD 模块上显示位图图像。
关于 128×64 图形 LCD 的简要说明
乍一看,128×64 图形 LCD 模块似乎是著名的 16×2 LCD 或 20×4 LCD 模块的大哥,具有相似的结构和几乎相似的引脚布局。
但这两者之间存在显着差异。16×2 或 20×4 LCD 本质上是字符显示器。它们只能显示字母数字字符和一些仅限于 5×8 矩阵的简单自定义字符。
128×64 图形 LCD,顾名思义,它是一个由 128×64 即 8192 个独立可控点组成的图形显示器。
通过使用不同的像素组合,我们基本上可以显示各种大小的字符。但魔法并不止于此。您也可以显示图像和图形(小动画)。在一个 128×64 的 LCD 模块中,有 64 行和 128 列。
ST7920液晶控制器
市场上有多种图形 LCD 版本。尽管用法、应用和实现几乎相同,但主要区别在于用于驱动点阵显示器的内部 LCD 控制器。
一些常用的 LCD 控制器有 KS0108、SSD1306、ST7920、SH1106、SSD1322 等。最终 LCD 模块的引脚可能因所使用的 LCD 控制器而异。因此,请在购买前验证 LCD 控制器以及引脚。
我购买的图形 LCD 模块由 ST7920 控制器组成。它由Sitronix 制造,支持三种类型的总线接口,即8 位模式、4 位模式和串行接口。
如果您之前使用过 16×2 LCD 显示器,那么您可能熟悉 4 位和 8 位并行接口。串行接口是新的东西,我们将在这个项目中探索这个选项。
128×64 LCD 引脚排列
正如我已经提到的,请与制造商仔细检查图形 LCD 模块的引脚排列。下表描述了我拥有的 128×64 LCD 模块的引脚排列。
引脚号 | 引脚名称 | 引脚说明 |
1 | GND | 负极引脚 |
2 | VCC | 电源电压 |
3 | VO | 对比度调整 |
4 | RS | 寄存器选择(串行中的 CS) |
5 | RW | 读/写控制(串行数据输入) |
6 | 乙 | 启用(串行时钟) |
7 – 14 | D0 – D7 | 数据 |
15 | PSB | 接口选择(0:串行,1:8 位/4 位并行) |
16 | NC | 未连接 |
17 | RST | 重启 |
18 | VOUT | LCD倍压器输出 |
19 | BLA | 背光LED阳极 |
20 | BLK | 背光 LED 阴极 |
下图显示了印刷有引脚排列的 LCD 背面。
128×64 图形 LCD 与 Arduino 的接口
现在我们已经了解了图形 LCD 及其控制器 ST7920,现在让我们继续将 128×64 图形 LCD 与 Arduino 连接起来。我将实现一个简单的电路来演示使用很少的外部组件连接 LCD 和 Arduino 是多么容易。
我将使用串行接口进行数据传输,并在图形 LCD 上显示位图图像。
电路图
下图显示了将 ST7920 图形 LCD 与 Arduino UNO 连接的电路图。
所需组件
- Arduino UNO
- 128×64 图形液晶模块
- 10KΩ 电位器
- 面包板
- 面包板电源
- 连接电线
硬件连接
如前所述,您可以通过三种不同的方式将图形 LCD 与 Arduino 连接起来。他们是:
- 4 位并行模式
- 8 位并行模式
- 串行模式
在串行模式下,我们只需要三个引脚即可进行实际的数据传输。它们是 RS、RW 和 E。RS 在串行通信中充当片选引脚。RW 和 E 分别用作串行数据输入和串行 CLK 引脚。
因此,将 LCD 的 RS、RW 和 E 连接到 Arduino UNO 的数字 IO 引脚 10、11 和 13。此外,为了选择串行接口模式,PCB 引脚必须连接到 GND。
其余连接类似于传统的 16×2 LCD。VCC 和 GND 连接到电源的 5V 和地。VO 接 10KΩ POT 的抽头,POT 的另外两个端分别接 5V 和 GND。
为了用背光照亮 LCD,将 BLA 连接到 5V,将 BLK 连接到 GND。
我的液晶显示器的背光颜色是蓝色的。但白色和绿色也很常见。
为位图图像生成十六进制代码
我将直接以位图的形式显示图像,而不是显示不同字体的字符(是的,您可以使用一些库来实现各种字体)。在编写代码之前,您需要将位图图像转换为字节数组。
我使用了上面的“The Office”标志。请记住,128×64 LCD 的分辨率是 128×64 像素。因此,最大图像尺寸应为 128×64。因此,使用 Microsoft Paint,我将上述图像的分辨率降低到 128×64 像素,并将其保存为单色位图图像。
下一步是将此位图图像转换为字节数组。我尝试了几种转换器工具(在线和离线),但没有一个能够生成与我的设置兼容的代码。
所以,我使用了“GIMP”软件。你可以从这里下载GIMP软件:
并安装它。安装后,可以在GIMP软件中打开128×64位图图片,导出为“X位图图片”。
将生成一个 .xbm 文件。它包含所选 128×64 位图图像的 HEX 代码。使用任何文本编辑器(如 Notepad++)打开它并进行以下更改。数组应该是一个静态的 const unsigned char 并在数组名称后附加“PROGMEM”。
static const unsigned char myBitmap [] PROGMEM = {
0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
…..
0xff, 0xff, 0xff, 0x7f };
代码
在编写代码之前,您需要下载一个名为“U8g2”的特殊库。在 Arduino IDE 中,转到 Tools -> Manage Libraries… 搜索“u8g2”并安装最新版本。它是一个复杂的库,其github页面包含所有必要的文档。
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
// 'TheOffice', 128x64px
static const unsigned char myBitmap [] PROGMEM = {
0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x06, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x9f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xb0,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3f, 0x00,
0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xb0,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x7f, 0x00,
0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xb0,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc0, 0x7f, 0x00,
0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0xf0, 0xff, 0x03, 0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0xff, 0x07, 0x00, 0x00, 0x7c, 0xb0,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0xff, 0x07,
0x00, 0x00, 0xfe, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0xf8, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xb0, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xb0,
0x81, 0xff, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf8, 0xff, 0x0f,
0x00, 0x00, 0xfe, 0xb0, 0x81, 0xff, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0xf8, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0xb0, 0x81, 0xff, 0x1d, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0xb0,
0x01, 0x38, 0xdc, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfc, 0xff, 0x0f,
0x00, 0x00, 0x7c, 0xb0, 0x01, 0x38, 0xfc, 0xf3, 0x03, 0x00, 0x00, 0x00,
0x08, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x38, 0xb0, 0x01, 0x38, 0xfc, 0xfb,
0x07, 0x00, 0x00, 0x00, 0x08, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0xfc, 0xb0,
0x01, 0x38, 0x9c, 0x3b, 0x07, 0x00, 0x00, 0x00, 0x08, 0xfc, 0xff, 0x07,
0x00, 0x00, 0xfe, 0xb0, 0x01, 0x38, 0x9c, 0xfb, 0x07, 0x00, 0x00, 0x00,
0x08, 0xfc, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xb7, 0x01, 0x38, 0x9c, 0xfb,
0x07, 0x00, 0x00, 0x00, 0x08, 0xfc, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xb7,
0x01, 0x38, 0x9c, 0x3b, 0x07, 0x00, 0x00, 0x00, 0x08, 0xfc, 0xff, 0x07,
0x00, 0x00, 0xfe, 0xb7, 0x01, 0x38, 0x9c, 0xfb, 0x07, 0x00, 0x00, 0x00,
0x08, 0xfe, 0xff, 0x07, 0x00, 0x00, 0xff, 0xb7, 0x01, 0x38, 0x9c, 0xf3,
0x03, 0x00, 0x00, 0x00, 0x08, 0xfe, 0xff, 0x07, 0x00, 0x80, 0xff, 0xb7,
0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xff, 0x00,
0x00, 0xc0, 0xff, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xc8, 0xff, 0xff, 0x00, 0x00, 0xe0, 0xff, 0xb6, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xb6,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xff, 0x00,
0xc0, 0xff, 0xff, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xc8, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xb6, 0x01, 0xf8, 0x07, 0xbe,
0xff, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xff, 0x00, 0xe0, 0x7f, 0xff, 0xb7,
0x01, 0xfc, 0x1f, 0xbf, 0xff, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xff, 0xfc,
0xff, 0x0f, 0xff, 0xb7, 0x01, 0xfe, 0x1f, 0xbf, 0xff, 0x00, 0x00, 0x00,
0xc8, 0xff, 0xff, 0xfc, 0xff, 0xef, 0xff, 0xb7, 0x01, 0x1f, 0x3e, 0x8f,
0x03, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xff, 0xc0, 0x01, 0xfe, 0xff, 0xb7,
0x01, 0x0f, 0xbc, 0xff, 0xef, 0xf0, 0x87, 0x1f, 0xc8, 0xff, 0xff, 0xc0,
0x01, 0xff, 0xff, 0xb7, 0x01, 0x0f, 0xbc, 0xff, 0xef, 0xf8, 0xcf, 0x3f,
0xc8, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xb7, 0x01, 0x0f, 0xb8, 0xff,
0xef, 0xfc, 0xef, 0x3f, 0xc8, 0xff, 0xff, 0xc0, 0x01, 0xff, 0x7f, 0xb7,
0x01, 0x0f, 0x38, 0x8f, 0xe3, 0x3c, 0xef, 0x79, 0x08, 0xc0, 0x7f, 0xc0,
0x81, 0xff, 0x1f, 0xb7, 0x01, 0x0f, 0x3c, 0x8f, 0xe3, 0x3c, 0xe0, 0x7f,
0x08, 0xc0, 0x7f, 0xc0, 0x81, 0xef, 0xff, 0xb7, 0x01, 0x0f, 0x3c, 0x8f,
0xe3, 0x1c, 0xe0, 0x7f, 0x08, 0xc0, 0x7f, 0xc0, 0x81, 0xef, 0xff, 0xb7,
0x01, 0x1f, 0x3c, 0x8f, 0xe3, 0x3c, 0xe6, 0x7f, 0x08, 0xc0, 0x7f, 0xc0,
0x81, 0xe7, 0xff, 0xb7, 0x01, 0x3e, 0x3e, 0x8f, 0xe3, 0x3c, 0xef, 0x79,
0x08, 0x80, 0x7b, 0xc0, 0xc1, 0x67, 0x00, 0xb7, 0x01, 0xfe, 0x1f, 0x8f,
0xe3, 0xfc, 0xef, 0x7f, 0x08, 0x80, 0x33, 0xc0, 0xc1, 0x67, 0x00, 0xb7,
0x01, 0xfc, 0x0f, 0x8f, 0xe3, 0xf8, 0xcf, 0x3f, 0x08, 0x00, 0x00, 0xc0,
0xc1, 0x67, 0x00, 0xb7, 0x01, 0xf8, 0x07, 0x8f, 0xe3, 0xf0, 0xc7, 0x1f,
0x08, 0x00, 0x00, 0xc0, 0xe1, 0x63, 0x00, 0xb7, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xc0, 0xe1, 0x63, 0x00, 0xb7,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xc0,
0xe1, 0x61, 0x00, 0xb7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0xc0, 0xe1, 0x61, 0x00, 0xb7, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xc0, 0xe1, 0x61, 0x00, 0xb7,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xc0,
0xe1, 0x60, 0x00, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xbc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x06, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x7f
};
U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* CS=*/ 10, /* reset=*/ 8);
void draw(void)
{
u8g2.drawXBMP( 0, 0, 128, 64, myBitmap);
}
void setup()
{
// put your setup code here, to run once:
u8g2.begin();
u8g2.clearBuffer();
}
void loop()
{
// put your main code here, to run repeatedly:
u8g2.firstPage();
do
{
draw();
}while(u8g2.nextPage());
delay(1000);
}
必须将之前生成的 HEX 代码添加到我们的代码中。
结论
这里实现了一个将 128×64 图形 LCD 与 Arduino 连接的简单项目。我没有显示普通字符,而是在 LCD 上显示了位图图像以显示其功能。
NIU
6666