【诺基亚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