打印
[APM32F4]

利用APM32F4 DAL库驱动OLED(SSD1306)显示屏

[复制链接]
507|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 kai迪皮 于 2024-10-9 15:14 编辑

1 前言

OLED(有机发光二极管)显示器因其高对比度、广视角和低功耗而在许多应用中广受欢迎。

它的应用场景有:
1.  智能手表和可穿戴设备:
    a.  OLED屏幕因其自发光特性,能够提供高对比度和丰富的色彩,这在较小的智能手表屏幕上尤为重要。其轻薄和低功耗特点也使其成为可穿戴设备的理想选择。
    b.  效果:显示时间、健康数据(如心率、步数)、通知等。

2.  消费类电子产品:
    a.  包括智能手机、MP3播放器、数码相机等,这些设备常使用OLED屏幕来显示图形用户界面和多媒体内容。
    b.  效果:提供更鲜艳的色彩、更广的视角以及更快的响应时间。

3.  工业和医疗设备:
    a.  在需要长时间显示和节能的环境中,OLED屏幕被用于显示设备状态、参数和警报信息。
    b.  效果:清晰可读的数值、图表和状态指示。

4.  智能家居设备:
    a.  包括温控器、门铃、智能音箱等,通过OLED显示相关信息。
    b.  效果:简单、直观的用户界面显示温度、时间、天气信息。

在本文中,我们将讨论如何使用APM32F4的DAL库驱动一个0.96寸I2C接口的OLED显示屏,该屏幕使用SSD1306作为控制芯片。

2 I2C协议介绍

I2C(Inter-Integrated Circuit)是一种常用的接口协议,用于微控制器与外围设备之间的通信。I2C协议的特点包括:

1.  双线通信:仅需两根线(SDA数据线和SCL时钟线)即可实现数据传输。

2.  多主多从架构:支持多个主设备和从设备,主设备通过地址选择与哪个从设备进行通信。

3.  同步通信:通过时钟线实现同步数据传输。

I2C的通信过程包括起始条件(START)、从设备地址传输、数据传输以及停止条件(STOP)。这些操作分别由主设备控制,适合短距离和低速数据传输。

3 0.96寸的OLED屏幕

0.96寸的OLED屏幕通常分辨率为128x64像素,本文选择的0.96寸的OLED屏幕主控是SSD1306,支持I2C和SPI等多种接口。

3.1 SSD1306

SSD1306是一种常用的OLED(有机发光二极管)显示控制器,广泛应用于小尺寸单色显示屏。

SSD1306的特点

1.  接口支持:SSD1306支持I2C、SPI和并行接口,适应多种微控制器的通信需求。

2.  分辨率:常用于128x64或128x32像素的单色OLED显示屏,提供丰富的显示内容。

3.  内置显示内存:集成GRAM(显示内存),用户可以直接写入数据控制显示。

4.  低功耗:OLED技术和高效设计使其功耗低,非常适合电池供电设备。

5.  电路集成:内置电荷泵电路,软件可控,提供OLED所需的电压。

6.  显示模式:支持正常和反色显示模式,可通过命令灵活切换。

3.2 使用SSD1306的基本步骤

1.  SSD1306驱动OLED的流程,初始化:通过一系列命令设置显示模式、扫描方向和对比度等参数。

    1.  初始化OLED屏幕

    2.  初始化过程通过一系列命令设置显示模式、时钟分频、显示偏移等参数。核心步骤包括:

    3.  复位OLED:确保屏幕处于初始状态。

    4.  关闭显示:防止初始化过程中的干扰。

    5.  设置内存寻址模式:一般设置为水平寻址模式。

    6.  配置显示方向和偏移:调整显示输出的扫描方向。

    7.  设置对比度和显示模式:通常调整为全白或全黑显示以测试屏幕效果。

    8.  开启显示:完成初始化后开启显示。

2.  写入数据:将图形或文字数据写入SSD1306的显示内存。

3.  更新显示:在更改显示内容后,需更新屏幕以反映新数据。

4 SSD1306驱动代码

我们的代码框架:DAL(I2C驱动)→写命令、写数据→初始化OLED→显示内容。



