nanoFramework.Graphics.Ili9341 1.2.15

前缀已预留
dotnet add package nanoFramework.Graphics.Ili9341 --version 1.2.15                
NuGet\Install-Package nanoFramework.Graphics.Ili9341 -Version 1.2.15                
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="nanoFramework.Graphics.Ili9341" Version="1.2.15" />                
对于支持 PackageReference 的项目,请将此 XML 节点复制到项目文件中,以引用该包。
paket add nanoFramework.Graphics.Ili9341 --version 1.2.15                
#r "nuget: nanoFramework.Graphics.Ili9341, 1.2.15"                
#r 指令可用于 F# Interactive 和 Polyglot Notebooks。请将此内容复制到交互式工具或脚本的源代码中,以引用包。
// Install nanoFramework.Graphics.Ili9341 as a Cake Addin
#addin nuget:?package=nanoFramework.Graphics.Ili9341&version=1.2.15

// Install nanoFramework.Graphics.Ili9341 as a Cake Tool
#tool nuget:?package=nanoFramework.Graphics.Ili9341&version=1.2.15                

Quality Gate Status Reliability Rating License NuGet #yourfirstpr Discord

nanoFramework logo


欢迎使用 .NET nanoFramework 图形库仓库

构建状态

组件 构建状态 NuGet 包
nanoFramework.Graphics Build Status NuGet

用法

重要:

  • 此库仍在开发中。在开发库的过程中,可能会有破坏性的更改。
  • 目前只实现了 SPI 接口。

有关更详细的用法,请参阅 示例

初始化屏幕

重要的是要理解,当从托管代码初始化屏幕路由时,将加载驱动程序。请记住,大多数屏幕实际上比驱动程序可以处理的尺寸要小,而且真实屏幕可以从一个不是典型原点(0,0)的位置开始。

您必须在创建位图或显示任何内容之前初始化屏幕。

此代码片段适用于 ESP32 WROVER KIT 引脚配置,在这种情况下,屏幕尺寸与驱动程序尺寸匹配。


const int backLightPin = 5;
const int chipSelect = 22;
const int dataCommand = 21;
const int reset = 18;
const int screenWidth = 320;
const int screenHeight = 240;
DisplayControl.Initialize(new SpiConfiguration(1, chipSelect, dataCommand, reset, backLightPin), new ScreenConfiguration(0, 0, screenWidth, screenHeight), screenBufferSize);

此代码片段是为 M5 Stick 定制的,其中屏幕尺寸小于驱动程序尺寸,并通过 X=26 和 Y=1 坐标启动偏移位置。

int backLightPin = -1; // Not managed thru ESP32 but thru AXP192
int chipSelect = 5;
int dataCommand = 23;
int reset = 18;
Configuration.SetPinFunction(4, DeviceFunction.SPI1_MISO); // 4 is unused but necessary
Configuration.SetPinFunction(15, DeviceFunction.SPI1_MOSI);
Configuration.SetPinFunction(13, DeviceFunction.SPI1_CLOCK);
DisplayControl.Initialize(new SpiConfiguration(1, chipSelect, dataCommand, reset, backLightPin), new ScreenConfiguration(26, 1, 80, 160), 10 * 1024);

请注意,根据您的目标,尤其是对于ESP32,您可能需要设置引脚。即使实际上不使用,MISO引脚也必须设置为有效的引脚。

如您所见,同样可以不定义背光引脚。其他引脚也是如此。两者都可以设置为-1。请注意,在大多数情况下,两者都连接并需要。在M5 Stick的情况下,背光引脚通过AXP192管理。如果您不开启背光引脚,屏幕总是黑色的。检查如何打开此引脚很重要。

使用通用图形SPI驱动程序

现在可以使用通用图形SPI驱动程序。这需要构建一个包含Generic_SPI.cpp驱动程序的镜像。一旦镜像闪存到设备上,您可以从托管的类中直接给出驱动程序命令。当使用特定驱动程序构建时,即使您提供了它,也会忽略通用驱动程序。

以下是基于ST7735S驱动程序的示例,我们已经使用了枚举寄存器

