STM32 I2C OLED

STM32使用I2C驱动OLED

资料推荐

视频教学还请看波特率动
【【STM32入门教程-2024】第14集 如何在OLED屏幕上挥毫】 https://www.bilibili.com/video/BV19u4y197df/?share_source=copy_web&vd_source=734d9fe130776e8ae82b2b5371a5f5b8
大佬搞了个好使的取模助手
https://led.baud-dance.com/

此网页可以下载大佬的例程

OLED屏幕购买于淘宝优信电子

【淘宝】1k+人已复购 http://e.tb.cn/h.gEUTropOyKPiIHI?tk=Sxdq3ONBvob HU0025 「0.91/0.96/1.3寸 OLED显示液晶屏模块 IIC/SPI液晶串口屏」
点击链接直接打开 或者 淘宝搜索直接打开

购买后请下载对应的资料包,对照进行修改移植

说明

使用IIC驱动,进行了简单整理便于移植,我的代码是0.91寸,128X32的OLED。
完整代码见我绑定的资源
相关代码在userCode theDevice中
开发环境 VScode + EIDE
hex在buid文件夹下

移植说明

初始化过程发送的命令建议和资料包中的一模一样
我的代码是0.91寸,128X32的OLED
如果是0.96寸128X64的OLED,宏定义OLED_PAGE 应为8,OLED_Duty应为0x3F其它请看对应的资料包
再次说明:初始化过程发送的命令建议和资料包中的一模一样!
手册太长,扫一下就好,能用就行。
经试验使用大佬的代码,OLED的RES引脚直接接3.3V就行

部分代码展示

//使用其它IIC口请修改
#define OLED_IIC_HANDLE hi2c1 //使用的IIC句柄
#define OLED_IIC_INIT MX_I2C1_Init //初始化函数

// OLED器件地址
#define OLED_ADDRESS 0x78

// OLED参数
#define OLED_PAGE 4            // OLED页数
#define OLED_ROW 8 * OLED_PAGE // OLED行数
#define OLED_COLUMN 128        // OLED列数

#define OLED_Lower_column_address 0x00 //lower column address 设置列地址低4位
#define OLED_Higer_column_address 0X10 //higher column address 设置列地址高4位
#define OLED_Page_address 0xB0 //page address 页地址
#define OLED_Duty 0x1F //duty = 1/32 显示行数0-31

void OLED_Init()
{
  HAL_Delay(20); // 单片机启动比OLED上电快,需要延迟等待一下
  OLED_IIC_INIT();


  OLED_SendCmd(0xAE);//关闭显示屏

  OLED_SendCmd(OLED_Lower_column_address); //set lower column address 设置起始行地址
  OLED_SendCmd(OLED_Higer_column_address); /*set higher column address*/

  OLED_SendCmd(0x00); /*set display start line*/

  OLED_SendCmd(OLED_Page_address);//set page address 	设置页面起始地址为页面寻址模式,0-7

  OLED_SendCmd(0x81);// contract control 设置对比度
  OLED_SendCmd(0xff);// 选择0xff对比度,选择范围0x00-0xff

  OLED_SendCmd(0xa1);// set segment remap 左右反置关(段重映射),A0H 设置GDDRAM的COL0映射到驱动器输出SEG0,A1H 设置COL127映射到SEG0

  OLED_SendCmd(0xa6);// normal / reverse 正常显示(1亮0灭)

  OLED_SendCmd(0xa8);//	multiplex ratio 设置多路传输比率,显示行数
  OLED_SendCmd(OLED_Duty);// duty (显示多少行)

  OLED_SendCmd(0xC8);//Com scan direction 上下反置关(行重映射),C8,从COM[N-1]扫描到COM0;C0,设置 从COM0扫描到COM[N-1],N为复用率

  OLED_SendCmd(0xd3);// set display offset 设置垂直显示偏移(向上)
  OLED_SendCmd(0x00);// 偏移0行

  OLED_SendCmd(0xd5);// set osc division 设置DCLK分频和OSC频率
  OLED_SendCmd(0xf0);// 频率最高

  OLED_SendCmd(0xd9);// set pre-charge period 设置预充电的持续时间
  OLED_SendCmd(0x22);

  OLED_SendCmd(0xda);// set COM pins 设置COM引脚配置
  OLED_SendCmd(0x02);// 序列COM配置,禁用左右反置

  OLED_SendCmd(0xdb);//set vcomh 调整Vcomh调节器的输出
  OLED_SendCmd(0x49);

  OLED_SendCmd(0x8d);// set charge pump enable 启用电荷泵
  OLED_SendCmd(0x14);// 启用电荷泵

  OLED_SendCmd(0xaf);// 开OLED显示

  OLED_ClearVideoMemory();
  OLED_ShowFrame();
}


