目录

工欲善其事

实践出真知

活跃标签: linux java mysql 待分类 js springboot win10 电路 vue macOS nginx esp32 windows git docker idea maven esp8266 python Arduino

存档:

X

【诺基亚5110】图形LCD显示屏和【Arduino】

还记得iPhone以前的时代,手机带有按钮,只有在需要清洁时才触摸那块微小的黑白屏幕吗?诺基亚在其3310和5110手机中使用了这些小型LCD。

随着技术的变化,这些显示器终于在DIY世界中找到了自己的新位置。不久,由于这些显示器体积小(仅约1.5英寸),价格便宜,易于使用,功耗低,并且可以显示文本和位图,因此在业余爱好者中很受欢迎。

PCD8544 LCD驱动器

该模块的核心是飞利浦PCD8544的功能强大的单芯片低功耗CMOS LCD驱动器控制器。

该芯片旨在驱动84×48像素的图形显示。它通过类似于SPI的串行总线接口与微控制器接口。

凭借PCD8544控制器的多功能性,它包括LCD电源和偏置电压,从而降低了功耗,使其非常适合于功耗敏感的应用。在正常状态下,LCD仅消耗6至7mA的电流。

根据数据表,该芯片的工作电压范围为2.7至3.3 V,通信电平为3v。因此,对于像Arduino这样的任何5V逻辑微控制器,都需要某种逻辑电平转换(否则显示可能会损坏)。

液晶背光

LCD还带有不同颜色的背光。红色,绿色,蓝色和白色。

背光只不过是四个LED围绕显示屏边缘分布。

如果要更改LCD的背光,只需按下背面的金属夹,将LCD从板上卸下即可。屏幕关闭时,您会注意到四个LED焊接在显示器边缘周围。只需将LED替换为所需的彩色LED。

警告:
这些LCD显示器有许多版本没有任何限流电阻。这意味着在连接电源时必须小心。作为预防措施,您可以将一个330Ω限流电阻与“背光”引脚串联。

诺基亚5110 LCD内存图

PCD8544 LCD驱动程序具有一个内置504字节的图形显示数据RAM(GDDRAM),用于屏幕,其中包含要显示的位模式。该存储区分为6个存储区(从0到5)。每个库包含84列/段(从0到83)。每列可以存储8位数据(从0到7)。那肯定告诉我们

6组x 84段x 8位数据= 4032位= 504字节

带有存储体,段和数据的整个内存映射在下面突出显示。

每一位代表屏幕上的特定像素,可以通过编程将其打开或关闭。

以下是完整的规格:

诺基亚5110 LCD显示模块引脚排列

在深入研究连接和示例代码之前,让我们首先看一下其Pinout。

RST 针复位显示。它是低电平有效引脚;您可以通过将其拉低来重置显示。您也可以将此引脚连接到Arduino重置,以便它将自动重置屏幕。

CE(芯片启用)引脚用于选择共享相同SPI总线的众多连接设备之一。它也是一个有效的低引脚。

D/C(数据/命令) 针告诉显示器它接收的数据是命令还是可显示的数据。

DIN 是SPI接口的串行数据引脚。

CLK 是SPI接口的串行时钟引脚。

VCC 引脚为LCD提供电源,我们将其连接至Arduino上的3.3V电压引脚。

BL(Backlight) 引脚控制显示屏的背光。要控制其亮度,您可以添加一个电位计或将此引脚连接到任何具有PWM功能的Arduino引脚。

GND 应该连接到Arduino的地

将诺基亚5110 LCD显示模块连接到Arduino Uno

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

连接非常简单。在实施软件SPI时,我们具有灵活的引脚选项。您可以将数据传输引脚连接到任何数字I / O引脚。在我们的例子中,串行时钟(CLK),串行数据(DIN),数据/命令(DC),芯片使能(CE)和复位(RST)引脚从Arduino的引脚7一直向下连接到引脚3。