private enum St7735
{
    NOP = 0x00,
    SOFTWARE_RESET = 0x01,
    POWER_STATE = 0x10,
    Sleep_Out = 0x11,
    Invertion_Off = 0x20,
    Invertion_On = 0x21,
    Gamma_Set = 0x26,
    Display_OFF = 0x28,
    Display_ON = 0x29,
    Column_Address_Set = 0x2A,
    Page_Address_Set = 0x2B,
    Memory_Write = 0x2C,
    Colour_Set = 0x2D,
    Memory_Read = 0x2E,
    Partial_Area = 0x30,
    Memory_Access_Control = 0x36,
    Pixel_Format_Set = 0x3A,
    Memory_Write_Continue = 0x3C,
    Write_Display_Brightness = 0x51,
    Frame_Rate_Control_Normal = 0xB1,
    Frame_Rate_Control_2 = 0xB2,
    Frame_Rate_Control_3 = 0xB3,
    Invert_On = 0xB4,
    Display_Function_Control = 0xB6,
    Entry_Mode_Set = 0xB7,
    Power_Control_1 = 0xC0,
    Power_Control_2 = 0xC1,
    Power_Control_3 = 0xC2,
    Power_Control_4 = 0xC3,
    Power_Control_5 = 0xC4,
    VCOM_Control_1 = 0xC5,
    VCOM_Control_2 = 0xC7,
    Power_Control_A = 0xCB,
    Power_Control_B = 0xCF,
    Positive_Gamma_Correction = 0xE0,
    Negative_Gamma_Correction = 0XE1,
    Driver_Timing_Control_A = 0xE8,
    Driver_Timing_Control_B = 0xEA,
    Power_On_Sequence = 0xED,
    Enable_3G = 0xF2,
    Pump_Ratio_Control = 0xF7,
    Power_Control_6 = 0xFC,
};

[Flags]
private enum St7735Orientation
{
    MADCTL_MH = 0x04, // sets the Horizontal Refresh, 0=Left-Right and 1=Right-Left
    MADCTL_ML = 0x10, // sets the Vertical Refresh, 0=Top-Bottom and 1=Bottom-Top
    MADCTL_MV = 0x20, // sets the Row/Column Swap, 0=Normal and 1=Swapped
    MADCTL_MX = 0x40, // sets the Column Order, 0=Left-Right and 1=Right-Left
    MADCTL_MY = 0x80, // sets the Row Order, 0=Top-Bottom and 1=Bottom-Top

    MADCTL_BGR = 0x08 // Blue-Green-Red pixel order
};

构建驱动程序的方法如下

// This is your SPI configuration
var displaySpiConfig = new SpiConfiguration(
    1,
    ChipSelect,
    DataCommand,
    Reset,
    -1);

// Here we create the driver
GraphicDriver graphicDriver = new GraphicDriver()
{
    MemoryWrite = 0x2C,
    SetColumnAddress = 0x2A,
    SetRowAddress = 0x2B,
    InitializationSequence = new byte[]
    {
        (byte)GraphicDriverCommandType.Command, 1, (byte)St7735.SOFTWARE_RESET,
        // Sleep for 50 ms
        (byte)GraphicDriverCommandType.Sleep, 5,
        (byte)GraphicDriverCommandType.Command, 1, (byte)St7735.Sleep_Out,
        // Sleep for 500 ms
        (byte)GraphicDriverCommandType.Sleep, 50,
        (byte)GraphicDriverCommandType.Command, 4, (byte)St7735.Frame_Rate_Control_Normal, 0x01, 0x2C, 0x2D,
        (byte)GraphicDriverCommandType.Command, 4, (byte)St7735.Frame_Rate_Control_2, 0x01, 0x2C, 0x2D,
        (byte)GraphicDriverCommandType.Command, 7, (byte)St7735.Frame_Rate_Control_3, 0x01, 0x2C, 0x2D, 0x01, 0x2C, 0x2D,
        (byte)GraphicDriverCommandType.Command, 2, (byte)St7735.Invert_On, 0x07,
        (byte)GraphicDriverCommandType.Command, 1, (byte)St7735.Invertion_On,
        // 0x55 -> 16 bit
        (byte)GraphicDriverCommandType.Command, 2, (byte)St7735.Pixel_Format_Set, 0x55,
        (byte)GraphicDriverCommandType.Command, 4, (byte)St7735.Power_Control_1, 0xA2, 0x02, 0x84,
        (byte)GraphicDriverCommandType.Command, 2, (byte)St7735.Power_Control_2, 0xC5,
        (byte)GraphicDriverCommandType.Command, 3, (byte)St7735.Power_Control_3, 0x0A, 0x00,
        (byte)GraphicDriverCommandType.Command, 3, (byte)St7735.Power_Control_4, 0x8A, 0x2A,
        (byte)GraphicDriverCommandType.Command, 3, (byte)St7735.Power_Control_5, 0x8A, 0xEE,
        (byte)GraphicDriverCommandType.Command, 4, (byte)St7735.VCOM_Control_1, 0x0E, 0xFF, 0xFF,
        (byte)GraphicDriverCommandType.Command, 17, (byte)St7735.Positive_Gamma_Correction, 0x02, 0x1c, 0x7, 0x12, 0x37, 0x32, 0x29, 0x2d, 0x29, 0x25, 0x2B, 0x39, 0x00, 0x01, 0x03, 0x10,
        (byte)GraphicDriverCommandType.Command, 17, (byte)St7735.Negative_Gamma_Correction, 0x03, 0x1d, 0x07, 0x06, 0x2E, 0x2C, 0x29, 0x2D, 0x2E, 0x2E, 0x37, 0x3F, 0x00, 0x00, 0x02, 0x1,
        (byte)GraphicDriverCommandType.Command, 1, (byte)St7735.Sleep_Out,
        (byte)GraphicDriverCommandType.Command, 1, (byte)St7735.Display_ON,
        // Sleep 100 ms
        (byte)GraphicDriverCommandType.Sleep, 10,
        (byte)GraphicDriverCommandType.Command, 1, (byte)St7735.NOP,
        // Sleep 20 ms
        (byte)GraphicDriverCommandType.Sleep, 2,
    },
    OrientationLandscape = new byte[]
    {
        (byte)GraphicDriverCommandType.Command, 2, (byte)St7735.Memory_Access_Control, (byte)(St7735Orientation.MADCTL_MY | St7735Orientation.MADCTL_MX | St7735Orientation.MADCTL_BGR),
    },
    PowerModeNormal = new byte[]
    {
        (byte)GraphicDriverCommandType.Command, 3, (byte)St7735.POWER_STATE, 0x00, 0x00,
    },
    PowerModeSleep = new byte[]
    {
        (byte)GraphicDriverCommandType.Command, 3, (byte)St7735.POWER_STATE, 0x00, 0x01,
    },
    DefaultOrientation = DisplayOrientation.Landscape,
    Brightness = (byte)St7735.Write_Display_Brightness,
};

