研究了一下午OLED了,大致搞懂原理了,但还有一堆指令没理解什么意思,今天就写了一点最基本的程序,剩下的后面再搞吧,太懒了。
OLED代码的思路基本都来自江协科技,后面的代码应该也差不多。有想学习OLED模块的兄弟们,强烈推荐去B站上看一下江协科技视频。然后有时间再去看一下SSD1306的数据手册。
uint8_t OLED_DisplayBuf[8][128];//建立缓存数组
/*以 R/W# 为例,#代表低有效,因此表示低电平W,高电平R*/
void OLED_W_Command(uint8_t Command)
{
IIC_Start();
IIC_SendByte(0x78);//发送从机地址,设置写(011110+SA0+R/W#)
IIC_RecAck();
IIC_SendByte(0x00);//设置写命令,连续模式开启(Co(0代表开启连续模式)+D/C#(D表示数据,C表示命令)+000000)
IIC_RecAck();
IIC_SendByte(Command);//发送命令
IIC_RecAck();
IIC_Stop();
}
//由于每发送一个图案都需要发送大量的数据,因此在发送数据函数中加入了Count.此外,由于字模是通过数组储存,因此Data使用指针传递。
void OLED_W_Data(uint8_t *Data,uint8_t Count)
{
uint8_t i;
IIC_Start();
IIC_SendByte(0x78);//发送从机地址,设置写(011110+SA0+R/W#)
IIC_RecAck();
IIC_SendByte(0x40);//设置写数据,连续模式开启(Co(0代表开启连续模式)+D/C#(D表示数据,C表示命令)+000000)
IIC_RecAck();
for (i=0;i<Count;i++)
{
IIC_SendByte(Data[i]);//发送数据
IIC_RecAck();
}
IIC_Stop();
}
void OLED_Init(void)
{
/*此初始化配置,来自数据手册推荐配置*/
OLED_W_Command(0xAE); //设置显示开启/关闭,0xAE关闭,0xAF开启
OLED_W_Command(0xD5); //设置显示时钟分频比/振荡器频率
OLED_W_Command(0x80); //0x00~0xFF
OLED_W_Command(0xA8); //设置多路复用率
OLED_W_Command(0x3F); //0x0E~0x3F
OLED_W_Command(0xD3); //设置显示偏移
OLED_W_Command(0x00); //0x00~0x7F
OLED_W_Command(0x40); //设置显示开始行,0x40~0x7F
OLED_W_Command(0xA1); //设置左右方向,0xA1正常,0xA0左右反置
OLED_W_Command(0xC8); //设置上下方向,0xC8正常,0xC0上下反置
OLED_W_Command(0xDA); //设置COM引脚硬件配置
OLED_W_Command(0x12);
OLED_W_Command(0x81); //设置对比度
OLED_W_Command(0xCF); //0x00~0xFF
OLED_W_Command(0xD9); //设置预充电周期
OLED_W_Command(0xF1);
OLED_W_Command(0xDB); //设置VCOMH取消选择级别
OLED_W_Command(0x30);
OLED_W_Command(0xA4); //设置整个显示打开/关闭
OLED_W_Command(0xA6); //设置正常/反色显示,0xA6正常,0xA7反色
OLED_W_Command(0x8D); //设置充电泵
OLED_W_Command(0x14);
OLED_W_Command(0xAF); //开启显示
}