以下是驱动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); // 产生停止信号
}
```
|