使用的1.3寸OLED是I2C接口的对外有四个引脚,分别是VCC、GND、SCL、SDL。
首先看一下运行的效果图:

成功在小屏幕上显示“你好”。
首先,我们需要配置好STM32的I2C外设,和GPIO的模式。
PB6—>SCL
PB7—>SDA
GPIO口配置为开漏输出模式。

void GPIO_Config()
{GPIO_InitTypeDef GPIO_STRUCT;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_STRUCT.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_STRUCT.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_STRUCT.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_STRUCT);
}void IIC_Config()
{I2C_InitTypeDef I2C_STRUCT;RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);I2C_DeInit(I2C1);I2C_STRUCT.I2C_Mode = I2C_Mode_I2C;I2C_STRUCT.I2C_DutyCycle = I2C_DutyCycle_2;I2C_STRUCT.I2C_OwnAddress1 = 0x90;I2C_STRUCT.I2C_Ack = I2C_Ack_Enable;I2C_STRUCT.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_STRUCT.I2C_ClockSpeed =400000 ;I2C_Init(I2C1,&I2C_STRUCT);I2C_Cmd(I2C1,ENABLE);}```
I2C的配置:
I2C_Mode:配置I2C的工作模式为I2C。
I2C_DutyCycle:配置时钟线的占空比,这里配置占空比为2:1.
I2C_OwnAddress1:peizhi STM32的I2C设备自己的地址。
I2C_Ack:接收应答,每接收到一个字节就返回一个应答。
I2C_AcknowledgedAddress:选择I2C的寻址模式,这个根据连接的设备来进行选择。
I2C_ClockSpeed:设置I2C的传输速率,最大不得高于400kHz。
配置好以后使能I2C外设。配置完成以后我们就要使用I2C来驱动OLED进行显示了。
第一步我们需要构建一个发送的最小单元,什么意思呢?就是定义一个函数,这个函数主要用来进行命令和数据的发送。为什么要这个样子呢?因为I2C在通信时过程比较繁琐,如果每次发送数据或者命令都要来配置一下的话,代码量会大大增加,并且程序的结构性也会被破坏,不利于阅读。

void WriteByte(uint8_t addr,uint8_t data)
{
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1,ENABLE);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,0x78,I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));I2C_SendData(I2C1,addr);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1,data);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_GenerateSTOP(I2C1,ENABLE);

}’’’

这个就是发送的最小单元,在这里面接收两个参数,一个是地址,一个是数据。
内部实现的流程如下:
1、利用while循环判断I2C总线是否处于繁忙状态。
2、产生一个开始信号
3,、等待I2C_EVENT_MASTER_MODE_SELECT
4、发送目标设备的地址,也就是OLED屏幕的地址。
5,、等待事件I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED
6、发送地址
7、等待事件I2C_EVENT_MASTER_BYTE_TRANSMITTED
8、发送数据
9、等待事件I2C_EVENT_MASTER_BYTE_TRANSMITTED
10、产生一个停止信号。

到此我们的最小发送单元配置完成。当我们再次发送命令和数据时不需要再这么复杂的敲写代码,直接调用该函数即可。
以下为发送命令和发送数据的封装函数:

void Write_Cmd(unsigned char command)
{WriteByte(0x00,command);
}void Write_Dat(unsigned char data)
{WriteByte(0x40,data);
}

工欲善其事必先利其器,上面我们已经将如何发送数据写好了,下面我们就直接使用上面的函数来进行初始化等就可以了。
OLED屏幕的初始化:

void OLED_Init(void)
{int i = 10000;while(i--);//这个延时是必要的,没有使用定时器,就简单的写了个延时Write_Cmd(0xae);//开显示Write_Cmd(0x20);//设置内存寻址模式Write_Cmd(0x10);//00水平寻址01垂直10页面寻址Write_Cmd(0xb0);//为页面寻址模式设置页面开始地址0-7Write_Cmd(0xc8);//设置COM输出扫描方向Write_Cmd(0x00);//设置低列地址Write_Cmd(0x10);//设置高列地址Write_Cmd(0x40);//设置起始行地址Write_Cmd(0x81);//以下的使用的就去查找手册看一下吧!Write_Cmd(0xff);Write_Cmd(0xa1);Write_Cmd(0xa6);Write_Cmd(0xa8);Write_Cmd(0x3f);Write_Cmd(0xa4);Write_Cmd(0xd3);Write_Cmd(0x00);Write_Cmd(0xd5);Write_Cmd(0xf0);Write_Cmd(0xd9);Write_Cmd(0x22);Write_Cmd(0xda);Write_Cmd(0x12);Write_Cmd(0xdb);Write_Cmd(0x20);Write_Cmd(0x8d);Write_Cmd(0x14);Write_Cmd(0xaf);
}

初始完成,我们先来看一下OLED的屏幕的各个像素地址:
OLED的分别率是128x64.即是有128X64个像素点。所有的像素按照行分为8页,按列分为8段,每段里面有8行16列。


通常像素原点为左上角的(0,0)像素点,我们设置图像时,通常按照坐标来进行设置,但是我们设置的像素坐标需要转换为对应的地址。

void OLED_SetPos(unsigned char x,unsigned char y)
{Write_Cmd(0xb0+y);Write_Cmd(((x&0xf0)>>4)|0x10);Write_Cmd((x&0x0f)|0x01);
}

剩余的代码如下:

void OLED_Fill(unsigned char fill_data)
{unsigned char m,n;for(m = 0;m < 8;m++){Write_Cmd(0xb0+m);Write_Cmd(0x00);Write_Cmd(0x10);for(n = 0;n < 130;n++){Write_Dat(fill_data);}}}void OLED_CLS(void)
{OLED_Fill(0x00);
}void OLED_ON(void)
{Write_Cmd(0x8d);Write_Cmd(0x14);Write_Cmd(0xaf);
}void OLED_OFF(void)
{Write_Cmd(0x8d);Write_Cmd(0x10);Write_Cmd(0xae);
}

其中Write_Dat(0xf0);在屏幕上的像素分布如下:

0
0
0
0
1
1
1
1

所以在利用取模工具时,需要注意高低位的情况。

STM32利用库函数驱动OLED相关推荐

  1. STM32硬件SPI驱动OLED

    文章目录 一.OLED相关 1.OLED简介 2.0.96寸的OLED模块概述 3.模块引脚说明 4.汉字点阵编码原理 二.硬件SPI 1.SPI简介 2.SPI的引脚映射关系 三.SPI驱动的OLE ...

  2. 12. STM32——硬件IIC驱动OLED屏幕显示

    STM32--硬件IIC驱动OLED屏幕显示 OLED屏幕 OLED屏幕特点 OLED屏幕接线说明 OLED屏幕显存 OLED屏幕原理 OLED屏幕常用指令 OLED屏幕字模软件的使用 写命令 写数据 ...

  3. STM32利用STM32CubeMX驱动SDRAM

    STM32利用STM32CubeMX驱动SDRAM 本次发布FMC总线驱动SDRAM的博客,为下次发布LTDC外设驱动RGB屏的博客做准备.利用STM32CubeMX和HAL库,生成的工程代码具有很强 ...

  4. 15. STM32——软件IIC驱动OLED屏幕显示字符、字符串、数字、汉字

    STM32--软件IIC驱动OLED屏幕显示 OLED屏幕 写命令 写内容 对OLED写入一个字节 设置光标 启动OLED 关闭OLED 全屏填充(清屏) 显示字符 显示字符串 获取次方 显示数字 显 ...

  5. STM32模拟IIC驱动OLED屏 原理+源码

    处理器和芯片间的通信可以形象的比喻成两个人讲话:1.你说的别人得能听懂:双方约定信号的协议.2.你的语速别人得能接受:双方满足时序要求. 一.IIC总线的信号类型 1.开始信号:处理器让SCL时钟保持 ...

  6. X、合宙Air模块Luat开发:全网首发,通过iic直接驱动OLED,720Sl开始有显时代

    目录 点击这里查看所有博文   本系列博客,理论上适用于合宙的Air202.Air268.Air720x.Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持).   先不管支不支 ...

  7. STM32通过SPI协议驱动OLED屏

    坚持就是胜利 一.SPI协议介绍 01 简介 02 SPI物理层 03 SPI基本通讯过程 二.OLED显示器介绍 01 简介 02 接口定义 03 与STM32接线图 三.汉字取模软件介绍 01 下 ...

  8. K_A28_004 基于STM32等单片机驱动SI4432对发SI4432实现数据传输 OLED显示

    K_A28_004 基于STM32等单片机驱动SI4432对发SI4432实现数据传输 OLED显示 所有资源导航 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 时序: 对应程序: 四.部 ...

  9. STM32 4SPI模式点OLED(SSD1306驱动)屏

    参考资料 STM32学习笔记之OLED屏 OLED显示模块(原理讲解.STM32实例操作) 正点原子OLED教学视频 #####占坑待编辑##### SPI使用逻辑分析仪抓的波形分析:[此模块没有CS ...

最新文章

  1. (C++)1026 程序运行时间
  2. 高并发第八弹:J.U.C起航(java.util.concurrent)
  3. ktt算法 约化_推荐系统的多目标优化(4)-PE-LTR
  4. eclipse中Android模拟器常见的问题解决方法汇总
  5. jenkins 使用xctool 爆出: line 6: xctool: command not found
  6. 解决:Intellij idea 启动项目报错 error:java: 无效的源发行版: 8
  7. 20180110小测
  8. asp.net网站后台退出后,点后退按钮仍能进,如何安全退出
  9. 8、饼图(ax.pie)
  10. vue中先加载数据后加载页面
  11. ICCAP2016如何调用ads的仿真器hpeesofsim
  12. 用VB实现的QQ自动登录器
  13. 揭秘沃尔玛、腾讯、京东、浙商银行的供应链管理方案
  14. 企业青睐什么样的产品经理
  15. Shell脚本速查手册
  16. electron使用下载监听接口(will-download)出现不触发done
  17. BLE-1の蓝牙4.0协议栈概览
  18. CMS和G1的对比分析
  19. 关于facebook登录出现的问题
  20. Mac 与 Linux Windows 常见使用区别

热门文章

  1. 《大数据》2021年第5期目次摘要
  2. 大数据场景中语言虚拟机的应用和挑战
  3. 【软件工程】设计原则与设计模式
  4. 学生分组(洛谷P1109题题解,C++语言描述)
  5. MySQL组提交(group commit)
  6. 清楚浮动的方法和原理
  7. AE 中的查找与定位,以城市查找为例
  8. Laravel 学习路线【4】控制器
  9. webpack实用配置
  10. 03Linux用户和组及权限