一板网电子技术论坛

风筝
发表于: 2020-12-11 10:12:25 | 显示全部楼层

在本篇文章中,我们将主要介绍如何将微控制器与LCD显示屏连接,以及如何制作第一个草图实现在LCD显示屏上显示所需的内容。

在本文中,我们将使用两种不同种类的显示屏:

  不带I2C连接的LCD显示屏

  带I2C连接的LCD显示屏


在大多数时候,我们使用Arduino IDE自带的串口绘图仪来可视化我们的解决方案或草图的输出。在进行原型制作时,这非常节省时间。但是有时您的系统也会需要实时查看。例如,如果仅将数据从传感器发送到Raspberry Pi上的数据库,则可以通过连接到数据库从PC远程查看输出。但是在某些情况下,例如室内气象站,您希望在室内直接看到当前温度等输出,而不是在PC上查看。


这时候就需要使用到显示屏了。市面上有各种不同类型的显示屏,例如7段数码管、4位7段数码管、8×8点阵显示屏、OLED显示屏或液晶显示屏(LCD)。


大多数LCD显示具有2行每行16个字符,或者4行每行20个字符。有带和不带I2C模块的LCD显示屏。我建议使用I2C的模块,因为与电路板的连接非常容易,并且仅使用2个引脚而不是6个引脚。但在本文中会介绍带或不带I2C模块的LCD液晶屏。

DSC01171.jpg


液晶显示屏的功能

LCD显示屏的工作电压在4.7V至5.3V之间,在无背光时的电流消耗为1mA,而使用全背光的电流消耗为120mA。背光有绿色和蓝色颜色。显示屏的每个字符都由5×8像素的框构成,因此能够显示自定义生成的字符。由于每个字符都是由(5×8 = 40)40个像素构成的,所以一个16×2 LCD显示屏总共有16x2x40 = 1280像素。 LCD模块能够以8位和4位模式运行。 4位和8位模式之间的区别如下:

●    在8位模式下,仅需要一个脉冲信号即可在LCD显示屏上显示字符,而不是两个脉冲信号。

●    与8位模式下的所有8个数据引脚相比,4位模式仅使用了四个数据引脚。

●    由于需要两个脉冲(使能)信号来显示单个字符,因此与8位模式相比,4位模式的等待时间更长。


不带I2C连接的LCD显示屏使用方法

如果使用不带I2C连接的LCD显示屏版本,则需要手动添加一个电位器来控制液晶屏的对比度。下图显示了LCD液晶屏的引脚分布。


同时我还制作了一张表格,该表格说明了如何将LCD显示器与Arduino Uno和NodeMCU连接,并附有LCD引脚的描述。为了尽可能轻松地将微控制器连接到显示器,请查看Arduino Uno和NodeMCU的相应的fritzing连接图。

LCD_without_I2C_Steckplatine.png

引脚序号LCD引脚名称 Arduino Uno连接ESP8266 NodeMCU连接 描述
1 GND GND GND 接地引脚,连接到Arduino的GND引脚。
2 VCC 3V3 / 5V 3V3 / VIN 电源电压5V(4.7V – 5.3V)
3 VEE 电位器 电位器 调节显示屏的对比度。如果将该引脚接地,则可获得最大对比度。我们将VEE引脚连接到电位器输出,以通过更改电位器的电阻来调整对比度。
4 RS D12 D2 当RS设置为低电平时,选择命令寄存器向LCD发送命令;当RS设置为高电平时,选择数据寄存器将数据或字符发送到LCD。
5 R/W GND GND 读取或写入数据。通常接地以将数据写入LCD
6 Enable D11 D3 连接到微控制器引脚,并在1和0之间切换以进行数据确认。因此,如果要通过数据引脚0至7发送数据,则必须确保使能引脚为高电平。
7 Data Pin 0 (d0) 数据引脚0至7组成8位数据线。数据引脚连接到微控制器的数字I / O引脚,以发送8位数据。
8 Data Pin 1 (d1)
9 Data Pin 2 (d2)
10 Data Pin 3 (d3)
11 Data Pin 4 (d4) D5 D6
12 Data Pin 5 (d5) D4 D7
13 Data Pin 6 (d6) D3 D8
14 Data Pin 7 (d7) D2 RX
15 LED Positive 3V3 / 5V 3V3 / VIN 背光LED灯引脚正极
16 LED Negative GND GND 背光LED灯引脚负极

不带I2C的LCD显示屏与Arduino Uno的连接

下图显示了LCD显示屏和Arduino Uno开发板之间的连接。

LCD_Arduino_without_I2C.png


不带I2C的LCD显示屏与ESP8266 NodeMCU的连接

下图显示了LCD显示屏和ESP8266 NodeMCU开发板之间的连接。

LCD_NodeMCU_without_I2C.png


