nanoFramework.Graphics 1.2.15

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

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

Quality Gate Status Reliability Rating License NuGet #yourfirstpr Discord

nanoFramework logo


欢迎使用 .NET nanoFramework Graphics 代码库

构建状态

组件 构建状态 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以改进所有这些。

反馈和文档

有关文档、提供反馈、问题和了解如何贡献,请参阅主repo

加入我们的Discord社区这里

致谢

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

许可证

nanoFramework类库在MIT许可证下授权。

行为准则

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

.NET Foundation

本工程由 .NET 基金会 支持。

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

NuGet 包 (8)

显示依赖于 nanoFramework.Graphics 的前 5 个 NuGet 包。

下载
nanoFramework.M5Core2

此包包含 .NET nanoFramework C# 项目使用的 nanoFramework.M5Core2 程序集。

nanoFramework.M5StickC

此包包含 .NET nanoFramework C# 项目使用的 nanoFramework.M5StickC 程序集。

nanoFramework.M5Core

此包包含 .NET nanoFramework C# 项目使用的 nanoFramework.M5Core 程序集。

nanoFramework.M5StickCPlus

此包包含 .NET nanoFramework C# 项目使用的 nanoFramework.M5StickCPlus 程序集。

nanoFramework.Fire

此包包含 .NET nanoFramework C# 项目使用的 nanoFramework.Fire 程序集。

GitHub 存储库 (2)

显示依赖于 nanoFramework.Graphics 的前 2 个最受欢迎的 GitHub 存储库。

存储库 星标
nanoframework/Samples
🍬 来自 nanoFramework 团队用于测试、概念验证和其他探索性尝试的代码示例
nanoframework/nanoFramework.IoT.Device
📦 此存储库包含用于各种传感器、芯片、显示器、帽子和驱动器的 .NET nanoFramework 实现
版本 下载 最后更新
1.2.15 996 6/26/2024
1.2.10 892 5/13/2024
1.2.4 3,911 11/9/2023
1.2.2 125 11/9/2023
1.1.37 4,909 5/10/2023
1.1.34 251 5/5/2023
1.1.32 160 5/5/2023
1.1.30 164 5/5/2023
1.1.28 564 5/4/2023
1.1.25 317 4/18/2023
1.1.23 3,103 3/15/2023
1.1.21 876 3/10/2023
1.1.17 10,392 12/22/2022
1.1.13 13,714 10/11/2022
1.1.10 393 10/11/2022
1.1.8 1,985 10/7/2022
1.1.5 1,937 10/6/2022
1.0.3.6 27,518 7/29/2022
1.0.3.4 11,928 7/6/2022
1.0.3.2 24,930 6/2/2022
1.0.2 47,776 3/28/2022
1.0.2-preview.20 125 3/28/2022
1.0.2-preview.18 169 3/18/2022
1.0.2-preview.16 168 3/14/2022
1.0.2-preview.15 164 3/8/2022
1.0.2-preview.12 286 2/17/2022
1.0.2-preview.11 189 2/4/2022
1.0.2-preview.10 237 1/28/2022
1.0.2-preview.8 144 1/28/2022
1.0.2-preview.7 196 1/25/2022
1.0.2-preview.6 166 1/21/2022
1.0.2-preview.5 135 1/20/2022
1.0.2-preview.3 267 12/28/2021
1.0.1 1,158 12/4/2021
1.0.1-preview.24 145 12/4/2021
1.0.1-preview.22 151 12/3/2021
1.0.1-preview.20 142 12/3/2021
1.0.1-preview.18 144 12/2/2021
1.0.1-preview.16 151 12/2/2021
1.0.1-preview.14 145 12/2/2021
1.0.1-preview.12 148 12/1/2021
1.0.1-preview.11 150 12/1/2021
1.0.1-preview.8 492 10/22/2021
1.0.1-preview.7 215 10/19/2021
1.0.1-preview.5 183 10/17/2021
1.0.0 691 7/16/2021
1.0.0-preview.71 154 7/16/2021
1.0.0-preview.70 167 7/15/2021
1.0.0-preview.69 173 7/14/2021
1.0.0-preview.68 270 6/19/2021
1.0.0-preview.67 163 6/7/2021
1.0.0-preview.66 188 6/7/2021
1.0.0-preview.65 207 6/6/2021
1.0.0-preview.64 190 5/31/2021
1.0.0-preview.63 191 5/31/2021
1.0.0-preview.62 186 5/30/2021
1.0.0-preview.61 162 5/26/2021
1.0.0-preview.60 218 5/21/2021
1.0.0-preview.59 143 5/19/2021
1.0.0-preview.58 183 5/19/2021
1.0.0-preview.57 156 5/15/2021
1.0.0-preview.56 174 5/13/2021
1.0.0-preview.55 182 5/11/2021
1.0.0-preview.54 221 5/6/2021
1.0.0-preview.53 140 5/5/2021
1.0.0-preview.52 144 5/5/2021
1.0.0-preview.47 189 4/10/2021
1.0.0-preview.43 264 3/21/2021
1.0.0-preview.41 313 3/2/2021
1.0.0-preview.38 276 1/6/2021
1.0.0-preview.36 756 12/29/2020
1.0.0-preview.34 169 12/28/2020
1.0.0-preview.32 256 12/22/2020
1.0.0-preview.27 247 12/11/2020
1.0.0-preview.25 260 10/21/2020
1.0.0-preview.23 255 10/21/2020
1.0.0-preview.21 233 10/20/2020
1.0.0-preview.19 306 10/1/2020
1.0.0-preview.17 285 7/2/2020
1.0.0-preview.15 251 7/1/2020
1.0.0-preview.13 288 6/30/2020
1.0.0-preview.11 256 6/16/2020
1.0.0-preview.7 264 6/12/2020
1.0.0-preview.6 237 9/19/2020
1.0.0-preview.5 266 6/12/2020
1.0.0-preview.4 241 9/19/2020
1.0.0-preview.2 250 9/19/2020
1.0.0-preview.1 275 5/23/2020