128×64LCD诺基亚显示屏 与 Arduino 连接教程

释放双眼,带上耳机,听听看~!

在这个项目中,我将向您展示如何将 128X64 图形 LCD 与 Arduino UNO 连接。这个特殊的 LCD 模块基于 ST7920 LCD 控制器。因此,我们将首先了解图形 LCD 模块及其 LCD 控制器 ST7920。

然后我们将看到将 128×64 图形 LCD 与 Arduino UNO 板连接并显示一些位图图像的步骤。

128×64LCD诺基亚显示屏 与 Arduino 连接教程

介绍

在之前的 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 列。

128×64LCD诺基亚显示屏 与 Arduino 连接教程

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×64LCD诺基亚显示屏 与 Arduino 连接教程

128×64 图形 LCD 与 Arduino 的接口

现在我们已经了解了图形 LCD 及其控制器 ST7920,现在让我们继续将 128×64 图形 LCD 与 Arduino 连接起来。我将实现一个简单的电路来演示使用很少的外部组件连接 LCD 和 Arduino 是多么容易。

我将使用串行接口进行数据传输,并在图形 LCD 上显示位图图像。

电路图

下图显示了将 ST7920 图形 LCD 与 Arduino UNO 连接的电路图。

128×64LCD诺基亚显示屏 与 Arduino 连接教程

所需组件

  • Arduino UNO
  • 128×64 图形液晶模块
  • 10KΩ 电位器
  • 面包板
  • 面包板电源
  • 连接电线

硬件连接

如前所述,您可以通过三种不同的方式将图形 LCD 与 Arduino 连接起来。他们是:

  • 4 位并行模式
  • 8 位并行模式
  • 串行模式

在串行模式下,我们只需要三个引脚即可进行实际的数据传输。它们是 RS、RW 和 E。RS 在串行通信中充当片选引脚。RW 和 E 分别用作串行数据输入和串行 CLK 引脚。

128×64LCD诺基亚显示屏 与 Arduino 连接教程

因此,将 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。

我的液晶显示器的背光颜色是蓝色的。但白色和绿色也很常见。

为位图图像生成十六进制代码

我将直接以位图的形式显示图像,而不是显示不同字体的字符(是的,您可以使用一些库来实现各种字体)。在编写代码之前,您需要将位图图像转换为字节数组。

128×64LCD诺基亚显示屏 与 Arduino 连接教程

我使用了上面的“The Office”标志。请记住,128×64 LCD 的分辨率是 128×64 像素。因此,最大图像尺寸应为 128×64。因此,使用 Microsoft Paint,我将上述图像的分辨率降低到 128×64 像素,并将其保存为单色位图图像。

下一步是将此位图图像转换为字节数组。我尝试了几种转换器工具(在线和离线),但没有一个能够生成与我的设置兼容的代码。

所以,我使用了“GIMP”软件。你可以从这里下载GIMP软件:

并安装它。安装后,可以在GIMP软件中打开128×64位图图片,导出为“X位图图片”。

128×64LCD诺基亚显示屏 与 Arduino 连接教程

将生成一个 .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 上显示了位图图像以显示其功能。

给TA打赏
共{{data.count}}人
人已打赏
ArduinoArduino-进阶

Arduino 薄膜键盘教程

2021-6-1 22:53:02

Arduino-进阶

Arduino 实时时钟 (RTC) 模块指南(DS1307 和 DS3231)

2021-6-18 14:41:38

2 条回复 A文章作者 M管理员
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
'); })();