本帖最后由 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)
|