0.96寸OLED(IIC接口)显示屏的图像显示应用


一、OLED是什么?

0.96寸OLED是一种小尺寸的有机发光二极管(OLED)显示屏,它具有以下特点和优势:

1.尺寸和分辨率:0.96寸指的是该显示屏的对角线尺寸,通常为0.96英寸。它通常具有128x64像素的分辨率,能够提供相对较高的图像显示清晰度。

2.自发光:OLED屏幕是一种自发光技术,每个像素都是由一个独立的有机发光二极管组成。这意味着每个像素可以独立发光,不需要背光源,因此具有更高的对比度和更真实的颜色表现。

3.薄型设计:OLED屏幕非常薄,由于其无需背光源和液晶层,使得整个显示屏模块具有较低的厚度和重量,非常适合在小型设备中使用。

4.高亮度和广视角:OLED屏幕具有高亮度和广视角特性。它可以在不同观看角度下提供一致的显示效果,并且在室内和室外环境下都能够提供良好的可读性。

5.低功耗:相对于传统的液晶显示屏,OLED屏幕在显示黑色时,不需要额外的能量消耗,因为黑色像素可以完全关闭。这使得OLED屏幕在显示大量黑色内容时能够节省能源。

在这里插入图片描述

二、OLED使用步骤

1.硬件

1.1 引脚说明:

1GND电源地
2VCC电源正(3~5.5V)
3SCLOLED 的 D0 脚,在 IIC 通信中为时钟管脚
4SDAOLED 的 D1 脚,在 IIC 通信中为数据管脚

1.2 硬件电路:

在这里插入图片描述

2.软件

2.1 初始化配置代码如下(示例):

OLED初始化流程是固定发这些指令的,无需深究,想了解的可以看下SSD1306驱动手册。

/*******************************************************************************
 * 函数名:User_OLED_Init
 * 描述  :OLED初始化
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :
 *******************************************************************************/
void User_OLED_Init(void)
{
    IIC_Init();//IIC引脚初始化	

	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);	//设置左右方向,0xA1正常 0xA0左右反置
	
	OLED_WriteCommand(0xC8);	    //设置上下方向,0xC8正常 0xC0上下反置

	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);  	//开启显示
		
	OLED_Clear();				   //OLED清屏	
}

2.2 OLED写命令代码如下(示例):

/*******************************************************************************
 * 函数名:OLED_WriteCommand
 * 描述  :OLED写命令
 * 输入  :Command 要写入的命令
 * 输出  :void
 * 调用  :
 * 备注  :
 *******************************************************************************/
void OLED_WriteCommand(uint8_t Command)
{
	IIC_Start();
	IIC_Send_Byte(0x78);		//从机地址
	IIC_Send_Byte(0x00);		//写命令
	IIC_Send_Byte(Command); 
	IIC_Stop();
}

2.3 OLED写数据代码如下(示例):

 /*******************************************************************************
 * 函数名:OLED_WriteData
 * 描述  :OLED写数据
 * 输入  :Data 要写入的数据
 * 输出  :void
 * 调用  :
 * 备注  :
 *******************************************************************************/
void OLED_WriteData(uint8_t Data)
{
	IIC_Start();
	IIC_Send_Byte(0x78);		//从机地址
	IIC_Send_Byte(0x40);		//写数据
	IIC_Send_Byte(Data);
	IIC_Stop();
}

2.4 OLED设置光标位置(示例):

/*******************************************************************************
 * 函数名:OLED_SetCursor
 * 描述  :OLED设置光标位置
 * 输入  :Y 以左上角为原点,向下方向的坐标,范围:0~7
           X 以左上角为原点,向右方向的坐标,范围:0~127
 * 输出  :void
 * 调用  :
 * 备注  :
 *******************************************************************************/
void OLED_SetCursor(uint8_t Y, uint8_t X)
{
	OLED_WriteCommand(0xB0 | Y);			//设置Y位置
	OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));	//设置X位置高4位
	OLED_WriteCommand(0x00 | (X & 0x0F));		//设置X位置低4位
}

2.5 OLED清屏(示例):

/*******************************************************************************
 * 函数名:OLED_Clear
 * 描述  :OLED清屏
 * 输入  :void
 * 输出  :void
 * 调用  :
 * 备注  :
 *******************************************************************************/
void OLED_Clear(void)
{  
	uint8_t i, j;
	for (j = 0; j < 8; j++)
	{
		OLED_SetCursor(j, 0);
		for(i = 0; i < 128; i++)
		{
			OLED_WriteData(0x00);
		}
	}
}

2.6 OLED显示一个字符(示例):

/*******************************************************************************
 * 函数名:OLED_ShowChar
 * 描述  :OLED显示一个字符
 * 输入  :Line 行位置,范围:1~4
           Column 列位置,范围:1~16
           Char 要显示的一个字符,范围:ASCII可见字符
 * 输出  :void
 * 调用  :
 * 备注  :
 *******************************************************************************/
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char)
{      	
	uint8_t i;
	OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8);//设置光标位置在上半部分
	for (i = 0; i < 8; i++)
	{
		OLED_WriteData(OLED_F8x16[Char - ' '][i]);//显示上半部分内容
	}
	OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8);	//设置光标位置在下半部分
	for (i = 0; i < 8; i++)
	{
		OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]);	//显示下半部分内容
	}
}

