STM32使用IIC协议驱动0.96寸OLED屏

这篇具有很好参考价值的文章主要介绍了STM32使用IIC协议驱动0.96寸OLED屏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

IIC是常用的协议之一,它通过不同的地址来区分设备,并且端口需要是开漏模式,并且需要接上拉电阻

STM32使用IIC协议驱动0.96寸OLED屏

 要使用IIC驱动OLED,首先要配置IIC

void I2C_Configuration(void)
{
	I2C_InitTypeDef I2C_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	I2C_InitStructure.I2C_ClockSpeed = 100000;  
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddress1 = 0x22;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; 
	I2C_Init(I2C1,&I2C_InitStructure);
	I2C_Cmd(I2C1, ENABLE);
	
}

然后编写写入函数

void OLED_CMD(unsigned char cmd)
{
		I2C_GenerateSTART(I2C1, ENABLE);
		while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);
	
		I2C_Send7bitAddress(I2C1, 0x78, I2C_Direction_Transmitter);
		while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR);
		
		I2C_SendData(I2C1,0x00);
		while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR);
	
		I2C_SendData(I2C1,cmd);
		while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR);
	
		I2C_GenerateSTOP(I2C1, ENABLE);
		
}

void OLED_DATA(unsigned char dat)
{
		I2C_GenerateSTART(I2C1, ENABLE);
		while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);
	
		I2C_Send7bitAddress(I2C1, 0x78, I2C_Direction_Transmitter);
		while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR);
		
		I2C_SendData(I2C1,0x40);
		while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR);
	
		I2C_SendData(I2C1,dat);
		while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR);
	
		I2C_GenerateSTOP(I2C1, ENABLE);
}

ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)为判断事件的函数

有以下多种事件

//从机发送地址匹配
I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED           : EV1
//从机接受地址匹配
I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED              : EV1

//从机发送第二次地址匹配
I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED     : EV1
//从机接收第二次地址匹配
I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED        : EV1

//从机通用呼叫地址匹配
I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED            : EV1

//从机字节接收
I2C_EVENT_SLAVE_BYTE_RECEIVED                         : EV2

(I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF)      : EV2
(I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL)    : EV2

//从机字节发送
I2C_EVENT_SLAVE_BYTE_TRANSMITTED                      : EV3
(I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF)   : EV3
(I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL) : EV3

//从机应答
I2C_EVENT_SLAVE_ACK_FAILURE                           : EV3_2

//从机停止位
I2C_EVENT_SLAVE_STOP_DETECTED                         : EV4

//主机模式选择
I2C_EVENT_MASTER_MODE_SELECT                          : EV5

//主机发送模式选择
I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED            : EV6 

//主机接收模式选择
I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED               : EV6

//主机字节接收
I2C_EVENT_MASTER_BYTE_RECEIVED                        : EV7

//主机字节发送中
I2C_EVENT_MASTER_BYTE_TRANSMITTING                    : EV8

//主机字节发送结束
I2C_EVENT_MASTER_BYTE_TRANSMITTED                     : EV8_2

//主机10位地址模式
I2C_EVENT_MASTER_MODE_ADDRESS10                       : EV9

OLED初始化

void OLED_init(void)
{
	OLED_CMD(0xAE);//--display off                关显示
	
	OLED_CMD(0x00);//---set low column address    设置在哪里开始写GDDRAM在某个地方开始读的内容
	OLED_CMD(0x10);//---set high column address
	OLED_CMD(0x40);//--set display start address  从GDDRAM的某个地方开始读,显示在所设置的开始高低列地址中
	OLED_CMD(0xB0);//--set page address           页地址模式,选择开始地址
	
  OLED_CMD(0x81); // contract control           进入对比度设置模式
	OLED_CMD(0xFF);//--256                        输入对比度数值范围是0x00-0xFF
	
	OLED_CMD(0xA1);//set segment remap            列地址127被映射到SEG0,可以利用该命令实现整体图片正反转(0xA0-0xA1),带显示屏30pin管脚的那边的左边为列地址0
	
	OLED_CMD(0xA6);//--normal / reverse           正相显示(0xA7为反相显示)
	
	OLED_CMD(0xA8);//--set multiplex ratio(16 to 64) 设置多路复用比率
	OLED_CMD(0x3F);//--1/64 duty占空比(最大屏幕利用率)
	
	OLED_CMD(0xC8);//Com scan direction           Com扫描方向,可理解为行地址映射,0xC8为从行地址63到0显示,0xC0为从行地址0到63显示,带显示屏30pin管脚的那边为行地址0
	
	OLED_CMD(0xD3);//-set display offset          设置显示偏移
	OLED_CMD(0x00);//                             行偏移
	
	OLED_CMD(0xD5);//set osc division             设置内部振荡器
	OLED_CMD(0x80);//                             Fosc通过高四位修改,值越大频率越高,低四位通过外部SCL获得频率然后分频获得显示时钟频率(慢,不常用,设置为0)默认为0x80
	
	OLED_CMD(0xD8);//set area color mode off      
	OLED_CMD(0x05);//
	
	OLED_CMD(0xD9);//Set Pre-Charge Period        预充电时间设置
	OLED_CMD(0xF1);//                             
	
	OLED_CMD(0xDA);//set com pin configuartion    设置引脚配置
	OLED_CMD(0x12);//
	
	OLED_CMD(0xDB);//set Vcomh                    设置引脚电压等级
	OLED_CMD(0x30);//
	
	OLED_CMD(0x8D);//set charge pump enable       将电荷泵设置为启用
	OLED_CMD(0x14);//                             0x14为打开使能,0x10为关闭使能
	
	OLED_CMD(0xAF);//--turn on oled panel         开显示
}

