| #有奖活动# #申请原创# #技术资源# #申请开发板# SSD1315 OLED显示屏驱动实现(AT32M412/AT32M416)
 核心功能
 本驱动基于I2C通信协议,实现了SSD1315 OLED显示屏的控制,支持ASCII字符、中文显示和图形绘制。
 关键文件
 ssd1315.h/ssd1315.c: OLED驱动核心代码
 font.h/font.c: 字体库,包含ASCII和中文字库
 硬件连接
 SCL: PB6
 SDA: PB7
 VCC: 3.3V
 GND: 地
 核心代码
 1. OLED初始化序列
 
 void OLED_Init(void)
{
  uint8_t i, j;
  
  delay_ms(200);  // 延时等待OLED上电完成
  
  /* SSD1315专用初始化序列 */
  OLED_SendCmd(0xAE); // 关闭显示
  
  OLED_SendCmd(0xD5); // 设置显示时钟分频比/振荡器频率
  OLED_SendCmd(0x80); // 默认值
  OLED_SendCmd(0xA8); // 设置多路复用率
  OLED_SendCmd(0x3F); // 默认值 0x3F (1/64 duty)
  OLED_SendCmd(0xD3); // 设置显示偏移
  OLED_SendCmd(0x00); // 无偏移
  OLED_SendCmd(0x40); // 设置显示开始行 [5:0]
  
  OLED_SendCmd(0x8D); // 电荷泵设置
  OLED_SendCmd(0x14); // 启用电荷泵
  
  OLED_SendCmd(0xA1); // 设置段重映射 (column address 127映射到SEG0)
  
  OLED_SendCmd(0xC8); // 设置COM输出扫描方向 (COM[N-1] to COM0)
  
  OLED_SendCmd(0xDA); // 设置COM引脚硬件配置
  OLED_SendCmd(0x12); // 连续COM引脚配置,禁用左右重映射
  
  OLED_SendCmd(0x81); // 设置对比度控制
  OLED_SendCmd(0xFF); // 最大对比度
  
  OLED_SendCmd(0xD9); // 设置预充电周期
  OLED_SendCmd(0xF1); // Phase 1 period = 1, Phase 2 period = 15
  
  OLED_SendCmd(0xDB); // 设置VCOMH解选择电平
  OLED_SendCmd(0x30); // 0.83 x VCC
  
  OLED_SendCmd(0xA4); // 全显示模式关闭
  
  OLED_SendCmd(0xA6); // 设置正常/反转显示: 0xA6正常, 0xA7反转
  
  OLED_SendCmd(0x20); // 设定寻址模式
  OLED_SendCmd(0x00); // 水平寻址模式
  
  OLED_SendCmd(0xAF); // 开启显示
}
2. I2C通信函数
 
 void OLED_SendCmd(uint8_t cmd)
{
  uint8_t buffer[2];
  i2c_status_type status;
  uint8_t retry = 0;
  
  buffer[0] = 0x00;  // 控制字节: 0x00表示写命令
  buffer[1] = cmd;
  
  // 尝试多次发送,增强可靠性
  while(retry < 3)
  {
    status = i2c_master_transmit(&hi2cx, OLED_ADDRESS, buffer, 2, I2C_TIMEOUT);
    if(status == I2C_OK)
    {
      break;
    }
    
    retry++;
    delay_ms(5);
  }
}
void OLED_SendData(uint8_t data)
{
  uint8_t buffer[2];
  i2c_status_type status;
  uint8_t retry = 0;
  
  buffer[0] = 0x40;  // 控制字节: 0x40表示写数据
  buffer[1] = data;
  
  // 尝试多次发送,增强可靠性
  while(retry < 3)
  {
    status = i2c_master_transmit(&hi2cx, OLED_ADDRESS, buffer, 2, I2C_TIMEOUT);
    if(status == I2C_OK)
    {
      break;
    }
    
    retry++;
    delay_ms(5);
  }
}
 3. 显示控制函数
 
 // 设置OLED显示位置
void OLED_SetPosition(uint8_t x, uint8_t y)
{
  OLED_SendCmd(0xB0 + y);                  // 设置页地址
  OLED_SendCmd(((x & 0xF0) >> 4) | 0x10);  // 设置列地址高4位
  OLED_SendCmd(x & 0x0F);                  // 设置列地址低4位
}
// 清屏
void OLED_Clear(void)
{
  uint8_t i, j;
  for(i = 0; i < 8; i++)
  {
    OLED_SetPosition(0, i);
    for(j = 0; j < 128; j++)
    {
      OLED_SendData(0x00);
    }
  }
}
// 显示字符串
void OLED_ShowString(uint8_t x, uint8_t y, const char *str, uint8_t size)
{
  uint8_t j = 0;
  while(str[j] != '\0')
  {
    OLED_ShowChar(x, y, str[j], size);
    x += 8;
    if(x > 120)
    {
      x = 0;
      y += 2;
    }
    j++;
  }
}
4. 主程序调用
 
 int main(void)
{
  /* 系统初始化 */
  system_clock_config();
  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  at32_board_init();
  /* 初始化I2C */
  hi2cx.i2cx = I2Cx_PORT;
  i2c_config(&hi2cx);
  
  /* 延时等待OLED上电稳定 */
  delay_ms(500);
  
  /* 初始化SSD1315 OLED显示屏 */
  OLED_Init();
  
  /* 显示测试内容 */
  OLED_Clear();
  OLED_ShowString(16, 0, "SSD1315 Test", 16);
  OLED_ShowString(16, 2, "ABCD", 16);
  OLED_ShowString(16, 4, "TEST", 16);
  
  while(1)
  {
    /* 交替闪烁LED,表示程序在运行 */
    at32_led_toggle(LED2);
    at32_led_toggle(LED3);
    delay_ms(500);
  }
}
实现要点
 I2C通信优化:
 使用低速I2C时钟(10KHz)确保稳定通信
 实现通信重试机制,提高可靠性
 支持清屏、填充等基本操作
 注意事项
 首次使用建议先进行全屏点亮测试,确认基本功能
 此驱动代码经过优化,可直接应用于AT32M412/AT32M416系列MCU,实现OLED显示功能。
 
 |