问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32F407硬件IIC驱动OLED屏幕详解

创作时间:
作者:
@小白创作中心

STM32F407硬件IIC驱动OLED屏幕详解

引用
CSDN
1.
https://blog.csdn.net/weixin_64166828/article/details/143393169

概述

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

实验材料

  1. 0.96寸OLED屏幕(四针IIC驱动)
  2. stm32f407vet6主控
  3. 杜邦线

接线

接线说明stm32f407vet6 OLED屏幕
VCC VCC
SCL SCL
SDA SDA
GND GND

代码讲解

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库的使用方法。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号