下面的代码参考:[https://github.com/afiskon/stm32-ssd1306](https://github.com/afiskon/stm32-ssd1306)

4.1 ssd1306_WriteCommand()和ssd1306_WriteData()

写命令与数据:通过I2C接口,使用ssd1306_WriteCommand()和ssd1306_WriteData()函数分别发送命令和数据。
// Send a byte to the command register
void ssd1306_WriteCommand(uint8_t byte) {
    if(DAL_OK != DAL_I2C_Mem_Write(&SSD1306_I2C_PORT, SSD1306_I2C_ADDR, 0x00, 1, &byte, 1, DAL_MAX_DELAY)){
        ssd1306_ErrorHandler();
    }
}

// Send data
void ssd1306_WriteData(uint8_t* buffer, size_t buff_size) {
    if(DAL_OK != DAL_I2C_Mem_Write(&SSD1306_I2C_PORT, SSD1306_I2C_ADDR, 0x40, 1, buffer, buff_size, DAL_MAX_DELAY)){
        ssd1306_ErrorHandler();
    }
}

这两个函数被调用的情况如下。

ssd1306_WriteCommand:



ssd1306_WriteData:



4.2 更新显示

更新屏幕:调用ssd1306_UpdateScreen()将缓冲区数据写入OLED。

/* Write the screenbuffer with changed to the screen */
void ssd1306_UpdateScreen(void) {
    // Write data to each page of RAM. Number of pages
    // depends on the screen height:
    //
    //  * 32px   ==  4 pages
    //  * 64px   ==  8 pages
    //  * 128px  ==  16 pages
    for(uint8_t i = 0; i < SSD1306_HEIGHT/8; i++) {
        ssd1306_WriteCommand(0xB0 + i); // Set the current RAM page address.
        ssd1306_WriteCommand(0x00 + SSD1306_X_OFFSET_LOWER);
        ssd1306_WriteCommand(0x10 + SSD1306_X_OFFSET_UPPER);
        ssd1306_WriteData(&SSD1306_Buffer[SSD1306_WIDTH*i],SSD1306_WIDTH);
    }
}


该函数被调用的情况如下。



4.3 初始化OLED

初始化 SSD1306 OLED 显示屏的一般流程如下:

1.  `ssd1306_Reset();`:重置 OLED 显示屏。

2.  `HAL_Delay(100);`:等待 100 毫秒以便显示屏启动。

3.  `ssd1306_SetDisplayOn(0);`:关闭显示屏。

4.  `ssd1306_WriteCommand(0x20); ssd1306_WriteCommand(0x00);`:设置内存寻址模式为水平寻址模式。

5.  `ssd1306_WriteCommand(0xB0);`:在页面寻址模式下设置页面起始地址为 0。

6.  `ssd1306_WriteCommand(0xC0);` 或 `ssd1306_WriteCommand(0xC8);`:设置 COM 输出扫描方向,可能会进行垂直镜像。

7.  `ssd1306_WriteCommand(0x00); ssd1306_WriteCommand(0x10);`:设置列地址。

8.  `ssd1306_WriteCommand(0x40);`:设置起始行地址。

9.  `ssd1306_SetContrast(0xFF);`:设置对比度为最大值。

10.  `ssd1306_WriteCommand(0xA0);` 或 `ssd1306_WriteCommand(0xA1);`:设置段重映射,可能会进行水平镜像。

11.  `ssd1306_WriteCommand(0xA7);` 或 `ssd1306_WriteCommand(0xA6);`:设置颜色模式,可能会进行颜色反转。

12.  `ssd1306_WriteCommand(0xFF);` 或 `ssd1306_WriteCommand(0xA8);`:设置多路复用比率。

13.  `ssd1306_WriteCommand(0x1F);`、`ssd1306_WriteCommand(0x3F);` 或 `ssd1306_WriteCommand(0x3F);`:根据显示屏的高度设置 COM 硬件配置。

14.  `ssd1306_WriteCommand(0xA4);`:设置 RAM 内容输出。

15.  `ssd1306_WriteCommand(0xD3); ssd1306_WriteCommand(0x00);`:设置显示偏移为 0。

16.  `ssd1306_WriteCommand(0xD5); ssd1306_WriteCommand(0xF0);`:设置显示时钟分频比和振荡器频率。

17.  `ssd1306_WriteCommand(0xD9); ssd1306_WriteCommand(0x22);`:设置预充电周期。

18.  `ssd1306_WriteCommand(0xDA);`:设置 COM 硬件配置。

19.  `ssd1306_WriteCommand(0xDB); ssd1306_WriteCommand(0x20);`:设置 VCOMH 电压倍率。

20.  `ssd1306_WriteCommand(0x8D); ssd1306_WriteCommand(0x14);`:启用 DC-DC 转换器。

21.  `ssd1306_SetDisplayOn(1);`:打开显示屏。

22.  `ssd1306_Fill(Black);`:清屏。

23.  `ssd1306_UpdateScreen();`:刷新显示屏。

24.  设置当前的 X 和 Y 坐标为 0,并将 `Initialized` 标志设置为 1,表示初始化已完成。

该函数被调用的情况如下。


5 通信过程

5.1 逻辑分析仪抓取

通过逻辑分析仪可以捕捉I2C通信波形,验证数据传输的正确性。软件:KingstVIS([青岛金思特电子有限公司 (qdkingst.com)](https://www.qdkingst.com/cn))

如:

ssd1306_Init:



ssd1306_UpdateScreen:



5.2 使用串口打印

我们也可以连接串口打印初始化流程进行查看。



6 测试效果


这里是代码: APM32F4xx_DAL_SDK_V1.1.1_OLED.zip (2.64 MB)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

212

帖子

11

粉丝