但不幸的是,LCD具有3v通信电平,因此我们无法将这些引脚直接连接到Arduino。我们需要一些保护。这可以通过移动级别来完成。

转换电平的最便宜,最简单的方法之一是在每个数据传输引脚上串联一个电阻。只需在CLK,DIN,D / C和RST引脚之间添加10kΩ电阻,在CE之间添加1kΩ电阻。

最后,背光(BL)引脚通过330Ω限流电阻连接到3.3V。如果您想控制其亮度,可以添加一个电位计或将此引脚连接到任何具有PWM功能的Arduino引脚。

下图显示了如何接线。

用Arduino UNO接线诺基亚5110 LCD模块

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

安装诺基亚5110 LCD模块的库

PCD8544 LCD控制器具有灵活而复杂的驱动程序。为了使用PCD8544控制器,需要具有丰富的内存寻址知识。幸运的是,Adafruit的PCD8544 Nokia 5110 LCD库是为了隐藏所有复杂性而编写的,因此我们可以发出简单的命令来控制显示。

要安装库,请导航至“草图”>“包含库”>“管理库...”,等待库管理器下载库索引并更新已安装库的列表。

输入“诺基亚”以过滤搜索。应该有几个条目。寻找Adafruit PCD8544 Nokia 5110 LCD资料库。单击该条目,然后选择“安装”。

该库是特定于硬件的库,用于处理较低级别的功能。它需要与Adafruit GFX库配对以显示图形基元,如点,线,圆,矩形等。也请安装此库。

尽管PCD8544在屏幕上具有内置的GDDRAM,但我们无法读取其内容。因此,不可能操纵屏幕缓冲区执行数学运算。
作为替代方案,该库从ATmega328P分配504字节的内存作为缓冲区。因此,它可以操纵屏幕缓冲区,然后执行从ATmega328P的内存到PCD8544控制器内部内存的批量传输。

Arduino代码–显示文本

现在出现了有趣的东西!

以下测试草图将打印“ Hello World!”。显示屏上显示消息。它还包括

  • 显示倒排文字
  • 显示数字
  • 以底数显示数字(十六进制,十六进制)
  • 显示ASCII符号
  • 旋转文字

这将使您对如何使用诺基亚5110 LCD显示屏有完整的了解,并可以作为更实际的实验和项目的基础。尝试一下草图,然后我们将对其进行详细剖析。

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// Declare LCD object for software SPI
// Adafruit_PCD8544(CLK,DIN,D/C,CE,RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

int rotatetext = 1;

void setup()   {
Serial.begin(9600);

//Initialize Display
display.begin();

// you can change the contrast around to adapt the display for the best viewing!
display.setContrast(57);

// Clear the buffer.
display.clearDisplay();

// Display Text
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println("Hello world!");
display.display();
delay(2000);
display.clearDisplay();


// Display Inverted Text
display.setTextColor(WHITE, BLACK); // 'inverted' text
display.setCursor(0,0);
display.println("Hello world!");
display.display();
delay(2000);
display.clearDisplay();

// Scaling Font Size
display.setTextColor(BLACK);
display.setCursor(0,0);
display.setTextSize(2);
display.println("Hello!");
display.display();
delay(2000);
display.clearDisplay();

// Display Numbers
display.setTextSize(1);
display.setCursor(0,0);
display.println(123456789);
display.display();
delay(2000);
display.clearDisplay();

// Specifying Base For Numbers
display.setCursor(0,0);
display.print("0x"); display.print(0xFF, HEX); 
display.print("(HEX) = ");
display.print(0xFF, DEC);
display.println("(DEC)"); 
display.display();
delay(2000);
display.clearDisplay();

// Display ASCII Characters
display.setCursor(0,0);
display.setTextSize(2);
display.write(3);
display.display();
delay(2000);
display.clearDisplay();

// Text Rotation
while(1)
{
display.clearDisplay();
display.setRotation(rotatetext); // rotate 90 degrees counter clockwise, can also use values of 2 and 3 to go further.
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println("Text Rotation");
display.display();
delay(1000);
display.clearDisplay();
rotatetext++;
}
}

