☰
【STM32标准库】铁头山羊--[I2C]OLED显示器(笔记)
2026/10/13 3:23:04 网站建设 项目流程

一.OLED显示器的基本原理

在OLED上如何显示内容的呢?

在OLED的内部有一个内存可以通过I2C总线对内存进行读写,而内存里的每一个比特位都代表OLED屏幕上的一个像素(0灭,1亮)

二.屏幕的初始化

1.初始化I2C(选择软硬都行,此篇用的软件I2C)

电路图:

#include "si2c.h"//引用软件I2C的头文件 SI2C_TypeDef si2c;//声明一个软I2C的变量 si2c.SCL_GPIOx=GPIOB;//指定SCL的位置 si2c.SCL_GPIO_Pin=GPIO_Pin_6; si2c.SDA_GPIOx=GPIOB;//指定SDA的位置 si2c.SDA_GPIO_Pin=GPIO_Pin_7; My_SI2C_Init(&si2c);//初始化 --------------------------------------- void My_SI2C(void); void My_SI2C(void) { //软I2C初始化 si2c.SCL_GPIOx=GPIOB; si2c.SCL_GPIO_Pin=GPIO_Pin_6; si2c.SDA_GPIOx=GPIOB; si2c.SDA_GPIO_Pin=GPIO_Pin_7; My_SI2C_Init(&si2c); }

2.对OLED屏幕初始化

在olrd.h第75行找到屏幕初始化函数

3.屏幕初始化接口用法

所使用的OLED名称:需要声明一个 OLED_TypeDef 变量名 的全局变量

OLED的初始化参数(结构体只有一个参数,是一个函数指针,目的就是把结构体中的函数指针初始化):

首先按回调函数形式写一个函数(函数名不重名即可)

int i2c_write_bytes(uint8_t addr,const uint8_t *pdata,uint16_t size); //实现函数 int i2c_write_bytes(uint8_t addr,const uint8_t *pdata,uint16_t size) { //使用软I2C发送函数,并作为返回值返回给要实现的函数 return My_SI2C_SendBytes(&si2c,addr,pdata,size); }

把函数名填进去