当然,我们也想尝试测试一下微控制器和LCD显示器之间的连接。接下来,您可以在Arduino IDE中找到示例草图。该示例代码在显示屏的第一行中打印输出“ hello,world!”,在第二行中显示每秒的计数。在本示例中,我们使用之前描述的连接。

  1. // include the library code:
  2. #include "LiquidCrystal_I2C.h"

  3. // initialize the library by associating any needed LCD interface pin
  4. // with the arduino pin number it is connected to
  5. const int RS = D2, EN = D3, d4 = D5, d5 = D6, d6 = D7, d7 = D8;

  6. // if you use the NodeMCU 12E the suggested pins are
  7. // const int RS = 4, EN = 0, d4 = 12 , d5 = 13, d6 = 15, d7 = 3;

  8. LiquidCrystal lcd(RS, EN, d4, d5, d6, d7);

  9. void setup() {
  10. // set up the LCD's number of columns and rows:
  11. lcd.begin(16, 2);
  12. // Print a message to the LCD.
  13. lcd.print("hello, world!");
  14. }

  15. void loop() {
  16. // set the cursor to column 0, line 1
  17. // (note: line 1 is the second row, since counting begins with 0):
  18. lcd.setCursor(0, 1);
  19. // print the number of seconds since reset:
  20. lcd.print(millis() / 1000);
  21. }
复制代码

DSC01156-e1563638243208.jpg


DSC01158.jpg


将数据打印到LCD屏幕上看起来非常复杂。但是不用担心,在大多数情况下,如果项目变得复杂起来,可以使用库的方式。不带I2C连接的LCD显示器也可以使用库。因此,下一步是安装库“ LiquidCrystal”。成功安装库之后,可以通过以下方式包含该库:#include <LiquidCrystal.h>。


带I2C连接的LCD显示屏使用方法

就像前文提到的,我建议使用I2C的LCD模块,因为在显示屏和微控制器板之间的连接只需要2个而不是6个引脚即可。如果您使用LCD和微控制器之间的I2C通信,则需要知道LCD的I2C HEX地址。在这篇文章中详细说明了如何找到设备的I2C HEX地址。


液晶屏背面是一个内置的10kΩ电位器,用于控制屏幕对比度。您无需像不带I2C连接的版本手动添加电位器。


下图显示了如何将I2C LCD显示器与Arduino Uno连接。对于本文中的所有示例,我们将使用以下这种连接。

Example_ArduinoUno.png


下表列出了Arduino Uno和LCD显示屏之间的硬件连接关系。

Arduino Uno开发板
LCD显示屏
GND
GND
5V
VCC
PIN18
SDA
PIN19
SCL

Example_NodeMCU.png

下表列出了Node MCU和LCD显示屏之间的硬件连接关系。

NodeMCU开发板
LCD显示屏
GND
GND
VIN
VCC
D2
SDA
D1
SCL

要使用I2C LCD显示屏,我们需要安装Frank de Brabander提供的“ LiquidCrystal_I2C”库。您可以在此处找到有关如何通过Arduino IDE安装外部库的文章。成功安装库之后,可以通过以下方式包含该库:#include <LiquidCrystal_I2C.h>。


以下简短的示例向您展示了如何使用该库来控制LCD显示屏。

  1. #include "Wire.h"
  2. #include "LiquidCrystal_I2C.h"

  3. // create an LCD object (Hex address, # characters, # rows)
  4. // my LCD display in on Hex address 27 and is a 20x4 version
  5. LiquidCrystal_I2C lcd(0x27, 20, 4);

  6. void setup()
  7. {
  8.   lcd.init();

  9.   lcd.backlight();
  10.   lcd.setCursor(1, 0);
  11.   lcd.print("This is");
  12.   lcd.setCursor(1, 1);
  13.   lcd.print("DIYI0T.com");
  14. }

  15. void loop(){}
复制代码

DSC01128-1024x1024.jpg

跳转到指定楼层
风筝
发表于: 2020-12-11 10:48:04 | 显示全部楼层

闪烁、光标和滚动显示的示例

为了向您展示LiquidCrystal和LiquidCrystal_I2C库的一些基本示例,您可以复制以下示例,展示该库的三种不同功能:

1.    显示或隐藏闪烁的字符字段,以向您的应用程序的用户显示例如需要输入或正在加载应用程序。

2.    显示或隐藏光标(“ _”),当您创建菜单作为导航栏时,从左到右或从上到下,这很有用,具体取决于垂直或水平菜单栏。

3.    将所有字符向右移动以滚动显示。


