本文最后更新于20 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
也是终于想起密码了,记录一下OLED模块的驱动编写,方便以后移植用
# OLED显示模块
0.96寸OLED显示屏,一般是SSD1306芯片或SSD1315芯片,只要是这两个芯片就能使用本篇写下的代码。
这块OLED使用的是I2C接口(4根引脚),也有的OLED使用的是SPI接口(7根引脚)
像素为128*64像素
一、引脚接线
本篇遵循易移植的原则,采用软件I2C
STM32 | OLED模块 |
---|---|
3.3V | VCC |
GND | GND |
PB8 | SCL |
PB9 | SDA |
因为采用的是软件I2C,所以IO口选择不是固定的,这里分别使用PB8和PB9连接OLED模块的SCL和SDA
下载厂家给的demo程序测试
二、驱动代码
使用基本的I2C代码,且OLED不使用连续模式。
1、写命令
//写入一个字节命令
void OLED_WriteCommand(uint8_t Command)
{
MyI2C_Start();
MyI2C_SendByte(0x78); //0x78为OLED的ID地址
MyI2C_ReceiveAck();
MyI2C_SendByte(0x00); //非连续模式, 写命令
MyI2C_ReceiveAck();
MyI2C_SendByte(Command); //发送数据
MyI2C_ReceiveAck();
MyI2C_Stop();
}
2、写数据
//写入一个数据
void OLED_WriteData(uint8_t Data)
{
MyI2C_Start();
MyI2C_SendByte(0x78); //0x78为OLED的ID地址
MyI2C_ReceiveAck();
MyI2C_SendByte(0x40); //非连续模式, 写数据
MyI2C_ReceiveAck();
MyI2C_SendByte(Data); //发送数据
MyI2C_ReceiveAck();
MyI2C_Stop();
}
3、OLED初始化
参考流程图:
void OLED_Init(void)
{
MyI2C_Init();
Delay_ms(100);
OLED_WriteCommand(0xAE); //关闭显示
OLED_WriteCommand(0xD5); //设置显示时钟分频比/振荡器频率
OLED_WriteCommand(0x80);
OLED_WriteCommand(0xA8); //设置多路复用比率
OLED_WriteCommand(0x3F);
OLED_WriteCommand(0xD3); //设置显示偏移量
OLED_WriteCommand(0x00);
OLED_WriteCommand(0x40); //设置显示起始行
OLED_WriteCommand(0xA1); //设置段重映射
OLED_WriteCommand(0xC8); //设置COM输出扫描方向
OLED_WriteCommand(0xDA); //设置COM引脚硬件配置
OLED_WriteCommand(0x12);
OLED_WriteCommand(0x81); //设置对比度控制
OLED_WriteCommand(0xCF);
OLED_WriteCommand(0xD9); //设置预充电周期
OLED_WriteCommand(0xF1);
OLED_WriteCommand(0xDB); //设置VCOMH取消选择电平
OLED_WriteCommand(0x30);
OLED_WriteCommand(0xA4); //设置全屏开启/关闭
OLED_WriteCommand(0xA6); //设置正常/反色显示
OLED_WriteCommand(0x8D); //设置电荷泵
OLED_WriteCommand(0x14);
OLED_WriteCommand(0xAF); //开启显示
Delay_ms(100);
}
4、设置显示位置
/**
* @brief 一个设置显示位置的指针
* @param X:0~127
* @param Page:0~7
* @retval None
*/
void OLED_SetPosition(uint8_t X, uint8_t Page)
{
OLED_WriteCommand(0x00 |( X & 0x0F)); //取低四位
OLED_WriteCommand(0x10 |(( X & 0xF0) >> 4)); //取高四位
OLED_WriteCommand(0xB0 | Page);
}
5、清屏
/**
* @brief 清屏函数
* @param None
* @param None
* @retval None
*/
void OLED_Clear(void)
{
for(uint8_t i = 0; i < 8; i++)
{
OLED_SetPosition(0, i);
for(uint8_t j =0; j < 128; j++) OLED_WriteData(0x00);
}
}
待续…