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);
}
}