0.96寸OLED的使用

最近有个项目需要使用到OLED,用惯了大屏,将OLED模块拿在手里还是有点不习惯的。没用过,只能找资料开始研究使用。
OLED即有机发光二极管。OLED由于同时具备自发光,不需要背光源,对比度高,厚度薄,视角广,反应速度快,可用于挠曲性面板,使用用温度范围广,构造及制程比较简单等特性,被认为是下一代平面显示器的新兴应用技术。0.96寸OLED模块采用SSD1306为驱动芯片,并集成在OLED面板中,像素为128*64.通讯方式为IIC/SPI,地址可选:0X78,0X7A。在模块的后方通过电阻可选。我手里的这款是IIC接口,模块支持上电自复位,功耗低,自发光,自由视角。电压输入范围3.3V-5V. OLED由于成本原因现在主要用在小型设备中,如手环。
模块使用SSD1306芯片为核心,该芯片支持通过BS0,BS1,BS2来配置通讯接口,支持IIC,3-wire SPI,4-wire SPI,8bit6868,8bit-8080接口。由于我手里的模块是IIC接口,以下都是围绕IIC通讯展开,但是堆OLED的控制并没有不同。所有的通讯方式都是通过发送相同的命令来对OLED进行相同的操作。

**通讯协议**
模块采用IIC通讯协议。先实现IIC功能,为了有更好的移植性,而且本次使用的是STM32F103系列,我用IO口来模拟IIC。
起始与停止协议:
![IIC](https://img-blog.csdnimg.cn/053e9b5eab044ccb9f42b124c7720dcd.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAY2hpbmFob3VsaWFucGk=,size_19,color_FFFFFF,t_70,g_se,x_16#pic_center)

void IIC_Start()
{
SDA = 1;
SCL = 1;
delay_us(1);
SDA = 1; //在SCL高电平器件拉低SDA
delay_us(1);
SCL = 0;//钳住IIC,开始工作
}
void IIC_Stop()
{
SDA = 0;
SCL = 1;
delay_us(1);
SDA = 1; //SCL高电平期间将SDA拉高停止IIC
delay_us(1);
}
根据IIC协议规定,IIC设备接收到数据后,在第九个时钟发送应答信号。SSD1306会将SDA拉低来发送ACK信号。MCU以此来检测SSD1306是否接收到数据。
ACK

u8 IIC_WaitAck(void)
{
u8 otc = 0;
SCL = 0;
SDA = 1;
delay_us(2);
SCL = 1;
while(SDA == 1)
{
otc++;
if(otc > 240)
{
IIC_Stop();
ret = 1;
return 0;// 未收到ACK
}
}
SCL = 0;
return 1; //收到ACK
}

IIC数据有效性:
IIC规定在时钟信号SCL高电平期间,数据线电平SDA保持不变。SCL低电平期间SDA才可以发生变化。而且IIC的数据是先发送最高位,接收也是先接收最高位。
data
void IIC_SendByte(u8 dat)
{
u8 i;
SCL = 0;
for(i=0;i<8;i++)
{
SDA = (dat&0x80)>>7;
delay_us(2);
SCL = 1;
delay_us(2);
dat <<= 1;
}
}

实现了IIC的协议,接下来就是对OLED的操作了。对OLED的数据写入操作如下:
IIC write Data
以上的操作可以分为几步:1、发送开始信号;2、发送OLED的地址(第8位为1表示读,0表示写);4、等待应答;5、发送控制字节();6、等待应答;7、发送数据/命令;8、等待应答; 参考OLED技术手册可知,控制字节为0x00时表示接下来写入的是命令;为0x40时表示接下来写入的是数据。我手里的OLED模块地址默认为0X78。

void OLED_Write_Data(u8 dat)
{
IIC_Start();
IIC_SendByte(0x78);
if(IIC_WaitAck())
goto stop;

IIC_SendByte(0X40);//接下来发送的是数据
if(IIC_WaitAck())
	goto stop;

IIC_SendByte(dat);
if(IIC_WaitAck())
goto stop;

stop:
IIC_Stop();
}
发送命令:
void OLED_Write_Cmd(u8 cmd)
{
IIC_Start();
IIC_SendByte(0x78);
if(IIC_WaitAck())
goto stop;

IIC_SendByte(0X00);//接下来发送的是命令
if(IIC_WaitAck())
	goto stop;

IIC_SendByte(dat);
if(IIC_WaitAck())
goto stop;

stop:
IIC_Stop();
}
接下来对函数进行封装来简化函数:
如果cmd>0表示发送的是命令,=0表示发送的是数据。
void OLED_Write(u8 dat,u8 cmd)
{
if(cmd)
OLED_Write_Data(dat);
else
OLED_Write_Cmd(cmd);
}

一切准备就绪,就可以可以使用OLED了。OLED的使用必须先对其进行一系列的设置后才能正常使用。
OLEDINIT
其他的功能函数:
在这里插入图片描述
好了,整理了那么长时间还是没有整理完,先到这里。其它的下篇继续写。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chinahoulianpi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值