void My_OLEDScreen_Init(void); void My_OLEDScreen_Init(void) { //初始化屏幕函数 OLED_InitTypeDef OLED_InitStruct; OLED_InitStruct.i2c_write_cb=i2c_write_bytes; OLED_Init(&oled,&OLED_InitStruct); }

三.基本概念和操作

1.画笔和画刷

白色画笔:划过的地方点亮 黑色画笔:划过的地方熄灭

透明画笔:不做处理 不同粗细的画笔:1像素,2像素......

画刷:

设置画笔和画刷

// // @画笔和画刷 // // @设置画笔 Pen_Color--画笔颜色 Width--画笔粗细 void OLED_SetPen(OLED_TypeDef *OLED, uint8_t Pen_Color, uint8_t Width); // @设置画刷 Brush_Cokor--画刷颜色 void OLED_SetBrush(OLED_TypeDef *OLED, uint8_t Brush_Color);

2.屏幕坐标系

所用OLED规格为128*64像素

想要在OLED作画就要为一个个像素点坐标

如何坐标? 选取屏幕任意位置建立平面直角坐标系即可

如下图,选取屏幕左上角为原点,原点向右为x正半轴,向下为y正半轴

3.光标

// // @光标 // // @设置光标位置 void OLED_SetCursor(OLED_TypeDef *OLED, int16_t X, int16_t Y); // @设置光标的X坐标 void OLED_SetCursorX(OLED_TypeDef *OLED, int16_t X); // @设置光标的Y坐标 void OLED_SetCursorY(OLED_TypeDef *OLED, int16_t Y); // @移动光标 dx--x轴位移距离 dy--y轴位移距离 void OLED_MoveCursor(OLED_TypeDef *OLED, int16_t dX, int16_t dY); // @沿X轴方向移动光标 void OLED_MoveCursorX(OLED_TypeDef *OLED, int16_t dX); // @沿Y轴方向移动光标 void OLED_MoveCursorY(OLED_TypeDef *OLED, int16_t dY); // @获取光标当前位置 void OLED_GetCursor(OLED_TypeDef *OLED, int16_t *pXOut, int16_t *pYOut); // @获取光标X坐标 int16_t OLED_GetCursorX(OLED_TypeDef *OLED); // @获取光标Y坐标 int16_t OLED_GetCursorY(OLED_TypeDef *OLED);

四.文字相关操作

1.打印字符串

//打印Hello World OLED_SetPen(&oled,PEN_COLOR_WHITE,1); OLED_SetBrush(&oled,PEN_COLOR_TRANSPARENT); OLED_SetCursor(&oled,24,50); OLED_DrawString(&oled,"Hello World"); OLED_SendBuffer(&oled);

2.设置字体

3.格式化打印字符串

4.设置文本区域

案例

五.绘图相关的操作

1.画点

2.划线

3.画矩形和画圆

4.绘制位图

获取位图数据可以访问https://javl.github.io/image2cpp/

选择文件-->设置输出(纯字节)-->生成代码

#include "stm32f10x.h" #include "si2c.h" #include "oled.h" SI2C_TypeDef si2c; OLED_TypeDef oled; const uint8_t bitmap[]={// '1', 128x64px 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x7f, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7e, 0x07, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xf0, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xfe, 0x1f, 0xff, 0xc7, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xc7, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xf1, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xf8, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xfe, 0x3f, 0xcf, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x8f, 0xcf, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xc7, 0xcf, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xe3, 0xcf, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x03, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xf8, 0x03, 0xf8, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xe0, 0x0c, 0x7e, 0x3f, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0x80, 0x03, 0x3f, 0x3f, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xfc, 0xff, 0x00, 0x7f, 0x80, 0x01, 0x9f, 0x9f, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xf1, 0xf8, 0x00, 0x1f, 0x00, 0x01, 0x9f, 0x8f, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xf3, 0xf2, 0x00, 0x07, 0x80, 0x03, 0x9f, 0xcc, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xe3, 0xe2, 0x00, 0x07, 0x80, 0x07, 0x3f, 0xc1, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xe3, 0xe6, 0x00, 0x03, 0xe0, 0x1c, 0x7f, 0x83, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xe7, 0xe3, 0x00, 0x07, 0xf8, 0x03, 0xff, 0x91, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xe3, 0xf3, 0xc0, 0x07, 0xff, 0x1f, 0xff, 0x3c, 0x1f, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xf3, 0xf8, 0xff, 0x8f, 0x3e, 0x3f, 0xfe, 0x3f, 0x9f, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xf1, 0xfe, 0x00, 0x1f, 0x00, 0x7f, 0xf8, 0xff, 0x9f, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xf8, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xf1, 0xff, 0x9f, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0x8f, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xfe, 0x07, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xf0, 0x40, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xf8, 0x1f, 0xff, 0xfc, 0x07, 0xff, 0x83, 0x1e, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xf8, 0x1e, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xff, 0x81, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc0, 0x7f, 0xff, 0xff, 0xf0, 0x03, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0x8c, 0x00, 0x03, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x00, 0xff, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0xfc, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; void My_OnBoardLED_Init(void); void My_OLEDScreen_Init(void); void My_SI2C(void); int i2c_write_bytes(uint8_t addr,const uint8_t *pdata,uint16_t size); int main(void) { My_SI2C(); My_OnBoardLED_Init(); My_OLEDScreen_Init(); OLED_SetCursor(&oled,0,0); OLED_DrawBitmap(&oled,128,64,bitmap); OLED_SendBuffer(&oled); uint8_t rcvd; My_SI2C_ReceiveBytes(&si2c,0x78,&rcvd,1); if((rcvd&(0x01<<6))==0) { GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET); } else { GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET); } while(1) { } } void My_SI2C(void) { //软I2C初始化 si2c.SCL_GPIOx=GPIOB; si2c.SCL_GPIO_Pin=GPIO_Pin_6; si2c.SDA_GPIOx=GPIOB; si2c.SDA_GPIO_Pin=GPIO_Pin_7; My_SI2C_Init(&si2c); } void My_OLEDScreen_Init(void) { //初始化屏幕函数 OLED_InitTypeDef OLED_InitStruct; OLED_InitStruct.i2c_write_cb=i2c_write_bytes; OLED_Init(&oled,&OLED_InitStruct); } //实现函数 int i2c_write_bytes(uint8_t addr,const uint8_t *pdata,uint16_t size) { //使用软I2C发送函数,并作为返回值返回给要实现的函数 return My_SI2C_SendBytes(&si2c,addr,pdata,size); } void My_OnBoardLED_Init(void) { //初始化板载LED RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitTypeDef GPIO_GPIOC; GPIO_GPIOC.GPIO_Pin=GPIO_Pin_13; GPIO_GPIOC.GPIO_Mode=GPIO_Mode_Out_OD;//通用输出开漏模式 GPIO_GPIOC.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOC,&GPIO_GPIOC); GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET); }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询