一步步学习0.96寸七针OLED显示屏SPI接口驱动(附移植代码)--基于STM32

1 简单介绍和引脚说明

在这里插入图片描述
拿到手的OLED不会用, 有程序看不懂, 怎么办? 从引脚开始看起. 如果你知道引脚都是干嘛的, 自然就能看懂驱动代码.
先来看一下引脚说明:

GND VCC D0 D1 RES DC CS
电源地 电源正(3~5.5V) SPI 时钟管脚 SPI 数据管脚 复位管脚 数据和命令控制管脚 片选管脚

很显然, GNDVCC接供电电源,没电一切免谈.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 查看本文章

写的不够详细不够深入, 后续有更好的理解再继续补充.

发布了4 篇原创文章 · 获赞 7 · 访问量 384

猜你喜欢

转载自blog.csdn.net/weixin_40134414/article/details/105308234