2.7 OLED显示字符串(示例):

/*******************************************************************************
 * 函数名:OLED_ShowString
 * 描述  :OLED显示字符串
 * 输入  :Line 行位置,范围:1~4
           Column 列位置,范围:1~16
           String 要显示的字符串,范围:ASCII可见字符
 * 输出  :void
 * 调用  :
 * 备注  :
 *******************************************************************************/
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i++)
	{
		OLED_ShowChar(Line, Column + i, String[i]);
	}
}

2.8 OLED显示数字(十进制,正数)(示例):

/*******************************************************************************
 * 函数名:OLED_ShowNum
 * 描述  :OLED显示数字(十进制,正数)
 * 输入  :Line 行位置,范围:1~4
           Column 列位置,范围:1~16
           Number 要显示的数字,范围:0~4294967295
           Length 要显示数字的长度,范围:1~10
 * 输出  :void
 * 调用  :
 * 备注  :
 *******************************************************************************/
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i++)							
	{
		OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');
	}
}

2.9 OLED显示数字(十六进制)(示例):

/*******************************************************************************
 * 函数名:OLED_ShowHexNum
 * 描述  :OLED显示数字(十六进制)
 * 输入  :Line 行位置,范围:1~4
           Column 列位置,范围:1~16
           Number 要显示的数字,范围:0~0xFFFFFFFF
           Length 要显示数字的长度,范围:1~8
 * 输出  :void
 * 调用  :
 * 备注  :
 *******************************************************************************/
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
	uint8_t i, SingleNumber;
	for (i = 0; i < Length; i++)							
	{
		SingleNumber = Number / OLED_Pow(16, Length - i - 1) % 16;
		if (SingleNumber < 10)
		{
			OLED_ShowChar(Line, Column + i, SingleNumber + '0');
		}
		else
		{
			OLED_ShowChar(Line, Column + i, SingleNumber - 10 + 'A');
		}
	}
}

2.10 OLED显示数字(二进制,正数)(示例):

/*******************************************************************************
 * 函数名:OLED_ShowBinNum
 * 描述  :OLED显示数字(二进制,正数)
 * 输入  :Line 行位置,范围:1~4
           Column 列位置,范围:1~16
           Number 要显示的数字,范围:0~1111 1111 1111 1111
           Length 要显示数字的长度,范围:1~16
 * 输出  :void
 * 调用  :
 * 备注  :
 *******************************************************************************/
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i++)							
	{
		OLED_ShowChar(Line, Column + i, Number / OLED_Pow(2, Length - i - 1) % 2 + '0');
	}
}

2.11 OLED显示图片(示例):

/*******************************************************************************
 * 函数名:Oled_Show_Image
 * 描述  :OLED显示图片
 * 输入  :*image 图片数组
 * 输出  :void
 * 调用  :
 * 备注  :128*64 BMP图片
 *******************************************************************************/
void Oled_Show_Image(uint8_t *image)
{
	uint8_t i=0; 
	uint16_t j;
	
	for(i=0;i<8;i++){
		OLED_WriteCommand(0xB0 + i);
		OLED_WriteCommand(0x00);
		OLED_WriteCommand(0x10);
		for(j = 128 * i; j<(128 * (i+1));j++){
			OLED_WriteData(image[j]);
		}
	}
}

2.12 OLED_Test(测试显示图片)(示例):

/*******************************************************************************
 * 函数名:OLED_Test
 * 描述  :测试OLED
 * 输入  :void
 * 输出  :void
 * 调用  :
 * 备注  :
 *******************************************************************************/
void OLED_Test(void)
{		
	/*OLED显示*/	
	Oled_Show_Image(xiaobuding);	
}

2.13 测试结果:

在这里插入图片描述

3.取模软件的使用

3.1 打开要取模的图片,设置像素最大128*64

在这里插入图片描述

3.2 图片另存为BMP格式

在这里插入图片描述

3.3 打开PCtoLCD软件

在这里插入图片描述

3.4 在软件里打开BMP图片,根据字模选项进行设置

在这里插入图片描述

3.5 点击右下角生成字模

在这里插入图片描述

3.6 保存字模到TXT文本文档下,选择替换掉{}

在这里插入图片描述

3.7 最后将替换后的数组数据复制到程序里面就可以了


三、 总结

本次的OLED图像的驱动主要来源于中景园电子0.96OLED显示屏驱动参考代码,OLED的应用不单单显示这些,甚至可以显示动画,对单片机的内存相对要求更大,难度也相对更高,感兴趣的可以研究下,今天的内容就到这里了,感谢你的观看,谢谢!

在这里插入图片描述

  • 39
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaobuding_QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值