一、OLED是什么?
0.96寸OLED是一种小尺寸的有机发光二极管(OLED)显示屏,它具有以下特点和优势:
1.尺寸和分辨率:0.96寸指的是该显示屏的对角线尺寸,通常为0.96英寸。它通常具有128x64像素的分辨率,能够提供相对较高的图像显示清晰度。
2.自发光:OLED屏幕是一种自发光技术,每个像素都是由一个独立的有机发光二极管组成。这意味着每个像素可以独立发光,不需要背光源,因此具有更高的对比度和更真实的颜色表现。
3.薄型设计:OLED屏幕非常薄,由于其无需背光源和液晶层,使得整个显示屏模块具有较低的厚度和重量,非常适合在小型设备中使用。
4.高亮度和广视角:OLED屏幕具有高亮度和广视角特性。它可以在不同观看角度下提供一致的显示效果,并且在室内和室外环境下都能够提供良好的可读性。
5.低功耗:相对于传统的液晶显示屏,OLED屏幕在显示黑色时,不需要额外的能量消耗,因为黑色像素可以完全关闭。这使得OLED屏幕在显示大量黑色内容时能够节省能源。
二、OLED使用步骤
1.硬件
1.1 引脚说明:
1 | GND | 电源地 |
---|---|---|
2 | VCC | 电源正(3~5.5V) |
3 | SCL | OLED 的 D0 脚,在 IIC 通信中为时钟管脚 |
4 | SDA | OLED 的 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的应用不单单显示这些,甚至可以显示动画,对单片机的内存相对要求更大,难度也相对更高,感兴趣的可以研究下,今天的内容就到这里了,感谢你的观看,谢谢!