认识一下什么是OLED,和IIC通信,资料来自网络,只参考学习。 一、OLED 技术详解
- OLED 核心特性 OLED(Organic Light-Emitting Diode,有机发光二极管)是一种自发光显示技术,具有以下显著优势:
自发光:无需背光源,黑色显示纯正,对比度极高(可达100,000:1以上)。 结构轻薄:厚度仅为LCD的1/3,可实现柔性曲面设计。 视角广:接近180°无色偏,适合多角度观看场景。 响应快:响应时间低于0.01ms,动态画面无拖影。 环境适应性强:工作温度范围广(-40℃至85℃),适合工业/户外应用。 低功耗:显示黑色时像素完全关闭,功耗仅为LCD的30%-50%。
- 与LCD的技术对比
特性 OLED LCD
背光需求 自发光,无需背光板 依赖背光,黑色显示发灰
厚度 ≤1mm(柔性基板) ≥3mm(含背光层)
对比度 ∞:1(理论值) 1,000:1
3,000:1 响应时间 <0.01ms 116ms(TN屏最快) 制程复杂度 5-7层(简化版) 12-15层(含偏光片/滤光片) - 0.96英寸OLED模块特性 显示类型:单色(纯蓝)或双色(黄蓝) 物理尺寸:27mm×26mm(显示区15mm×15mm) 分辨率:128×64像素(像素密度106 PPI) 接口支持: 并行接口:6800/8080(8位数据总线) 串行接口:3线/4线SPI(最高10MHz) I²C接口:仅需SDA/SCL两根线(默认地址0x78) 供电要求:3.3V直流输入(部分模块支持5V,需确认规格书)
- 接口选择建议 SPI接口: 优势:理论带宽达10Mbps(4线模式),适合高速刷新(如动画显示) 局限:需占用4个GPIO引脚 I²C接口: 优势:仅需2根线,节省IO资源 局限:标准模式400kbps,高速模式1Mbps(实际帧率约30FPS)
二、I²C通信协议深度解析
- 协议基础架构 物理层:开漏结构(需外接上拉电阻,典型值4.7kΩ) 电气特性: 高电平:≥0.7×VCC(3.3V系统为2.31V) 低电平:≤0.3×VCC(3.3V系统为0.99V) 时序要求: SCL高电平持续时间(T_HDSTA):≥4.7μs(标准模式) SDA建立时间(T_SUDAT):≥250ns
- 关键信号时序 信号类型 时序要求 STM32实现要点 起始条件 SCL高时SDA下降沿 需插入≥4.7μs延时 停止条件 SCL高时SDA上升沿 延时处理同起始条件 应答信号 第9个SCL周期接收方拉低SDA 需检测SDA电平状态
三、CubexMX配置
配置OLED引脚

时钟

四、代码实现与实验效果
GPIO初始
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, OLED_SCL_Pin|LED1_Pin|OLED_SDA_Pin, GPIO_PIN_SET);
/*Configure GPIO pins : K1_Pin K2_Pin */
GPIO_InitStruct.Pin = K1_Pin|K2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PA8 */
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : LED2_Pin */
GPIO_InitStruct.Pin = LED2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED2_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : OLED_SCL_Pin OLED_SDA_Pin */
GPIO_InitStruct.Pin = OLED_SCL_Pin|OLED_SDA_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pin : LED1_Pin */
GPIO_InitStruct.Pin = LED1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}
字条显示
********************************************************************/
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size,u8 flag)
{
u8 CharSize,RowChar,j=0;
if(Char_Size==16)
{
RowChar = 8;
CharSize= 16;
}
else
{
RowChar = 6;
CharSize= 8;
}
while (chr[j]!='\0')
{
OLED_ShowChar(x,y,chr[j],CharSize,flag);
x+=RowChar;
if(x>(120-RowChar))//行尾不足一个字,换行
{
x=0;
y+=2;
}
j++;
}
}
图案显示
void OLED_DrawBMP1(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
{
unsigned int j=0;
unsigned char x,y;
if(y1%8==0)
y = y1/8;
else
y = y1/8 + 1;
for(y=y0;y<y1;y++)
{
OLED_SetPos(x0,y);
for(x=x0;x<x1;x++)
{
Write_IIC_Data(BMP[j++]);
}
}
}
显示效果

显示图形
