最近有个项目需要使用到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是否接收到数据。

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的数据是先发送最高位,接收也是先接收最高位。

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的数据写入操作如下:

以上的操作可以分为几步: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的使用必须先对其进行一系列的设置后才能正常使用。

其他的功能函数:

好了,整理了那么长时间还是没有整理完,先到这里。其它的下篇继续写。

0.96寸OLED的使用相关推荐

  1. 基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)

    简介:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的贪吃蛇小游戏.项目源码地址:点击下载. 硬件设计: 普通摇杆,0.96寸OLED 单色屏幕(SPI协议通讯), ...

  2. 基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释)

    概述:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的俄罗斯方块小游戏.项目源码地址:点击下载. 硬件要求: 普通摇杆,两个电位器和一个开关组成,左右摇动控制一个电 ...

  3. 【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动总结

    目录 SPI版 OLED SPI 端口定义 七针OLED引脚定义 六针OLED引脚定义 软件SPI 硬件SPI 启用DMA 帧率测试 I2C 版 软件I2C 硬件I2C DMA STM32F103VE ...

  4. STM32 —— 中景园0.96寸OLED

    STM32 -- 中景园0.96寸OLED OLED,即有机发光二极管(  Organic Light Emitting Diode ). OLED 由于同时具备自发光,不需背光源.对比度高.厚度薄. ...

  5. STM32读取SM300D2七合一传感器模块数据在0.96寸OLED显示,通过DL-LN3X无线模块显示在上位机

    先看这个: 资料 https://blog.csdn.net/gsh_hello_world/article/details/56277182 https://blog.csdn.net/gsh_he ...

  6. 0.96寸OLED(SSD1306)屏幕显示(三)——屏幕垂直水平滚动

    0.96寸OLED(SSD1306)屏幕显示 (一)基础功能介绍 (二)超长文字水平滚动 (三)屏幕垂直水平滚动 文章目录 一.垂直水平滚动方法 1)SSD1306驱动芯片 2)SSD1315驱动芯片 ...

  7. 1.3双摇杆遥控器电路部分--基本外设电路(ST-link下载、串口、按键、摇杆、电量检测、LED指示灯、0.96寸OLED、NRF24L01)

    目录 一.摘要 二.电路 1.ST-LINK下载接口 2.串口 3.按键 功能按键 唤醒按键 4.摇杆 滑动变阻器摇杆 霍尔摇杆 5.电量检测 6.LED指示灯 7.0.96寸OLED屏 8.NRF2 ...

  8. 0.96寸OLED屏使用详解

    如何理解OLED分辨率? 这里0.96寸OLED分辨率是128*64;即OLED显示是128行*64列; 但是由于OLED不能一次控制一个点阵,只能控制8个点阵;而且是垂直方向扫描控制;如下图;因此垂 ...

  9. STM8驱动0.96寸OLED(12864液晶屏)

    由于中景园电子给出的例程不够全面,因此特地花时间重新整理了一下代码,并加上了其他的功能.本文记录了使用模拟四线 SPI 协议驱动 OLED 的代码. 文章目录 1 oled.h 2 oled.c 2. ...

最新文章

  1. 在CentOS下安装apche+tomcat+mysql+php
  2. linux mail 密码错误,linux下mail使用故障解决
  3. idea autoscroll from source
  4. C#中泛型在Class上的实现
  5. 第二章 API的理解和使用
  6. 如何在Ubuntu上安装最新版本的Node js
  7. Leetcode每日一题:面试题16.19.水域大小
  8. C++中vector的访问和赋值
  9. 用什么软件可以检测苹果耳机芯片_苹果耳机AirPods入耳检测的原理!怎么样判断苹果耳机的真假?...
  10. 中国智能座舱行业发展前景展望与投资战略规划研究报告2022年版
  11. Apache Tomcat漏洞总结
  12. SVN 客户端下载与安装
  13. Sydney 免费wordpress企业主题
  14. AutoJs学习-变声器模板
  15. c#怎么设置winform中dgv的表头边框线
  16. SD卡无法识别怎么办?
  17. iphone计算机要电话,有了这个神器,在PC上也能接听iPhone电话、收发短息啦(安卓也可以哦~)...
  18. 分布式理论-CAP理论
  19. freemaker 前端web教程
  20. DXP_protel2004_原理图设计基础_集成运放原理图设计学习

热门文章

  1. 希尔排序的时间复杂度为什么能小于O(n^2)
  2. 3G杀手应用还是全方位轰炸?
  3. 文墨绘学书法教育领导品牌
  4. java 整数除法(不用*和/以及%)
  5. 二维码超分效果评价指标
  6. 转载分享:Android8.0 连接需要认证的WIFI或不可用的WIFI后自动断开数据流量连接的实现
  7. vue2.0桌面端框架_Element-UI组件库(Vue2.0桌面端组件库)V2.9.2 免费版
  8. Python新手引导 第三篇-Python基础和字符编码
  9. Nakagami分布
  10. 419. 甲板上的战舰