[AT32M412] 【AT-START-M412测评】+ssd1315丝滑点屏

[复制链接]
 楼主| liukong 发表于 2025-6-24 00:06 | 显示全部楼层 |阅读模式
#有奖活动# #申请原创# #技术资源# #申请开发板#
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初始化序列
  1. void OLED_Init(void)
  2. {
  3.   uint8_t i, j;
  4.   
  5.   delay_ms(200);  // 延时等待OLED上电完成
  6.   
  7.   /* SSD1315专用初始化序列 */
  8.   OLED_SendCmd(0xAE); // 关闭显示
  9.   
  10.   OLED_SendCmd(0xD5); // 设置显示时钟分频比/振荡器频率
  11.   OLED_SendCmd(0x80); // 默认值

  12.   OLED_SendCmd(0xA8); // 设置多路复用率
  13.   OLED_SendCmd(0x3F); // 默认值 0x3F (1/64 duty)

  14.   OLED_SendCmd(0xD3); // 设置显示偏移
  15.   OLED_SendCmd(0x00); // 无偏移

  16.   OLED_SendCmd(0x40); // 设置显示开始行 [5:0]
  17.   
  18.   OLED_SendCmd(0x8D); // 电荷泵设置
  19.   OLED_SendCmd(0x14); // 启用电荷泵
  20.   
  21.   OLED_SendCmd(0xA1); // 设置段重映射 (column address 127映射到SEG0)
  22.   
  23.   OLED_SendCmd(0xC8); // 设置COM输出扫描方向 (COM[N-1] to COM0)
  24.   
  25.   OLED_SendCmd(0xDA); // 设置COM引脚硬件配置
  26.   OLED_SendCmd(0x12); // 连续COM引脚配置,禁用左右重映射
  27.   
  28.   OLED_SendCmd(0x81); // 设置对比度控制
  29.   OLED_SendCmd(0xFF); // 最大对比度
  30.   
  31.   OLED_SendCmd(0xD9); // 设置预充电周期
  32.   OLED_SendCmd(0xF1); // Phase 1 period = 1, Phase 2 period = 15
  33.   
  34.   OLED_SendCmd(0xDB); // 设置VCOMH解选择电平
  35.   OLED_SendCmd(0x30); // 0.83 x VCC
  36.   
  37.   OLED_SendCmd(0xA4); // 全显示模式关闭
  38.   
  39.   OLED_SendCmd(0xA6); // 设置正常/反转显示: 0xA6正常, 0xA7反转
  40.   
  41.   OLED_SendCmd(0x20); // 设定寻址模式
  42.   OLED_SendCmd(0x00); // 水平寻址模式
  43.   
  44.   OLED_SendCmd(0xAF); // 开启显示
  45. }

2. I2C通信函数
  1. void OLED_SendCmd(uint8_t cmd)
  2. {
  3.   uint8_t buffer[2];
  4.   i2c_status_type status;
  5.   uint8_t retry = 0;
  6.   
  7.   buffer[0] = 0x00;  // 控制字节: 0x00表示写命令
  8.   buffer[1] = cmd;
  9.   
  10.   // 尝试多次发送,增强可靠性
  11.   while(retry < 3)
  12.   {
  13.     status = i2c_master_transmit(&hi2cx, OLED_ADDRESS, buffer, 2, I2C_TIMEOUT);
  14.     if(status == I2C_OK)
  15.     {
  16.       break;
  17.     }
  18.    
  19.     retry++;
  20.     delay_ms(5);
  21.   }
  22. }

  23. void OLED_SendData(uint8_t data)
  24. {
  25.   uint8_t buffer[2];
  26.   i2c_status_type status;
  27.   uint8_t retry = 0;
  28.   
  29.   buffer[0] = 0x40;  // 控制字节: 0x40表示写数据
  30.   buffer[1] = data;
  31.   
  32.   // 尝试多次发送,增强可靠性
  33.   while(retry < 3)
  34.   {
  35.     status = i2c_master_transmit(&hi2cx, OLED_ADDRESS, buffer, 2, I2C_TIMEOUT);
  36.     if(status == I2C_OK)
  37.     {
  38.       break;
  39.     }
  40.    
  41.     retry++;
  42.     delay_ms(5);
  43.   }
  44. }


3. 显示控制函数
  1. // 设置OLED显示位置
  2. void OLED_SetPosition(uint8_t x, uint8_t y)
  3. {
  4.   OLED_SendCmd(0xB0 + y);                  // 设置页地址
  5.   OLED_SendCmd(((x & 0xF0) >> 4) | 0x10);  // 设置列地址高4位
  6.   OLED_SendCmd(x & 0x0F);                  // 设置列地址低4位
  7. }

  8. // 清屏
  9. void OLED_Clear(void)
  10. {
  11.   uint8_t i, j;
  12.   for(i = 0; i < 8; i++)
  13.   {
  14.     OLED_SetPosition(0, i);
  15.     for(j = 0; j < 128; j++)
  16.     {
  17.       OLED_SendData(0x00);
  18.     }
  19.   }
  20. }

  21. // 显示字符串
  22. void OLED_ShowString(uint8_t x, uint8_t y, const char *str, uint8_t size)
  23. {
  24.   uint8_t j = 0;
  25.   while(str[j] != '\0')
  26.   {
  27.     OLED_ShowChar(x, y, str[j], size);
  28.     x += 8;
  29.     if(x > 120)
  30.     {
  31.       x = 0;
  32.       y += 2;
  33.     }
  34.     j++;
  35.   }
  36. }

4. 主程序调用
  1. int main(void)
  2. {
  3.   /* 系统初始化 */
  4.   system_clock_config();
  5.   nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  6.   at32_board_init();

  7.   /* 初始化I2C */
  8.   hi2cx.i2cx = I2Cx_PORT;
  9.   i2c_config(&hi2cx);
  10.   
  11.   /* 延时等待OLED上电稳定 */
  12.   delay_ms(500);
  13.   
  14.   /* 初始化SSD1315 OLED显示屏 */
  15.   OLED_Init();
  16.   
  17.   /* 显示测试内容 */
  18.   OLED_Clear();
  19.   OLED_ShowString(16, 0, "SSD1315 Test", 16);
  20.   OLED_ShowString(16, 2, "ABCD", 16);
  21.   OLED_ShowString(16, 4, "TEST", 16);
  22.   
  23.   while(1)
  24.   {
  25.     /* 交替闪烁LED,表示程序在运行 */
  26.     at32_led_toggle(LED2);
  27.     at32_led_toggle(LED3);
  28.     delay_ms(500);
  29.   }
  30. }

实现要点
I2C通信优化:
使用低速I2C时钟(10KHz)确保稳定通信
实现通信重试机制,提高可靠性
支持清屏、填充等基本操作
注意事项
首次使用建议先进行全屏点亮测试,确认基本功能
此驱动代码经过优化,可直接应用于AT32M412/AT32M416系列MCU,实现OLED显示功能。
image_189.png

communication_poll.zip

2.64 MB, 下载次数: 3

HarmonySage 发表于 2025-7-11 22:12 | 显示全部楼层
代码不错,最后要是来一张动图展示一下效果就更nice了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

29

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部