// And the screen configuration:
var screenConfig = new ScreenConfiguration(
    26,
    1,
    80,
    160,
    graphicDriver);

// And finally initialize the driver and the screen
var init = DisplayControl.Initialize(
    displaySpiConfig,
    screenConfig,
    1024);

请注意,初始化命令是必需的。其余的命令不是必需的。现在,一些可能对良好使用您的驱动程序很有用。

所有命令都遵循相同的规则

  • (byte)GraphicDriverCommandType.Command, N, n0, n1, nN-1
  • (byte)GraphicDriverCommandType.Sleep, T

其中N是要作为命令发送的字节数,即n0始终是命令,然后是n1到nN-1的字节。

同样可以在需要的地方插入睡眠时间,其中T代表10毫秒的集合。所以要等待50毫秒,T必须为5。

驱动程序的可用性

对于不同的屏幕,有不同驱动程序的nuget包。每个nuget包的名称为nanoFramework.Graphics.DriverName,其中DriverName是驱动程序的名称。例如St7735。这些nuget包含了驱动程序和所有nanoFramework.Graphics库。

使用方法相当简单

var displaySpiConfig = new SpiConfiguration(1, ChipSelect, DataCommand, Reset, -1);

// Get the predefined driver
GraphicDriver graphicDriver = St7735.GraphicDriver;

// You can adjust anything here for example:
graphicDriver.OrientationLandscape180 = new byte[]
{
    ((byte)GraphicDriverCommandType.Command, 2, (byte)St7735Reg.Memory_Access_Control, (byte)(St7735Orientation.MADCTL_MX | St7735Orientation.MADCTL_BGR),
};

var screenConfig = new ScreenConfiguration(26, 1, 80, 160, graphicDriver);

var init = DisplayControl.Initialize(displaySpiConfig, screenConfig, 1024);

当有可用时,首选原生的实现。如果您没有重建自己的图像的能力或者您想调整原生驱动程序,则使用通用实现。

通用驱动程序也是测试和实施新驱动程序的绝佳方式。不需要每次都重新构建镜像,只要调整您的托管代码即可。

通用显示驱动程序的局限性

主要的局限性是与所有这些SPI驱动程序的工作方式有关,这种工作方式使用命令及其后随的确切相同行为来闪存一个缓冲区。如果您的驱动程序不遵循此模式,可能会有问题。

有可能添加更多行为,如直接闪存缓冲区或调整事物的处理方式。请打开问题或提供PR来改进所有这些。

反馈和文档

有关文档、提供反馈、问题以及如何贡献,请参阅Home repo

加入我们的Discord社区此处

致谢

此项目的贡献者名单可在CONTRIBUTORS中找到。

许可证

nanoFramework类库受MIT许可的许可。

行为准则

本项目采用了由贡献者协议定义的行为准则,以阐明我们社区中的预期行为。有关更多信息,请参阅.NET Foundation 行为准则

.NET Foundation

本项目的支持来自.NET Foundation

产品 兼容和额外的计算目标框架版本。
.NET Framework net 兼容。
兼容目标框架(们)
包含的目标框架(们)(在包中)
了解有关目标框架.NET Standard的更多信息。

NuGet包

此包没有被任何NuGet包使用。

GitHub仓库

此包没有被任何流行的GitHub仓库使用。

版本 下载 最后更新
1.2.15 84 6/26/2024
1.2.10 87 5/13/2024
1.2.4 257 11/9/2023
1.2.2 104 11/9/2023
1.1.37 186 5/10/2023
1.1.34 135 5/5/2023
1.1.32 124 5/5/2023
1.1.30 136 5/5/2023
1.1.28 134 5/4/2023
1.1.25 179 4/18/2023
1.1.23 206 3/15/2023