STM32使用IIC协议驱动0.96寸OLED屏

上图分别为(起始位-数据-结束位)(起始位-数据-应答位-结束位)两种帧类型,本文采用的是(起始位-数据-结束位)这种类型。若使用(起始位-数据-应答位-结束位),则可以在应答位后面继续写数据。

IIC通信时每个字节位宽为8位,数据先传送最高位,后传送最低位

STM32使用IIC协议驱动0.96寸OLED屏

(起始位-数据-应答位-数据-应答位-数据-应答位-……数据-应答位-结束位)文章来源地址https://www.toymoban.com/news/detail-436453.html

到了这里,关于STM32使用IIC协议驱动0.96寸OLED屏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】 硬件IIC 驱动SSD1306(0.96 OLED模块) -- 1/4 库函数 学习

    经过了对于STM32的学习,但是大多数时候都还是以移植别人的历程然后修修改改为主。为了更好的巩固自己的学习能力。 所以此篇文章将会以记录我个人学习 硬件IIC 为案例,学习驱动IIC总线设备的能力。 1.《STM32F10x-中文参考手册》 2.《SSD1306芯片手册》 《STM32F10x-中文参考手

    2024年02月01日
    浏览(44)
  • stm32使用模拟IIC控制四针0.96寸OLED

    STM32系列模拟IIC控制0.96寸OLED方法 首先说为什么要采用模拟IIC来控制OLED,采用STM32系列单片机硬件IIC时有可能出现程序死掉的情况,我遇到的情况是与程序while的使用有关(听说原因很随机)。这个时候我们可以采用两个GPIO来模拟IIC通信控制OLED屏幕。顺带说一下OLED的使用原理

    2024年02月14日
    浏览(60)
  • 0.96OLED 4针IIC STM32-HAL库版本(附源码)

    OLED源码放在文章末,有需要自己下滑取用即可。关于如何移植到自己定义的引脚上也做了说明。 另外,本人在代码中封装了一个OLED显示的接口,方便开发者对字符显示位置的快速定位,以及像C语言printf()函数一样在屏幕上进行int,float,char等变量的格式化输出。非常方便实用

    2023年04月26日
    浏览(102)
  • STM32F103模拟IIC控制4针0.96寸OLED显示屏

    OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为

    2023年04月24日
    浏览(54)
  • STM32F103硬件IIC控制4针0.96寸OLED显示屏

    OLED使用的0.96寸四针屏幕,以下直接看实际操作。 使用PCtoLCD2002软件提取OLED字模。 注意红色方框的选项内容,不要选错了,选错会导致烧录程序后无法显示。 此为硬件IIC,如果使用过我的模拟IIC控制程序可直接看 void OLED_Write_Command(unsigned char IIC_Command); void OLED_Write_Data(unsig

    2024年02月02日
    浏览(51)
  • 0.96OLED STM32 SPI驱动(一)

    闲来无聊,翻出了一个OLED,本来想串流做个小显示器用,感觉难度太大。将就变成了下面这 个样子,姑且叫火柴人大乱斗之OLED。 火柴人之OLED 分两步走,先驱动OLED能显示一副图片,本篇讲述此内容。 第二步显示动画,放在下一篇中讲。 查资料得到此OLED为SPI通信,SCL对应连

    2024年02月06日
    浏览(53)
  • STM32配合CubeMX硬件SPI驱动0.96寸OLED

    目录 一、简单介绍 1.1 OLED 1.2 SPI协议 接口 优点 缺点 数据传输 二、实战 2.1 工程配置 2.2 测试工程 2.3 波形分析 三、驱动OLED 3.1 初始化代码 3.2 清屏函数 3.3 设置坐标函数 3.4 显示字符函数 3.5 显示字符串函数 3.6 显示图片函数 附录 驱动代码文件 oled.c oled.h f6x8.h 1.1 OLED 有机发

    2024年02月02日
    浏览(39)
  • STM32配合cubeMX硬件I2C驱动0.96寸OLED

    目录 一、简单介绍 1.1   OLED 1.2   I2C协议 二、实战 2.1 工程配置 2.2 测试工程 2.3 波形分析 三、驱动OLED 3.1 初始化代码 3.2 清屏函数 3.3 设置坐标函数 3.4 显示字符函数 3.5 显示字符串函数 3.6 显示图片函数 附录 驱动代码文件 oled.c oled.h f6x8.h 有机发光二极管 (英语:Organic

    2024年02月08日
    浏览(64)
  • stm32实现0.96oled图片显示,菜单功能

    本期内容,我们将学习0.96寸oled的进阶使用,展示图片,实现菜单切换等功能,关于oled的基础内容,这里我不做介绍,大家可以学习 : 夜深人静学32系列17——OLED ,里面讲述了oled的基本知识并实现了一个简单页面的编写。 这个菜单一共有三个等级, 一级菜单:原神启动界

    2024年02月03日
    浏览(131)
  • 0.96寸 4针OLED屏模块功能实现(STM32)

            0.96寸4针OLED屏模块是一种显示屏模块,它包括一个0.96英寸的OLED显示屏和4个引脚。这种OLED屏幕模块通常用于嵌入式系统和小型电子设备中,可以显示文本、图像和其他类型的信息。由于其小尺寸和低功耗,它们也常用于智能手表、健康追踪器和其他便携式设备中

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包