打印
[资料干货]

驱动SSD1306 OLED显示屏的代码,使用的是CH579微控制器的最简基本结构

[复制链接]
568|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
丙丁先生|  楼主 | 2024-10-18 07:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是驱动SSD1306 OLED显示屏的代码,使用的是CH579微控制器的最简基本结构:

```c
#include "oled.h"

// 初始化OLED显示屏
void oled_init(void) {
    // 设置I2C通信参数
    I2C_InitTypeDef I2C_InitStructure;
    I2C_InitStructure.I2C_ClockSpeed = 400000; // 设置I2C时钟频率为400kHz
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; // 设置为I2C模式
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; // 设置占空比为2
    I2C_InitStructure.I2C_OwnAddress1 = 0x00; // 设置自己的地址
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; // 允许应答
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; // 设置被应答地址为7位
    I2C_Init(I2C1, &I2C_InitStructure); // 初始化I2C1

    // 发送初始化命令到OLED显示屏
    oled_send_command(0xAE); // 关闭显示
    oled_send_command(0xD5); // 设置时钟分频因子和振荡器频率
    oled_send_command(0x80); // 设置电荷泵
    oled_send_command(0xA8); // 设置多路复用率
    oled_send_command(0x3F); // 设置显示范围
    oled_send_command(0xD3); // 设置显示偏移
    oled_send_command(0x00); // 不偏移
    oled_send_command(0x40); // 设置显示开始行
    oled_send_command(0x8D); // 设置电荷泵和时钟分频因子
    oled_send_command(0x14); // 设置电荷泵和时钟分频因子的值
    oled_send_command(0x20); // 设置内存地址模式
    oled_send_command(0x00); // 水平地址模式
    oled_send_command(0xA1); // 设置段重映射
    oled_send_command(0xC8); // 设置COM输出扫描方向
    oled_send_command(0xDA); // 设置COM硬件配置
    oled_send_command(0x12); // 设置COM硬件配置的值
    oled_send_command(0x81); // 设置对比度控制
    oled_send_command(0xCF); // 设置对比度控制的值
    oled_send_command(0xD9); // 设置预充电周期
    oled_send_command(0xF1); // 设置预充电周期的值
    oled_send_command(0xDB); // 设置VCOMH电压倍率
    oled_send_command(0x40); // 设置VCOMH电压倍率的值
    oled_send_command(0xA4); // 设置全局显示开启
    oled_send_command(0xA6); // 设置正常显示
    oled_send_command(0xAF); // 打开显示
}

// 向OLED发送命令
void oled_send_command(uint8_t command) {
    I2C_GenerateSTART(I2C1, ENABLE); // 产生I2C起始信号
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // 等待进入主模式
    I2C_Send7bitAddress(I2C1, OLED_ADDRESS, I2C_Direction_Transmitter); // 发送设备地址和写方向
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); // 等待进入发送模式
    I2C_SendData(I2C1, 0x00); // 发送命令字节的高四位(固定为0)
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // 等待发送完成
    I2C_SendData(I2C1, command); // 发送命令字节的低四位
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // 等待发送完成
    I2C_GenerateSTOP(I2C1, ENABLE); // 产生停止信号
}

// 向OLED发送数据
void oled_send_data(uint8_t data) {
    I2C_GenerateSTART(I2C1, ENABLE); // 产生I2C起始信号
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // 等待进入主模式
    I2C_Send7bitAddress(I2C1, OLED_ADDRESS, I2C_Direction_Transmitter); // 发送设备地址和写方向
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); // 等待进入发送模式
    I2C_SendData(I2C1, 0x40); // 发送数据字节的高四位(固定为0100)
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // 等待发送完成
    I2C_SendData(I2C1, data); // 发送数据字节的低四位
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // 等待发送完成
    I2C_GenerateSTOP(I2C1, ENABLE); // 产生停止信号
}
```

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

575

主题

1963

帖子

5

粉丝