星允派F103·

星允派(nebula pi) OLED

173163102

173163102

43 0

认识一下什么是OLED,和IIC通信,资料来自网络,只参考学习。 一、OLED 技术详解

  1. OLED 核心特性 OLED(Organic Light-Emitting Diode,有机发光二极管)是一种自发光显示技术,具有以下显著优势:

自发光:无需背光源,黑色显示纯正,对比度极高(可达100,000:1以上)。 结构轻薄:厚度仅为LCD的1/3,可实现柔性曲面设计。 视角广:接近180°无色偏,适合多角度观看场景。 响应快:响应时间低于0.01ms,动态画面无拖影。 环境适应性强:工作温度范围广(-40℃至85℃),适合工业/户外应用。 低功耗:显示黑色时像素完全关闭,功耗仅为LCD的30%-50%。

  1. 与LCD的技术对比 特性 OLED LCD 背光需求 自发光,无需背光板 依赖背光,黑色显示发灰 厚度 ≤1mm(柔性基板) ≥3mm(含背光层) 对比度 ∞:1(理论值) 1,000:13,000:1 响应时间 <0.01ms 116ms(TN屏最快) 制程复杂度 5-7层(简化版) 12-15层(含偏光片/滤光片)
  2. 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,需确认规格书)
  3. 接口选择建议 SPI接口: 优势:理论带宽达10Mbps(4线模式),适合高速刷新(如动画显示) 局限:需占用4个GPIO引脚 I²C接口: 优势:仅需2根线,节省IO资源 局限:标准模式400kbps,高速模式1Mbps(实际帧率约30FPS)

二、I²C通信协议深度解析

  1. 协议基础架构 物理层:开漏结构(需外接上拉电阻,典型值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
  2. 关键信号时序 信号类型 时序要求 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++]);
        }
    }
}

显示效果

显示图形

相关文章

优先推荐同专题、同标签和同作者内容,补足热门文章。

评论 0

登录 后参与评论

评论

成为第一个评论的人