void loop() {}

草图首先包括三个库。SPI.h,Adafruit_GFX.h和Adafruit_PCD8544.h。接下来,我们需要创建一个LCD对象。该对象有5个参数,并指定将哪些Arduino引脚连接到LCD的CLK,Din,D / C,CE和RST引脚。我们还定义rotatetext了稍后将有意义的变量。

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// Initialize LCD object for software SPI
// Adafruit_PCD8544(CLK,DIN,D/C,CE,RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

int rotatetext = 1;

在设置功能中:我们需要使用begin()功能来初始化LCD对象。我们还需要使用setContrast(value)功能设置显示器的对比度,其值可以在0-100之间。但是,值在50-60之间会产生很好的结果。

接下来,我们清除缓冲区,然后在屏幕上打印第一条消息。

//Initialize Display
display.begin();

// you can change the contrast around to adapt the display for the best viewing!
display.setContrast(57);

// Clear the buffer.
display.clearDisplay();

显示简单文本(Hello World)

// Display Text
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println("Hello world!");
display.display();
delay(2000);
display.clearDisplay();

为了在屏幕上显示文本,我们需要设置字体大小。这可以通过调用setTextSize()并传递字体大小(从1开始)作为参数来完成。

接下来,我们需要通过调用function来设置字体颜色setTextColor()。传递参数BLACK作为深色背景,传递WHITE作为明亮背景。现在,在打印消息之前,我们需要通过调用function设置光标位置setCursor(X,Y)

屏幕上的像素通过其水平(X)和垂直(Y)坐标进行寻址。坐标系将原点(0,0)放在左上角,正X向右增加,正Y向下增加。

我们可以使用简单print(" ")println(" ")功能在屏幕上打印消息,就像在串行监视器上打印数据一样。记住,println()将光标移动到新行。

为了使库在屏幕缓冲区上执行极快的数学运算(每秒超过100帧),对打印功能的调用不会立即将屏幕缓冲区的内容传输到PCD8544控制器。display()需要一条命令来指示库执行从ATmega328P的屏幕缓冲区到PCD8544控制器内部存储器的批量传输。传输存储器后,与屏幕缓冲区相对应的像素将显示在LCD显示屏上。

显示倒排文字

// Display Inverted Text
display.setTextColor(WHITE, BLACK);
display.setCursor(0,0);
display.println("Hello world!");
display.display();
delay(2000);
display.clearDisplay();

为了显示倒排的文本,我们将setTextColor(FontColor,BackgroundColor)再次调用function。如果您关注的话,您会知道我们之前只向该函数传递了一个参数,但是现在我们传递了两个参数。这是有可能的,因为有一些所谓的函数重载。函数重载是创建具有相同名称但具有不同参数集的多个函数的能力。对重载函数的调用将根据传递的参数运行该函数的特定实现。

在我们的情况下,传递setTextColor(BLACK, WHITE)将在填充的背景上呈现黑色文本。

缩放字体大小

// Scaling Font Size
display.setTextColor(BLACK);
display.setCursor(0,0);
display.setTextSize(2);
display.println("Hello!");
display.display();
delay(2000);
display.clearDisplay();

在本教程的前面,我们调用了setTextSize()函数来设置字体大小并将1作为参数传递。您可以使用此函数通过传递任何非负整数来缩放字体。

字符以5:7的比例呈现。意思是,传递字体大小1将以每个字符5×7像素呈现文本;传递2将以每个字符10×14像素渲染文本,依此类推。

小费

Adafruit_GFX库负责呈现字体。默认情况下,选择等宽字体。但是,较新版本的Adafruit GFX库提供了使用备用字体的功能。该库附带了几种备用字体,并且还可以添加新字体。

显示数字

// Display Numbers
display.setTextSize(1);
display.setCursor(0,0);
display.println(123456789);
display.display();
delay(2000);
display.clearDisplay();