void OLED_ShowFrame()
{
  static uint8_t sendBuffer[OLED_COLUMN + 1];
  sendBuffer[0] = 0x40;
  for (uint8_t i = 0; i < OLED_PAGE; i++)
  {
    OLED_SendCmd(OLED_Page_address + i); // 设置页地址
    OLED_SendCmd(OLED_Lower_column_address);     // 设置列地址低4位
    OLED_SendCmd(OLED_Higer_column_address);     // 设置列地址高4位
    memcpy(sendBuffer + 1, OLED_GRAM[i], OLED_COLUMN);
    OLED_Send(sendBuffer, OLED_COLUMN + 1);
  }
}
### STM32 I2C OLED 标准库 使用教程 对于STM32使用I2COLED显示屏通信的标准库资源或教程,可以从几个方面来了解和实践。 #### 资源获取 U8g2是一个广泛使用的图形库,适用于多种显示器,包括OLED屏。该库支持通过不同的硬件接口进行通信,其中包括I2C[^2]。为了使STM32能够驱动OLED屏幕并显示内容,通常会选择移植U8g2库到项目中。U8g2库可以在GitHub上找到最新版本,并提供了详细的安装指南和支持文档。 #### 初始化配置 当采用标准库开发时,初始化I2C外设是必要的步骤之一。这涉及到设置SCL和SDA引脚模式为 alternate function open-drain, 配置相应的GPIO端口速度以及上下拉电阻状态。接着需调用`I2C_Init()`函数完成I2C参数设定,比如频率、ACK应答控制等[^3]。 #### 查询标志位操作 在实现数据传输过程中,可能需要用到查询特定事件的发生情况。例如,在发送命令前确认总线是否处于忙碌状态可以通过如下方式实现: ```c while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) == SET); // 等待直到I2C总线不再繁忙 ``` 这段代码会持续循环检测指定的忙闲标志位(`I2C_FLAG_BUSY`),只有在其变为未激活(`RESET`)之后才会继续执行后续指令。 #### 示例程序结构 下面给出一段简单的示例代码框架,展示了如何结合上述知识点创建一个完整的应用程序来操控OLED屏幕: ```c #include "stm32f1xx_hal.h" #include "u8g2.h" // 定义全局变量 extern U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2; /* 创建U8g2对象 */ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_I2C1_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_Init(); u8g2.begin(); // 开始初始化U8g2库 while (true){ u8g2.clearBuffer(); // 清除缓冲区 u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体样式 u8g2.drawStr(0, 10, "Hello World!"); // 绘制字符串 u8g2.sendBuffer(); // 将图像刷新至屏幕上 HAL_Delay(1000); // 延迟一秒再重复绘制过程 } } ``` 此段代码片段假设已经完成了必要的环境搭建工作,如正确设置了硬件连接关系、包含了所有必需头文件并且定义好了外部实例化对象(如`u8g2`)。此外还假定读者熟悉基本的嵌入式编程概念和技术细节[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜哥万岁万岁万万岁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值