在 LCD 上显示文本

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

许多制造商会销售带有集成 GPIO 扩展器的 20x4 LCD 字符显示器。 字符显示直接连接到 GPIO 扩展器,然后通过 Inter-Integrated 线路(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 Foundation 提供。
图片由 Raspberry Pi Foundation 提供

小提示

建议将 GPIO 扩展板与面包板结合使用,以简化与 GPIO 接头的连接。

创建应用

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

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

    dotnet new console -o LcdTutorial
    cd LcdTutorial
    
  2. Iot.Device.Bindings 包添加到项目。 可以从项目目录使用.NET CLI,或者使用Visual Studio

    dotnet add package Iot.Device.Bindings --version 3.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 并传入带有 I2cDevice.CreateI2cConnectionSettings 参数的新 busId 来创建 deviceAddress 的实例。 这 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。 请确保使用 指定可执行的 execute 权限chmod +x

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

    ./LcdTutorial
    

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

    小提示

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

  7. Ctrl+C 终止程序。

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

获取源代码

本教程的源 在 GitHub 上提供

后续步骤