目录
一、OLED简介
OLED,即有机发光二极管( Organic Light Emitting Diode )。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示OLED效果要来得好一些。以目前的技术,OLED的尺寸还难以大型化,但是分辨率确可以做到很高。
二、IIC简介
IIC(Inter
-
Integrated Circuit)
总线是一种由
PHILIPS
公司开发的两线式串行总线,用于连接
-
Integrated Circuit)
总线是一种由
PHILIPS
公司开发的两线式串行总线,用于连接
微控制器及其外围设备。它是由数据线
SDA
和时钟
SCL
构成的串行总线,可发送和接收数据。
SDA
和时钟
SCL
构成的串行总线,可发送和接收数据。
在
CPU
与被控
IC
之间、
IC
与
IC
之间进行双向传送,高速
IIC
总线一般可达
400kbps
以上。
CPU
与被控
IC
之间、
IC
与
IC
之间进行双向传送,高速
IIC
总线一般可达
400kbps
以上。
I2C
总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答
总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答
信号。
开始信号:
SCL
为高电平时,
SDA
由高电平向低电平跳变,开始传送数据。
SCL
为高电平时,
SDA
由高电平向低电平跳变,开始传送数据。
结束信号:
SCL
为高电平时,
SDA
由低电平向高电平跳变,结束传送数据。
SCL
为高电平时,
SDA
由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的
IC
在接收到
8bit
数据后,向发送数据的
IC
发出特定的低电平脉冲,
IC
在接收到
8bit
数据后,向发送数据的
IC
发出特定的低电平脉冲,
表示已收到数据。
CPU
向受控单元发出一个信号后,等待受控单元发出一个应答信号,
CPU
接
CPU
向受控单元发出一个信号后,等待受控单元发出一个应答信号,
CPU
接
收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为
受控单元出现故障。
这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。
IIC
总线时序图如
IIC
总线时序图如
图
所示:
所示:
目前大部分
MCU
都带有
IIC
总线接口,
STM32
也不例外。但是这里我们不使用
STM32
MCU
都带有
IIC
总线接口,
STM32
也不例外。但是这里我们不使用
STM32
的硬件
IIC
来读写
24C02
,而是通过软件模拟。
STM32
的硬件
IIC
非常复杂,更重要的是不稳
IIC
来读写
24C02
,而是通过软件模拟。
STM32
的硬件
IIC
非常复杂,更重要的是不稳
定,故不推荐使用。所以我们这里就通过模拟来实现了。有兴趣的读者可以研究一下
STM32 的硬件 IIC
。
。
2.1 IIC接口模块
如图所示:
模块接口定义:
1.GND——电源地
2.VCC——电源正(3.3v-5v)
3.SCL——IIC时钟线
4.SDA——IIC数据线
分辨率:128*64
显示区域:21.744*10.864(mm)
接口类型:IIC接口
管脚数量:4
工作电压:3.5v
视角方向:全方向
控制芯片:SSD1306
工作温度:-40~70
三、代码介绍
oled.c
模拟IIC三种类型信号:开始信号,结束信号,等待应答信号。
根据时序表可以分别写出三种信号的表达方式。
//开始信号
void I2C_Start(void)
{
OLED_SDIN_Set();
OLED_SCLK_Set();
OLED_SDIN_Clr();
OLED_SCLK_Clr();
}
//结束信号
void I2C_Stop(void)
{
OLED_SCLK_Set();
OLED_SDIN_Clr();
OLED_SDIN_Set();
}
//应答信号
void I2C_WaitAck(void) //²âÊý¾ÝÐźŵĵçƽ
{
OLED_SCLK_Set();
OLED_SCLK_Clr();
}
IIC写入一个字节
//写入一个字节
void Send_Byte(u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
OLED_SCLK_Clr();//将时钟信号设置为低电平
if(dat&0x80)//将数据从高8位一次写入
{
OLED_SDIN_Set();
}
else
{
OLED_SDIN_Clr();
}
OLED_SCLK_Set();//将时钟信号设置为高电平
OLED_SCLK_Clr();/将时钟信号设置为低电平
dat<<=1;
}
}
向SSD1306发送一个字节
//mode:数据/命令 0:数据;1:命令;
void OLED_WR_Byte(u8 dat,u8 mode)
{
I2C_Start();
Send_Byte(0x78);
I2C_WaitAck();
if(mode){Send_Byte(0x40);}
else{Send_Byte(0x00);}
I2C_WaitAck();
Send_Byte(dat);
I2C_WaitAck();
I2C_Stop();
}
OLED清屏函数
void OLED_Clear(void)
{
u8 i,n;
for(i=0;i<8;i++)
{
for(n=0;n<128;n++)
{
OLED_GRAM[n][i]=0;//清楚所有数据
}
}
OLED_Refresh();//更新显示
}
显示一个字符串
//显示字符串
//x,y:起点坐标
//size1:字体大小
//*chr:字符串起始地址
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1)
{
while((*chr>=' ')&&(*chr<='~'))//判断是不是非法字符
{
OLED_ShowChar(x,y,*chr,size1);
x+=size1/2;
if(x>128-size1) //换行
{
x=0;
y+=2;
}
chr++;
}
}
显示汉字,字体大小可以调12,16,32,64
//显示汉字
//x,y:起点坐标
//num:汉字对应的序号
//取模方式,列行式
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1)
{
u8 i,m,n=0,temp,chr1;
u8 x0=x,y0=y;
u8 size3=size1/8;
while(size3--)
{
chr1=num*size1/8+n;
n++;
for(i=0;i<size1;i++)
{
if(size1==16)
{temp=Hzk1[chr1][i];}//调用16*16字体
else if(size1==24)
{temp=Hzk2[chr1][i];}//调用24*24字体
else if(size1==32)
{temp=Hzk3[chr1][i];}//调用32*32字体
else if(size1==64)
{temp=Hzk4[chr1][i];}//调用64*64字体
else return;
for(m=0;m<8;m++)
{
if(temp&0x01)OLED_DrawPoint(x,y);
else OLED_ClearPoint(x,y);
temp>>=1;
y++;
}
x++;
if((x-x0)==size1)
{x=x0;y0=y0+8;}
y=y0;
}
}
}
显示一张下图片
//x0,y0起点坐标
//x1,y1终点坐标
//BMP[]要写入的图片数组
void OLED_ShowPicture(u8 x0,u8 y0,u8 x1,u8 y1,u8 BMP[])
{
u32 j=0;
u8 x=0,y=0;
if(y%8==0)y=0;
else y+=1;
for(y=y0;y<y1;y++)
{
OLED_WR_BP(x0,y);
for(x=x0;x<x1;x++)
{
OLED_WR_Byte(BMP[j],OLED_DATA);
j++;
}
}
}
显示结果
主函数,同时显示汉字跟字符
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
#include "led.h"
int main(void)
{
u8 t;
delay_init();
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
OLED_Refresh(); //更新显示到oled
t=' ';
while(1)
{
OLED_ShowChinese(64,0,0,64); //64*64 中
OLED_Refresh();
delay_ms(500);
OLED_Clear();
OLED_ShowString(0,0,"ABC",12);//6*12
OLED_ShowString(0,12,"ABC",16);//8*16
OLED_ShowString(0,28,"ABC",24);//12*24
OLED_Refresh();
delay_ms(500);
}
}
取模方式:
四、完整代码
制作不易,需要完整的工程文件,点赞收藏,评论区留邮箱
版权声明:本文为m0_63171897原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。