liukong 发表于 2025-6-24 00:06

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

#有奖活动# #申请原创# #技术资源# #申请开发板#
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); // 设置显示开始行

OLED_SendCmd(0x8D); // 电荷泵设置
OLED_SendCmd(0x14); // 启用电荷泵

OLED_SendCmd(0xA1); // 设置段重映射 (column address 127映射到SEG0)

OLED_SendCmd(0xC8); // 设置COM输出扫描方向 (COM 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;
i2c_status_type status;
uint8_t retry = 0;

buffer = 0x00;// 控制字节: 0x00表示写命令
buffer = 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;
i2c_status_type status;
uint8_t retry = 0;

buffer = 0x40;// 控制字节: 0x40表示写数据
buffer = 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 != '\0')
{
    OLED_ShowChar(x, y, str, 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显示功能。

HarmonySage 发表于 2025-7-11 22:12

代码不错,最后要是来一张动图展示一下效果就更nice了
页: [1]
查看完整版本: 【AT-START-M412测评】+ssd1315丝滑点屏