以下代码显示了Arduino程序,该程序使用库的所有三个LCD显示函数,并分为三个独立的函数。

  1. #include "Wire.h"
  2. #include "LiquidCrystal_I2C.h"

  3. // set the LCD address to 0x27 for a 16 chars and 2 line display
  4. LiquidCrystal_I2C lcd(0x27, 20, 4);

  5. void setup()
  6. {
  7.   lcd.init();
  8.   lcd.backlight();
  9.   lcd.clear();
  10. }

  11. void loop(){
  12.   show_blink();
  13.   show_cursor();
  14.   scroll_display();
  15.   }

  16. void show_blink(){
  17.   lcd.clear();
  18.   lcd.setCursor(0,2);
  19.   lcd.print("Blink is on");
  20.   lcd.setCursor(0,0);
  21.   lcd.blink();
  22.   delay(5000);
  23.   lcd.setCursor(0,2);
  24.   lcd.print("Blink is off");
  25.   lcd.setCursor(0,0);
  26.   lcd.noBlink();
  27.   delay(5000);
  28. }

  29. void show_cursor(){
  30.   lcd.clear();
  31.   lcd.setCursor(0,2);
  32.   lcd.print("Cursor is on");
  33.   lcd.setCursor(0,0);
  34.   lcd.cursor();
  35.   delay(5000);
  36.   lcd.setCursor(0,2);
  37.   lcd.print("Cursor is off");
  38.   lcd.setCursor(0,0);
  39.   lcd.noCursor();
  40.   delay(5000);
  41. }

  42. void scroll_display(){
  43.   lcd.clear();
  44.   lcd.setCursor(0,2);
  45.   lcd.print("Scroll display");
  46.   lcd.scrollDisplayRight();
  47.   delay(1000);
  48.   lcd.scrollDisplayRight();
  49.   delay(1000);
  50.   lcd.scrollDisplayRight();
  51.   delay(1000);
  52.   lcd.scrollDisplayRight();
  53.   delay(3000);
  54. }
复制代码

如何显示自定义生成的字符?

如果使用前面提到的库,则自定义字符的创建非常容易。 LiquidCrystal和LiquidCrystal_I2C库均具有函数“ lcd.createChar()”,以从一个字符的5×8像素中创建一个自定义字符。 要设计自己的字符,您需要从LCD字符生成器制作自定义字符的二进制数组或自己进行映射。

  1. #include "Wire.h"
  2. #include "LiquidCrystal_I2C.h"

  3. // Set the LCD address to 0x27 in PCF8574 by NXP and Set to 0x3F in PCF8574A by Ti
  4. LiquidCrystal_I2C lcd(0x27, 20, 4);

  5. byte customChar1[] = {
  6.   B01110,
  7.   B01110,
  8.   B00100,
  9.   B11111,
  10.   B00100,
  11.   B01110,
  12.   B01010,
  13.   B01010
  14. };

  15. byte customChar2[] = {
  16.   B01110,
  17.   B01110,
  18.   B10101,
  19.   B01110,
  20.   B00100,
  21.   B00100,
  22.   B01010,
  23.   B10001
  24. };

  25. void setup() {
  26.   lcd.init();
  27.   lcd.backlight();
  28. }

  29. void loop() {
  30.   lcd.createChar(0, customChar1);
  31.   lcd.home();
  32.   lcd.write(0);
  33.   delay(1000);
  34.   lcd.createChar(0, customChar2);
  35.   lcd.home();
  36.   lcd.write(0);
  37.   delay(1000);
  38.   }
复制代码

您可以使用以下工具轻松快速地创建自定义生成的字符:http://omerk.github.io/lcdchargen/


LCD显示的重要命令代码

在不带I2C的LCD显示屏引脚分配部分中,我们看到,如果将RS引脚设置为低电平,则可以将命令发送到LCD。这些命令由数据引脚发送,并由以下十六进制代码表示。

序号
十六进制编码
LCD指令寄存器命令
1
1
清除显示屏
2
2
回到首地址
3
4
递减光标(向左移动光标)
4
6
增加光标(向右移动光标)
5
5
右移显示
6
7
左移显示
7
8
显示关闭,光标关闭
8
0A
显示关闭,光标打开
9
0C
显示打开,光标关闭
10
0E
显示打开,光标闪烁
11
0F
显示打开,光标闪烁
12
10
向左移动光标位置
13
14
向右移动光标位置
14
18
将整个显示屏向左移动
15
1C
将整个显示屏向右移动
16
80
将光标强制移动到开始(第一行)
17
C0
将光标强制移动到开始(第二行)
18
38
2行和5×7矩阵

总结

我希望您能从本文中学到很多东西。请随时使用您的微控制器测试示例草图。您对本文有任何疑问吗?欢迎在本帖下面进行回复。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 560 | 回复: 1089



手机版|

GMT+8, 2021-5-13 02:09 , Processed in 0.038376 second(s), 30 queries . Powered by Discuz! X3.4

YiBoard一板网 © 2015-2020 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表