tag 标签: 驱动SSD1306

相关博文
  • 热度 1
    2024-10-18 07:33
    323 次阅读|
    0 个评论
    以下是驱动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); // 产生停止信号 } ```