全彩OLED(SSD1351)程序设计与应用(1)驱动的移植

    xiaoxiao2023-10-14  153

    本文开发环境:

    MCU型号:STM32F103ZEIDE环境: MDK 5.27显示模块:1.27寸全彩OLED(SSD1351)驱动

    本文内容:

    SSD1351 驱动的移植与验证附件: - SSD1351 驱动文件 - 工程下载

    OLED 系列博客索引 :

    全彩OLED(SSD1351)程序设计与应用(1)驱动的移植全彩OLED(SSD1351)程序设计与应用(2)显存优化:显存的设计与实现全彩OLED(SSD1351)程序设计与应用(3)字符,字符串以及位图的生成与显示

    文章目录

    一、本文使用OLED模块简介二、参考资料三、驱动的移植1. 移植前的准确1.1 工程准备1.2 功能验证1.3 确定模块与MCU的连接 2. 添加驱动2.1 添加驱动文件2.2 底层函数的适配2.2.1 GPIO口的适配(CS,RES,DC)2.2.2 SPI口的适配(SDL,SCL) 2.3 编译验证 四、OLED 初始化 及其 显示1. OLED 初始化程序2. OLED 显示验证 五、OELD工程的下载和使用附件


    一、本文使用OLED模块简介

    OLED 相对 LCD和TFT显示屏,其显著的特点是贵,特别是全彩,选用全彩OLED是因为家里有矿。本文使用的OLED模块只预留了3线SPI接口,所以只能通过这种方式驱动,如果你使用裸屏,或者是所购模块预留更多的接口,则可以使用其他的通信方式。 模块实物图如下所示: 其中SCL和SDA分别为接入MCU SPI 的 CLK 和 MOSI ,RES,DC,CS只需要接普通的IO口即可。

    二、参考资料

    在移植前,需要对所用 OLED 有一个最基本的了解,建立相关概念才能更好的调试,深圳技新科技提供了OELD的资料及其SS1351的设计指南文档,图文并茂,通俗易懂,读者可前往其官网站自行下载,这里就不再赘述:

    三、驱动的移植

    SSD1351 支持4种接口3-WireSPI、4-WireSPI、6800(8bit)、8080。这里以 3-WireSpi 作为移植驱动的示例。

    1. 移植前的准确

    1.1 工程准备

    本次准备使用 spi 通信的方式来驱动 OLED,所以我们需要准备一个模板工程,这个工程可以使用 spi 发送一个字节(不要求可接收),其中我们还需要通过IO口的高低电平来控制复位(RES),数据/命令(DC)选择脚,使能脚(CS),所以我们还需要 3 个 通用的 GPIO 口,最后是GND和VCC,这是任何模块都需要的,模块和MCU需要共地,本文使用的模块支持3.3V和5V,在使用各种模块之前,需要特别注意VCC接入的电压值。另外,如果你使用51或者是其他没有SPI外设的单片机,可以自己使用软件模拟SPI的时序,总之,只要你能按SPI的数据发送数据即可。 本文使用CubeMx+HAL库的方式来开发MCU,关于GPIO口和SPI的初始化和使用,可以参考一下连接:

    GPIO口配置和使用:STM32CubeMx 初始化和读/写 IO口操作SPI的配置和使用:硬件PSI配置

    1.2 功能验证

    由于所有的操作都是基于SPI和GPIO口,所以移植前需要保证这些功能是可以正常使用的,如果你不够确定,可以使用逻辑分析,示波器等一起,查看是否可以按需求发送出数据。

    1.3 确定模块与MCU的连接

    我们可能使用SPI1,SPI2,甚至软件模拟的SPI,所以首先要确定,模块的SCL和SDA的连接的IO口,接着还需要定义RES,DC,CS的GPIO口,本文使用了STM32F103ZE 和 OLED 模块接线图如下所示:

    STM32F103OLED3.3VVCCGNDGNDPA5SCLPA7SDAPD3CSPD4RESPD5DC

    2. 添加驱动

    ssd1351 的驱动过程其实就是通过通信口发送各种各样的指令,通过指令来设置模块,可以通过阅读芯片数据手册,但是大多数情况官方会提供Demo程序,是我们不需要过多了解初始化的流程,只需要按是使用官方的初始化程序即可。

    2.1 添加驱动文件

    首先在文末附件中下载 SSD1351 的驱动文件,将 ssd1351.c/h 两个文件添加到你的工程中即可。

    2.2 底层函数的适配

    当我没添加驱动文件到工程中后,和你可能会发现一些错误,这是由于我们所使用的的单片机,或者是库不同造成的,所以,你需要做一些底层接口的设配。

    2.2.1 GPIO口的适配(CS,RES,DC)

    在 ssd1351.h 中,定义了 CS,RES,DC的驱动函数,如下图所示:

    #define OLED_CS_Clr() HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET) //CS #define OLED_CS_Set() HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET) #define OLED_RSE_Clr() HAL_GPIO_WritePin(RES_GPIO_Port,RES_Pin,GPIO_PIN_RESET)//RES #define OLED_RSE_Set() HAL_GPIO_WritePin(RES_GPIO_Port,RES_Pin,GPIO_PIN_SET) #define OLED_DC_Clr() HAL_GPIO_WritePin(DC_GPIO_Port,DC_Pin,GPIO_PIN_RESET) //DC #define OLED_DC_Set() HAL_GPIO_WritePin(DC_GPIO_Port,DC_Pin,GPIO_PIN_SET)

    由于本文使用的是HAL库,所以调用HAL_GPIO_WritePin()来控制IO口,如果你使用标准库,或者是其他单片机,或是其他IO口等,你需要对宏定义后面的函数进行改正,总之,当你的程序调用 OLED_CS_Clr()函数的时候, 你要保证OLED上的CS是低电平,而调用OLED_CS_Set()函数的时候,OLED上的CS是高电平,无论你使用何种操作,能达到此效果即可。其他的函数同理。

    2.2.2 SPI口的适配(SDL,SCL)

    接着需要设配SPI接口,本文使用的是STM32F103的SPI接口,查看数据手册可知道,SPI1的SCL和MOSI为PA5和PA7接口,这意味着我使用spi发送数据的时候,数据时钟是从这2个IO库传送出去的,所以OLED的SDA和SCL也要响应的接单片机的这2个引脚。 在程序部分则需要修改Write_Command()和Write_Data()函数,因为其需要调用SPI发送数据,这里需要改成你工程所对应的SPI发送数据的函数即可。

    void Write_Command(unsigned char Data) { OLED_DC_Clr(); uDelay(1); OLED_DC_Clr(); HAL_SPI_Transmit(&hspi1,&Data,1,200); //发送一个SPI数据,需要改成你工程中发送的API函数 OLED_DC_Set(); } void Write_Data(unsigned char Data) { OLED_DC_Clr(); uDelay(1); OLED_DC_Set(); uDelay(1); HAL_SPI_Transmit(&hspi1,&Data,1,200); //发送一个SPI数据,需要改成你工程中发送的API函数 OLED_DC_Set(); }

    2.3 编译验证

    编译过程中很可能出现错误,对于错误的头文件,这通常是其他库的文件,然后添加自己的库头文件。最后通过编译来确定没有未声明函数或语法错误。

    四、OLED 初始化 及其 显示

    1. OLED 初始化程序

    当我们设配好底层的SPI和GPIO口后,就可以直接调用驱动文件体用的API接口来进行OLED的初始化了,其初始化代码如下所示(由于oled的接口函数将会比较多,所以本文创建了oled.c 和 oled.h 来存放相关的代码):

    /* FILE : oled.c*/ #include "ssd1351.h" //包含 ssd1351 驱动头文件 #include "oled.h" /* 构造一个写屏幕像素点的函数,可用户初始化时清屏 */ void Fill_RAM(unsigned char a, unsigned char b) { unsigned char i,j; Set_Column_Address(0x00,0x7F); Set_Row_Address(0x00,0x7F); Set_Write_RAM(); for(i=0;i<128;i++) { for(j=0;j<128;j++) { Write_Data(a); Write_Data(b); } } } void OLED_Init(void) { OLED_RSE_Clr(); Delay(1); OLED_RSE_Set(); Set_Command_Lock(0x12); // Unlock Driver IC (0x12/0x16/0xB0/0xB1) Set_Command_Lock(0xB1); // Unlock All Commands (0x12/0x16/0xB0/0xB1) Set_Display_On_Off(0x00); // Display Off (0x00/0x01) Set_Display_Clock(0xF1); // Set Clock as 90 Frames/Sec Set_Multiplex_Ratio(0x7F); // 1/128 Duty (0x0F~0x7F) Set_Display_Offset(0x00); // Shift Mapping RAM Counter (0x00~0x7F) Set_Start_Line(0x00); // Set Mapping RAM Display Start Line (0x00~0x7F) Set_Remap_Format(0x74); // Set Horizontal Address Increment // Column Address 0 Mapped to SEG0 // Color Sequence D[15:0]=[RRRRR:GGGGGG:BBBBB] // Scan from COM127 to COM0 // Enable COM Split Odd Even // 65,536 Colors Mode (0x74) // * 262,144 Colors Mode (0xB4) Set_GPIO(0x00); // Disable GPIO Pins Input Set_Function_Selection(0x01); // Enable Internal VDD Regulator // Select 8-bit Parallel Interface Set_VSL(0xA0); // Enable External VSL Set_Contrast_Color(0xC8,0x80,0xC8); // Set Contrast of Color A (Red) // Set Contrast of Color B (Green) // Set Contrast of Color C (Blue) Set_Master_Current(Brightness); // Set Scale Factor of Segment Output Current Control Set_Gray_Scale_Table(); // Set Pulse Width for Gray Scale Table Set_Phase_Length(0x32); // Set Phase 1 as 5 Clocks & Phase 2 as 3 Clocks Set_Precharge_Voltage(0x17); // Set Pre-Charge Voltage Level as 0.50*VCC Set_Display_Enhancement(0xA4); // Enhance Display Performance Set_Precharge_Period(0x01); // Set Second Pre-Charge Period as 1 Clock Set_VCOMH(0x05); // Set Common Pins Deselect Voltage Level as 0.82*VCC Set_Display_Mode(0x02); // Normal Display Mode (0x00/0x01/0x02/0x03) Fill_RAM(0x00,0x00); // Clear Screen Set_Display_On_Off(0x01); // Display On (0x00/0x01) }

    这里直接使用官方挺的初始化函数,其中具体配置可参考数据手册(通用可在上文:参考资料中下载)。这里不再赘述每个指令的含义。

    2. OLED 显示验证

    上文构造的 Fill_RAM() 函数可用于函数全屏显示的测试,程序可以通过他的2个参数来控制显示的颜色,如下图所示,在main.c 的 oled.c 函数中添加测试代码:

    /* FILE : oled.c*/ ... ... void OLED_Test(void) { Fill_RAM(0xF0,0x00); HAL_Delay(1500); Fill_RAM(0x0F,0x00); HAL_Delay(1500); Fill_RAM(0xF0,0xF0); HAL_Delay(1500); Fill_RAM(0xF0,0x0F); HAL_Delay(1500); } ... ...

    最后在main()中调用 OLED_Test 来对OLED模块进行测试:

    ... ... OLED_Init(); //初始化 OLED while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ OLED_Test(); //运行测试函数 } ... ...

    运行效果如下所示:

    五、OELD工程的下载和使用

    如果你有合适的硬件,你可以直接在附件中下载本文工程,直接使用OLED,本文为MDK工程,如果你使用其他编译器,也可以实际下载工程已经编译完成的Hex文件直接测试,STM32103 与 OLED模块接线图如下所示:

    STM32F103OLED3.3VVCCGNDGNDPA5SCLPA7SDAPD3CSPD4RESPD5DC

    附件

    百度文网盘载: SSD1351驱动 提取码:grzk

    MDK工程下载 提取码:i55n

    最新回复(0)