只需呼叫print()println()功能即可在LCD显示屏上显示数字。这些函数的重载实现接受32位unsigned int,因此您只能显示0到4,294,967,295之间的数字。

指定数字的基数

// Specifying Base For Numbers
display.setCursor(0,0);
display.print("0x"); display.print(0xFF, HEX); 
display.print("(HEX) = ");
display.print(0xFF, DEC);
display.println("(DEC)"); 
display.display();
delay(2000);
display.clearDisplay();

print()println()功能具有指定所述基部(格式)来使用可选的第二个参数; 允许的值是BIN(二进制或以2为底),OCT(八进制或以8为底),DEC(十进制或以10为底),HEX(十六进制或以16为底)。对于浮点数,此参数指定要使用的小数位数。例如:

  • print(78,BIN)给出“ 1001110”
  • print(78,OCT)给出“ 116”
  • print(78,DEC)给出“ 78”
  • print(78,HEX)给出“ 4E”
  • println(1.23456,0)给出“ 1”
  • println(1.23456,2)给出“ 1.23”
  • println(1.23456,4)给出“ 1.2346”

显示ASCII符号

// Display ASCII Characters
display.setCursor(0,0);
display.setTextSize(2);
display.write(3);
display.display();
delay(2000);
display.clearDisplay();

所述print()println()而功能数据发送到显示为人类可读的ASCII文本write()函数发送二进制数据到显示器。因此,您可以使用此功能显示ASCII符号。在我们的示例中,发送数字3将显示心脏符号。

文字旋转

动图

// Text Rotation
while(1)
{
display.clearDisplay();
display.setRotation(rotatetext);
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println("Text Rotation");
display.display();
delay(1000);
display.clearDisplay();
rotatetext++;
}

您可以通过调用setRotation()函数旋转显示内容。它允许您以纵向模式查看显示内容,或上下翻转显示内容。

该功能仅接受一个与4个基本旋转相对应的参数。该值可以是从0开始的任何非负整数。每次增加该值时,显示内容将逆时针旋转90度。例如:

  • 0 –将屏幕保持在标准横向。
  • 1 –将屏幕向右旋转90°。
  • 2 –上下翻转屏幕。
  • 3 –将屏幕向左旋转90°。

Arduino代码–基本绘制方法

在此示例中,我们将尝试一些基本绘制方法。该草图演示了许多绘图功能,包括矩形,圆形矩形,圆形和三角形。尝试一下草图,然后我们将对其进行详细剖析。

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// Declare LCD object for software SPI
// Adafruit_PCD8544(CLK,DIN,D/C,CE,RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

