nanoFramework.Graphics.Ssd1306 1.2.15
前缀已保留
dotnet add package nanoFramework.Graphics.Ssd1306 --version 1.2.15
NuGet\Install-Package nanoFramework.Graphics.Ssd1306 -Version 1.2.15
<PackageReference Include="nanoFramework.Graphics.Ssd1306" Version="1.2.15" />
paket add nanoFramework.Graphics.Ssd1306 --version 1.2.15
#r "nuget: nanoFramework.Graphics.Ssd1306, 1.2.15"
// Install nanoFramework.Graphics.Ssd1306 as a Cake Addin #addin nuget:?package=nanoFramework.Graphics.Ssd1306&version=1.2.15 // Install nanoFramework.Graphics.Ssd1306 as a Cake Tool #tool nuget:?package=nanoFramework.Graphics.Ssd1306&version=1.2.15
欢迎使用 .NET nanoFramework 图形存储库
构建状态
组件 | 构建状态 | NuGet 包 |
---|---|---|
nanoFramework.Graphics |
用法
重要:
- 此库仍在开发中。在开发过程中,可能存在可能会破坏的更改。
- 目前仅实现了 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存储库。
加入我们的Discord社区这里。
致谢
此项目的贡献者列表可以在贡献者中找到。
许可证
nanoFramework类库基于MIT许可证。
行为准则
本项目采用贡献者公约中定义的行为准则,以阐明我们社区中期望的行为。有关更多信息,请参阅.NET Foundation行为准则。
.NET Foundation
本项目由 .NET Foundation 支持。
产品 | 版本 兼容以及附加计算目标框架版本。 |
---|---|
.NET Framework | net 兼容。 |
-
- nanoFramework.CoreLibrary (>= 1.15.5)
- nanoFramework.ResourceManager >= 1.2.13)
- nanoFramework.Runtime.Events >= 1.11.6)
- nanoFramework.Runtime.Native >= 1.6.6)
- nanoFramework.System.Collections >= 1.5.18)
NuGet 包
此包没有被任何 NuGet 包使用。
GitHub 仓库
此包没有被任何流行的 GitHub 仓库使用。