#有奖活动# #申请原创# #技术资源# #申请开发板#
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显示功能。
|