stm32f407硬件IIC/I2C驱动OLED屏幕(标准库 | 代码经测试可用)

注:本文仅是记录学习。我也会在下文中分享一下心得。

一,概述

OLED驱动方式有8080、6800、3线/4线SPI以及IIC,能够显示字符、汉字的图片,无字库需通过取模软件获取显示内容数组。本次实验使用的是硬件IIC通信协议,SSD1306驱动芯片的OLED    

二,实验材料

1,0.96寸OLED屏幕(四针IIC驱动)

2,stm32f407vet6主控

3,杜邦线

三,接线

接线说明
stm32f407vet6OLED屏幕
VCCVCC
SCLSCL
SDASDA
GNDGND

四,代码讲解

IO引脚配置

这里使用的stm32f4的IIC2,这里与F1系列不同是F4需要使用GPIO_PinAFConfig函数!

void IIC_init(void)//PB10-->SCL || PB11-->SDA
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);

	GPIO_InitTypeDef IIC1_IO;
	IIC1_IO.GPIO_Mode = GPIO_Mode_AF;
	IIC1_IO.GPIO_PuPd = GPIO_PuPd_NOPULL; 
	IIC1_IO.GPIO_OType = GPIO_OType_OD;
	IIC1_IO.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
	IIC1_IO.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &IIC1_IO);

	GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_I2C2);	//这里就是F1和F4的不同!!!
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_I2C2);
	
	I2C_InitTypeDef IIC1;
	IIC1.I2C_Ack = I2C_Ack_Enable;	//回复应答
	IIC1.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;	//作为从机时,自己的地址位数
	IIC1.I2C_ClockSpeed = 100*1000;	//IIC速率:0-400Khz(限制IIC速率的原因是弱上拉,因为高电平是读取数据,当弱上拉回调不及时则会影响数据的读取)
	IIC1.I2C_DutyCycle = I2C_DutyCycle_2;	//如果上面参数速率在100khz-400khz,则这里要必须要选
	IIC1.I2C_Mode = I2C_Mode_I2C;  //选择IIC模式
	IIC1.I2C_OwnAddress1 = 0x00;	//作为从机的地址
	I2C_Init(I2C2, &IIC1);

	I2C_Cmd(I2C2, ENABLE);
}

写命令函数

void OLED_WriteCommand(uint8_t cmmand)  //在控制位选项上,选择不连续模式,并且片选为命令(DC为0)
{
	while(SET == I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));	//是否忙碌
	
	I2C_GenerateSTART(I2C2, ENABLE);	//起始位
	while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
	
	
	I2C_Send7bitAddress(I2C2, 0x78, I2C_Direction_Transmitter); //发送地址
	while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS);
	
	
	I2C_SendData(I2C2, 0x00);	//发送控制位
	while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS);
	

	I2C_SendData(I2C2, cmmand);	//发送数据
	while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTED) != SUCCESS);
	
	
	I2C_GenerateSTOP(I2C2 , ENABLE);
}

写数据函数

void OLED_WriteData(uint8_t Data)  //在控制位选项上,选择不连续模式,并且片选为数据(DC为1)
{
	while(SET == I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));	//是否忙碌
	I2C_GenerateSTART(I2C2, ENABLE);	//起始位
	while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
	
	
	I2C_Send7bitAddress(I2C2, 0x78, I2C_Direction_Transmitter); //发送地址
	while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS);
	
	
	I2C_SendData(I2C2, 0x40);	//发送控制位
	while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS);
	

	I2C_SendData(I2C2, Data);	//发送数据
	while(I2C_CheckEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTED) != SUCCESS);
	
	
	I2C_GenerateSTOP(I2C2 , ENABLE);

}

主函数

记得调用更新函数,否则不会显示!!

int main(void)
{
	OLED_init();
	OLED_Clear();
	OLED_Printf(0,0,"%s","hello world!");
	OLED_Printf(0,16,"%s","1234567890");
	OLED_Update();
	while(1);
}	

硬件IIC的使用就是上面的代码,后续代码都是基于上面两个命令代码,源码在文末链接。

五,实验效果

本文是基于江科大stm32F1系列的模拟IIC驱动OLED屏幕仿写的STM32F4的硬件IIC驱动OLED屏幕,取模以及基本的函数使用说明可以借鉴江科大OLED库的使用方法。

江科大B站直达:http://【[模块教程] 第1期 0.96寸OLED显示屏】 https://www.bilibili.com/video/BV1EN41177Pc/?share_source=copy_web&vd_source=6294aa5a8922169865879dd832a253c2

OLED源码
链接:https://pan.baidu.com/s/12CIHm-Ti0XE0pLBTOt7XHg 
提取码:2486 

### STM32F407VET6与OLED显示屏驱动代码教程 #### 初始化配置 为了使STM32F407VET6能够正常工作并控制OLED屏幕,初始化过程至关重要。这涉及到硬件连接以及必要的软件设置。 对于硬件部分,确保ST-LINK调试器正确连接至STM32F407VET6开发板上的SWD接口,并通过USB线缆接入计算机;同时将0.96英寸OLED模块按照指定引脚定义接到MCU相应端口上[^1]。 至于软件方面,则需完成如下操作: - **包含头文件**:在项目源文件顶部加入`#include "stm32f4xx.h"`语句来引入设备专用API函数声明。 - **外设初始化**:调用特定于应用需求的方法对所需资源进行初步设定,比如在此案例中要执行的是`OLED_Init()`用于启动显示器服务[^4]。 ```c #include "stm32f4xx.h" int main(void) { OLED_Init(); // 后续显示逻辑... } ``` #### 基础显示功能实现 一旦完成了上述准备工作之后就可以着手构建基本的文字输出能力了。这里列举了几种常见的字符呈现方式及其对应的C语言表达形式: - 单个字母展示可以通过`OLED_ShowChar(row, column, character)`方法达成,在给定行列位置处打印单一ASCII码表内的符号; - 连贯字符串则借助`OLED_ShowString(row, startColumn, stringLiteral)`指令一次性渲染多字节序列; - 数值型数据同样支持直观可视化处理——整数类型的数值可通过`OLED_ShowNum(lineNumber, startPosition, valueToDisplay, digitCount)`参数化展现出来;而带有正负号标记的数据对象应该选用`OLED_ShowSignedNum()`变体版本; - 对十六进制格式的数字表示感兴趣的话,不妨尝试下`OLED_ShowHexNum(displayRow, initialCol, hexValue, widthInDigits)`选项; - 如果目标是二进制位模式,则有专门针对此类情况设计的`OLED_ShowBinNum(targetLine, startingPoint, binaryFigure, lengthOfSequence)`工具可供选择。 ```c // 示例代码片段 OLED_ShowChar(1, 1, 'A'); OLED_ShowString(1, 3, "HelloWorld!"); OLED_ShowNum(2, 1, 12345, 5); OLED_ShowSignedNum(2, 7, -66, 2); OLED_ShowHexNum(3, 1, 0xAA55, 4); OLED_ShowBinNum(4, 1, 0xAA55, 16); ``` #### 扩展特性探索 除了简单的文字绘制之外,还可以进一步挖掘更多高级特性的潜力,例如利用PWM技术调整背光亮度或是实施滚动效果增强用户体验感等[^2][^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值