void setup()   {
Serial.begin(9600);

//Initialize Display
display.begin();

// you can change the contrast around to adapt the display for the best viewing!
display.setContrast(57);

// Clear the buffer.
display.clearDisplay();

// Draw Rectangle
display.drawRect(0, 0, 60, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();


//Draw Filled Rectangle
display.fillRect(0, 0, 60, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();


//Draw Round Rectangle
display.drawRoundRect(0, 0, 60, 40, 8, BLACK);
display.display();
delay(2000);
display.clearDisplay();


//Draw Filled Round Rectangle
display.fillRoundRect(0, 0, 60, 40, 8, BLACK);
display.display();
delay(2000);
display.clearDisplay();


//Draw Circle
display.drawCircle(20, 20, 20, BLACK);
display.display();
delay(2000);
display.clearDisplay();

//Draw Filled Circle
display.fillCircle(20, 20, 20, BLACK);
display.display();
delay(2000);
display.clearDisplay();


//Draw Triangle
display.drawTriangle(20, 0, 0, 40, 40, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();


//Draw Filled Triangle
display.fillTriangle(20, 0, 0, 40, 40, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();
}

void loop() {}

大部分代码(包括库和初始化显示)与上述代码示例相同,但以下代码段用于绘制基本图形。

绘图矩形

// Draw Rectangle
display.drawRect(0, 0, 60, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();


//Draw Filled Rectangle
display.fillRect(0, 0, 60, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();

您可以使用drawRect()函数在显示屏上绘制矩形。该函数具有五个参数,即。X坐标,Y坐标,宽度,高度和颜色。实际上,此函数绘制具有1个像素边框的空心矩形。您可以使用fillRect()函数绘制填充的矩形。

绘制圆矩形

//Draw Round Rectangle
display.drawRoundRect(0, 0, 60, 40, 8, BLACK);
display.display();
delay(2000);
display.clearDisplay();


//Draw Filled Round Rectangle
display.fillRoundRect(0, 0, 60, 40, 8, BLACK);
display.display();
delay(2000);
display.clearDisplay();

您可以使用drawRoundRect()函数在显示器上绘制圆形矩形。该函数采用与函数相同的参数,drawRect()除了一个附加参数–圆角半径。实际上,此函数绘制具有1个像素边框的空心圆形矩形。您可以使用fillRoundRect()函数绘制填充的圆角矩形。

绘图圈

//Draw Circle
display.drawCircle(20, 20, 20, BLACK);
display.display();
delay(2000);
display.clearDisplay();

//Draw Filled Circle
display.fillCircle(20, 20, 20, BLACK);
display.display();
delay(2000);
display.clearDisplay();

您可以使用drawCircle()功能在显示屏上画圆。该函数具有四个参数,即。中心的X坐标,中心的Y坐标,半径和颜色。此功能绘制带有1个像素边框的空心圆。您可以使用fillCircle()函数绘制实心圆。

绘制三角形

//Draw Triangle
display.drawTriangle(20, 0, 0, 40, 40, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();


//Draw Filled Triangle
display.fillTriangle(20, 0, 0, 40, 40, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();

您可以使用drawTriangle()功能在显示屏上绘制三角形。该函数具有七个参数,即。三角形和颜色的顶点的3个X和Y坐标(x0,y0,x1,y1,x2和y2)。(X0,y0)代表顶部顶点,(x1,y1)代表左侧顶点,(x2,y2)代表右侧顶点。

此函数绘制带有1个像素边框的空心三角形。您可以使用fillTriangle()函数绘制实心三角形。

Arduino代码–显示位图

最后一个示例显示如何将位图图像绘制到诺基亚5110 LCD显示器上。这对于创建公司徽标的启动画面,制作图片或仅创建有趣的图形来显示信息很有用。复制以下代码,将其粘贴到Arduino IDE中,然后单击上载。

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// Declare LCD object for software SPI
// Adafruit_PCD8544(CLK,DIN,D/C,CE,RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

// 'Marilyn Monroe 84x48', 84x48px
const unsigned char MarilynMonroe [] PROGMEM = {
0x00, 0x00, 0x00, 0x7f, 0x00, 0x02, 0xfe, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, 
0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0xe1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 
0x00, 0x00, 0x0f, 0xf1, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xd8, 0xe0, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x07, 0xe0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, 
0x3f, 0xe0, 0x00, 0x07, 0xf0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x70, 0x00, 0x0f, 0xee, 
0x7c, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x0f, 0xf7, 0x1c, 0x00, 0x00, 0x00, 0x00, 
0x07, 0x80, 0x00, 0x0f, 0xc7, 0xf3, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x0f, 0xf3, 
0xdf, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00, 0x08, 0x7d, 0xef, 0xff, 0xc0, 0x00, 0x00, 
0x00, 0x7f, 0xff, 0x80, 0x30, 0x0f, 0xfc, 0xe0, 0xc0, 0x00, 0x00, 0x01, 0x9e, 0x73, 0xc0, 0xe0, 
0x07, 0xf8, 0xc1, 0xc0, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x01, 0xc0, 0x0f, 0xfd, 0xe1, 0x80, 0x00, 
0x00, 0x03, 0xf8, 0x00, 0x01, 0x9c, 0x0f, 0xff, 0xc1, 0xc0, 0x00, 0x00, 0x02, 0xc0, 0x00, 0x01, 
0x9f, 0xbf, 0xfe, 0x01, 0x40, 0x00, 0x00, 0x02, 0x60, 0x00, 0x03, 0x07, 0xef, 0xff, 0x01, 0x40, 
0x00, 0x00, 0x00, 0x60, 0x00, 0x07, 0x01, 0xf7, 0xff, 0x80, 0xc0, 0x00, 0x00, 0x00, 0x50, 0x01, 
0xdf, 0x00, 0x7f, 0xff, 0x1c, 0x80, 0x00, 0x00, 0x00, 0x40, 0x01, 0xff, 0x00, 0x1f, 0xff, 0x1e, 
0xe0, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3f, 0x80, 0x07, 0xef, 0x03, 0xe0, 0x00, 0x00, 0x06, 0x08, 
0x00, 0x03, 0xc0, 0x07, 0xdf, 0x07, 0xc0, 0x00, 0x00, 0x06, 0x08, 0x0f, 0x81, 0x80, 0x1f, 0xdf, 
0x1f, 0x80, 0x00, 0x00, 0x03, 0x08, 0x1f, 0x98, 0x00, 0x3f, 0xfe, 0x19, 0x80, 0x00, 0x00, 0x18, 
0x08, 0x3f, 0xfe, 0x00, 0x7f, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x08, 0x08, 0x30, 0x3f, 0x00, 0xff, 
0xff, 0x3f, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x76, 0x0f, 0x89, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 
0x03, 0xe0, 0x7f, 0xc3, 0x81, 0xff, 0xfe, 0x9f, 0x80, 0x00, 0x00, 0x03, 0xf0, 0x7f, 0xf3, 0xc3, 
0xff, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x7f, 0xfd, 0xc3, 0xff, 0xfe, 0x5e, 0x00, 0x00, 
0x00, 0x03, 0xf0, 0x7f, 0xff, 0xc3, 0xff, 0xf3, 0x1e, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x71, 0xff, 
0x87, 0xff, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x7c, 0x3f, 0x87, 0xff, 0xe3, 0xfe, 0x00, 
0x00, 0x00, 0x0f, 0xf0, 0x3c, 0xff, 0x05, 0xff, 0xf3, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x0f, 
0xfe, 0x09, 0xff, 0xf7, 0xfc, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x01, 0xfc, 0x19, 0xff, 0xff, 0xf8, 
0x00, 0x00, 0x00, 0x0c, 0x78, 0x00, 0x00, 0x13, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x0e, 0x78, 
0x00, 0x00, 0x23, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x0e, 0xf8, 0x00, 0x00, 0x47, 0xff, 0xff, 
0xf0, 0x00, 0x00, 0x00, 0x0c, 0xfa, 0x00, 0x01, 0x8f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x08, 
0x7b, 0x00, 0x03, 0x3f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0x3b, 0xf8, 0x0f, 0xff, 0xff, 
0xff, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 
0x07, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x71, 0xff, 0xff, 0xff, 
0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x41, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00
};

void setup()   {
Serial.begin(9600);

//Initialize Display
display.begin();

// you can change the contrast around to adapt the display for the best viewing!
display.setContrast(57);

// Clear the buffer.
display.clearDisplay();

// Display bitmap
display.drawBitmap(0, 0, MarilynMonroe, 84, 48, BLACK);
display.display();

// Invert Display
//display.invertDisplay(1);
}

void loop() {}

这就是输出的样子。

要在诺基亚5110 LCD显示屏上显示位图图像,我们需要调用drawBitmap()函数。它需要六个参数,即。左上角X坐标,左上角Y坐标,单色位图的字节数组,位图的宽度(以像素为单位),位图的高度(以像素为单位)和颜色。

在我们的示例中,位图图像的尺寸为84×48。因此,X和Y坐标设置为0,而宽度和高度设置为84和48。

// Display bitmap
display.drawBitmap(0, 0, MarilynMonroe, 84, 48, BLACK);
display.display();

但是,在调用该drawBitmap()函数之前,我们首先需要绘制图像。请记住,诺基亚5110 LCD显示屏的屏幕分辨率为84×48像素,因此大于该尺寸的图像将无法正确显示。要获得正确尺寸的图像,可以使用喜欢的绘图程序(如Inkscape,Photoshop,Paint等),将画布大小设置为84×48像素。

我们以嘲笑玛丽莲·梦露的图像为例,并使用“画图”将其转换为84×48像素并另存为.bmp。

一旦有了位图,就可以将其转换为PCD8544控制器可以理解的阵列。这可以通过两种方式完成:使用image2cpp的联机方法和使用LCD Assistant的脱机方法。

在线位图数组生成器– image2cpp

有一个名为image2cpp的在线应用程序– http://javl.github.io/image2cpp/可以将您的图像转换为数组。Image2cpp比LCD Assistant(更新的解决方案)更新且功能强大。它将使您能够:

  • 同时转换多个图像。
  • 缩放图像文件–拉伸/缩放以适合/原始
  • 在黑白之间调整亮度阈值。
  • 垂直和/或水平重新居中图像。
  • 反转图像颜色

该工具功能强大,可以离线使用。只需将页面保存到PC并在浏览器中打开它即可。感谢Jasper van Loenen的杰出贡献。

首先,在浏览器中打开image2cpp并选择要在屏幕上显示的任何图像。

图像的尺寸将填充在“图像设置”下的“画布大小”选项中。如果选择的图像大于84×48,请将其更改为84×48,然后选择适当的“缩放比例”选项。您可以在“预览”部分中查看输出。

您可以根据需要更改背景颜色或反转图像颜色。

最后,根据您的要求更改最重要的选项-亮度阈值。设置阈值将使高于此级别的像素变为低于黑色的像素。在我们的案例中,我们将其设置为171,以获取Marilyn Monroe的详细信息。

这个小预览反映了您在设置中所做的任何更改。您可以在保持关注的同时更改设置。

对结果满意后,就可以继续生成数据数组了。只需选择Code output format作为Arduino Code,然后单击Generate code按钮。

仅供参考,有一个称为“绘制模式”的选项。它实际上根据显示器的扫描方式创建图像。如果图像看上去在显示器上一团糟,请尝试更改模式。

OK。您的位图的字节数组将生成。您可以将输出直接用于我们的示例代码。只要确保适当命名即可。然后在drawBitmap()函数内部调用数组。

离线位图阵列生成器– LCD Assistant

还有一个称为LCD助手的应用程序– http://en.radzio.dxp.pl/bitmap_converter/,可以将位图图像转换为数据数组。它不如image2cpp强大,但在业余爱好者中仍然很流行。

首先,您需要将图像转换为84×48 1位单色位图。您可以使用喜欢的绘图程序(如Inkscape,Photoshop,Paint等)来完成此操作,就像我们在MS paint中所做的一样。

在MS Paint中打开文件并将其大小调整为84×48。

现在,将文件另存为位图。保存文件时,选择“另存为类型:单色位图(* .bmp; *。dib)”。这将生成1位/二进制位图图像,每个像素只有两个可能的值,即0(黑色)或1(白色)。

唯一的缺点是您无法设置亮度阈值水平。默认情况下设置为50%,并且无法更改。

无论如何,请下载LCD助手程序。打开可执行文件,然后从“文件”菜单加载位图。

使用此工具无能为力。因此,只需转到“文件”菜单,然后单击“保存输出”选项。将文件另存为文本文件。

仅供参考,有一个称为字节定向的选项。它实际上根据显示器的扫描方式创建图像。如果图像看上去在显示器上一团糟,请尝试更改模式。

OK。创建数组后,将其粘贴到代码中。只要确保适当命名即可。然后在drawBitmap()函数内部调用数组。


标题:【诺基亚5110】图形LCD显示屏和【Arduino】
作者:llilei
地址:http://solo.llilei.work/articles/2024/04/01/1711976315348.html