文章目录
1 简单介绍和引脚说明
拿到手的OLED不会用, 有程序看不懂, 怎么办? 从引脚开始看起. 如果你知道引脚都是干嘛的, 自然就能看懂驱动代码.
先来看一下引脚说明:
GND | VCC | D0 | D1 | RES | DC | CS |
---|---|---|---|---|---|---|
电源地 | 电源正(3~5.5V) | SPI 时钟管脚 | SPI 数据管脚 | 复位管脚 | 数据和命令控制管脚 | 片选管脚 |
很显然, GND和VCC接供电电源,没电一切免谈.D0, D1,为SPI接口引脚, 完成数据或者命令的传输, 对于SPI协议不了解的,建议好好学习该协议的相关资料, 毕竟较为常用. CS为片选引脚, 拉低时传输才有效. DC呢,用来选择写数据还是还是写命令. 拉低为写命令, 拉高为写数据. 例如当需要设置对比度, 设置x,y坐标等, 用的是写命令; 当显示像素点时, 用的是写数据. RES为复位引脚,低电平复位,在初始化时拉低一段时间实现复位, 为后续工作做好准备.
2 驱动代码
2.1 初始化
2.1.1 引脚配置
普通引脚即可,全部配置为推挽输出.
2.2 OLED初始化
先复位,
OLED_RST_Set();
delay_ms(100);
OLED_RST_Clr(); //拉低200ms实现复位
delay_ms(200);
OLED_RST_Set();
接下来开始写相关命令(这里主要是配置SSD1306(OLED驱动芯片)的寄存器, 详见对应的数据手册), 摘取部分代码:
OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel(关闭oled面板显示)
OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register(设置对比度控制控制寄存器)
//写0x81命令后,紧接着写入相应数值(0-255),数值越大亮度越大
OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness(0xCF表示亮度大小)
......
最后是开启oled面板, 清除屏幕, 设置坐标为原点
OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
OLED_Clear();
OLED_Set_Pos(0,0);
2.2 功能函数
2.2.1 传输一个Byte的函数
void OLED_WR_Byte(u8 dat,u8 cmd)
{
u8 i;
if(cmd) //cmd为1,拉高DC
OLED_DC_Set();
else //cmd为0,拉低DC
OLED_DC_Clr();
OLED_CS_Clr();//拉低片选信号
for(i=0;i<8;i++)//for循环完成一个字节的传输,每个CLK的上升沿,传输一个bit,参考spi传输时序图
{
OLED_SCLK_Clr();
if(dat&0x80)
OLED_SDIN_Set();
else
OLED_SDIN_Clr();
OLED_SCLK_Set();
dat<<=1;
}
OLED_CS_Set(); //拉高片选信号
OLED_DC_Set(); //拉高DC
}
传输时序图:
2.2.2 显示一个char的函数
void OLED_ShowChar(u8 x,u8 y,u8 chr)
{
unsigned char c=0,i=0;
c=chr-' ';//得到偏移值
if(x>Max_Column-1){x=0;y=y+2;} //x超过最后一列, 换行
if(SIZE ==16)//8*16
{
OLED_Set_Pos(x,y); //设置坐标,其中x为列地址,y为页地址,参考下图分页情况
for(i=0;i<8;i++) //显示8*16点阵的上半部分
OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
OLED_Set_Pos(x,y+1);//光标移到下一页
for(i=0;i<8;i++) //显示8*16点阵的下半部分,参考下图显示示意图
OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
}
else //6*8
{
OLED_Set_Pos(x,y+1);
for(i=0;i<6;i++)
OLED_WR_Byte(F6x8[c][i],OLED_DATA);
}
}
分页情况:
8*16格式的字符显示示意图, 从左到右, 从上到下, 先显示上半部分, 然后光标移至下一页, 继续显示下半部分
其他显示的功能函数, 都是基于字符显示, 有兴趣的自行研究
3 驱动代码链接
https://download.csdn.net/download/weixin_40134414/12302024
扫描二维码关注公众号,回复:
10481213 查看本文章
写的不够详细不够深入, 后续有更好的理解再继续补充.