在 LCD 上显示文本

LCD 字符显示器可用于显示信息,而无需外部监视器。 常见的 LCD 字符显示器可以直接连接到 GPIO 引脚,但这种方法最多需要使用 10 个 GPIO 引脚。 对于需要连接到设备组合的场景,将如此多的 GPIO 标头分配给字符显示器通常不切实际。

许多制造商会销售带有集成 GPIO 扩展器的 20x4 LCD 字符显示器。 字符显示器将直接连接到 GPIO 扩展器,然后通过内置集成电路 (I2C) 串行协议连接到 Raspberry Pi。

在本主题中,你将使用 .NET 通过 I2C GPIO 扩展器在 LCD 字符显示器上显示文本。

先决条件

注意

本教程编写时假设目标设备是 Raspberry Pi。 但是,本教程可用于支持 .NET 的任何基于 Linux 的 SBC,例如 Orange Pi、ODROID 等。

注意

LCD 字符显示器的制造商有很多。 大多数设计都相同,并且制造商不应对功能进行任何更改。 作为参考,本教程按照 SunFounder LCD2004 开发。

准备 SBC

确保 SBC 配置为支持以下服务:

  • SSH
  • I2C

对于许多设备,无需其他配置。 对于 Raspberry Pi,请使用 raspi-config 命令。 有关 raspi-config 的详细信息,请参阅 Raspberry Pi 文档

准备硬件

使用跳线将 I2C GPIO 扩展器上的四个引脚连接到 Raspberry Pi,如下所示:

  • GND 到地面
  • VCC 到 5V
  • SDA 到 SDA (GPIO 2)
  • SCL 到 SCL (GPIO 3)

请根据需要参阅下图:

I2C 接口(显示器背面) Raspberry Pi GPIO
显示 I2C GPIO 扩展器的字符显示器背面的图像。 显示 Raspberry Pi GPIO 标头引脚分配的关系图。图片由 Raspberry Pi 基金会提供。
图片由 Raspberry Pi 基金会提供

提示

建议将 GPIO 分组讨论板与试验板结合使用,以便简化与 GPIO 标头的连接。

创建应用

在首选开发环境中完成以下步骤:

  1. 使用 .NET CLIVisual Studio 创建新 .Net 控制台应用。 将其命名为 LcdTutorial。

    dotnet new console -o LcdTutorial
    cd LcdTutorial
    
  2. Iot.Device.Bindings 包添加到项目。 使用项目目录或 Visual Studio 中的任一 .NET CLI

    dotnet add package Iot.Device.Bindings --version 2.2.0-*
    
  3. 将 Program.cs 的内容替换为以下代码:

    using System;
    using System.Device.Gpio;
    using System.Device.I2c;
    using System.Threading;
    using Iot.Device.CharacterLcd;
    using Iot.Device.Pcx857x;
    
    Console.WriteLine("Displaying current time. Press Ctrl+C to end.");
    
    using I2cDevice i2c = I2cDevice.Create(new I2cConnectionSettings(1, 0x27));
    using var driver = new Pcf8574(i2c);
    using var lcd = new Lcd2004(registerSelectPin: 0, 
                            enablePin: 2, 
                            dataPins: new int[] { 4, 5, 6, 7 }, 
                            backlightPin: 3, 
                            backlightBrightness: 0.1f, 
                            readWritePin: 1, 
                            controller: new GpioController(PinNumberingScheme.Logical, driver));
    int currentLine = 0;
    
    while (true)
    {
        lcd.Clear();
        lcd.SetCursorPosition(0,currentLine);
        lcd.Write(DateTime.Now.ToShortTimeString());
        currentLine = (currentLine == 3) ? 0 : currentLine + 1; 
        Thread.Sleep(1000);
    }
    

    在上述代码中:

    • 一个 using 声明通过调用 I2cDevice.Create 并传入带有 busIddeviceAddress 参数的新 I2cConnectionSettings 来创建 I2cDevice 的实例。 这个 I2cDevice 表示 I2C 总线。 using 声明可确保对象已处置,硬件资源已正确释放。

      警告

      GPIO 扩展器的设备地址取决于制造商使用的芯片。 配备 PCF8574 芯片的 GPIO 扩展器使用地址 0x27,而使用 PCF8574A 芯片的扩展器使用地址 0x3F。 请查阅你的 LCD 文档。

    • 另一个 using 声明创建 Pcf8574 的实例,并将 I2cDevice 传递到构造函数中。 此实例表示 GPIO 扩展器。

    • 另一个 using 声明创建 Lcd2004 的实例以表示显示器。 多个参数已传递给构造函数,该构造函数描述用于与 GPIO 扩展器进行通信的设置。 GPIO 扩展器作为 controller 参数传递。

    • while 循环无限期运行。 每次迭代:

      1. 清除显示器。
      2. 将光标位置设置为当前行的第一个位置。
      3. 将当前时间写入显示器上当前光标位置。
      4. 循环访问当前行计数器。
      5. 休眠 1000 毫秒。
  4. 构建应用程序。 如果使用的是 .NET CLI,请运行 dotnet build。 若要在 Visual Studio 中进行生成,请按 Ctrl+Shift+B

  5. 将该应用作为独立应用部署到 SBC。 有关说明,请参阅将 .NET 应用部署到 Raspberry Pi。 请确保使用 chmod +x 指定可执行的 execute 权限。

  6. 通过切换到部署目录并运行可执行文件,在 Raspberry Pi 上运行该应用。

    ./LcdTutorial
    

    观察 LCD 字符显示器,当前时间应显示在每一行上。

    提示

    如果显示器已亮起,但看不到任何文本,请尝试调整显示器背面的对比度拨盘。

  7. Ctrl+C 终止程序。

恭喜! 你已使用 I2C 和 GPIO 扩展器在 LCD 上显示了文本!

获取源代码

GitHub 上提供此教程的源。

后续步骤