其他分享
首页 > 其他分享> > 联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏

联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏

作者:互联网

目录

SSD1306 OLED

SSD1306驱动的128x64 OLED液晶屏是嵌入式应用中最常见的一种屏幕, 特点是亮度高耗电小可视角度大.
这种屏幕常见的pin脚类型有两种: 4线的I2C和6/7/8线的SPI. 这里介绍的是I2C类型的连接和驱动.

连接

对应本演示的连接方式为

W806的I2C只有两种选择: PA1+PA4 和 PB20+PB19

库文件

本示例移植自Github上Lutsai Alexander的 stm32libs项目, 根据W806的I2C HAL接口修改了传输部分, 去除了DMA方法, 并修改了字体展示部分以适应当前SDK的字体格式. 这个库文件支持

使用

驱动SSD1306时, 需要引入的文件为

在main.c中加入头文件并初始化 I2C_HandleTypeDef, 如果不使用PA1+PA4, 需要修改下面的I2C_Init()代码.

#include "ssd1306.h"

I2C_HandleTypeDef hi2c;

void I2C_Init(void)
{
    hi2c.SCL_Port = GPIOA;
    hi2c.SCL_Pin = GPIO_PIN_1;
    hi2c.SDA_Port = GPIOA;
    hi2c.SDA_Pin = GPIO_PIN_4;

    HAL_I2C_Init(&hi2c);
}

在ssd1306.h中修改当前屏幕对应的参数: 地址, 宽度, 高度

/* I2C address */
#ifndef SSD1306_I2C_ADDR
#define SSD1306_I2C_ADDR         0x78
#endif

/* SSD1306 settings */
/* SSD1306 width in pixels */
#ifndef SSD1306_WIDTH
#define SSD1306_WIDTH            128
#endif
/* SSD1306 LCD height in pixels */
#ifndef SSD1306_HEIGHT
#define SSD1306_HEIGHT           64
#endif

然后就可以在代码中使用了

# 初始化
uint8_t res = SSD1306_Init();
printf("OLED init: %d\n", res);
# 定位绘画起点
SSD1306_GotoXY(5, 5);
# 输出字符
SSD1306_Puts("OLED:11x18", &Font_11x18, 1);
# 更新显示
SSD1306_UpdateScreen(); // display

清屏

SSD1306_Fill(0); // clear oled

画线

int y1 = 64, y2 = 0;
while (y1 > 0)
{
    SSD1306_DrawLine(0, y1, 128, y2, 1);
    SSD1306_UpdateScreen();
    y1 -= 2;
    y2 += 2;
}

填充反色, 画圆

SSD1306_Fill(1); // clear oled
SSD1306_UpdateScreen();
SSD1306_DrawCircle(64, 32, 25, 0);
SSD1306_UpdateScreen();
SSD1306_DrawCircle(128, 32, 25, 0);
SSD1306_UpdateScreen();
SSD1306_DrawCircle(0, 32, 25, 0);
SSD1306_UpdateScreen();
SSD1306_DrawCircle(32, 32, 25, 0);
SSD1306_UpdateScreen();
SSD1306_DrawCircle(96, 32, 25, 0);
SSD1306_UpdateScreen();

相关代码

代码已经更新到SDK的I2C示例

参考

标签:W806,ssd1306,UpdateScreen,OLED,HLK,I2C,SSD1306
来源: https://www.cnblogs.com/milton/p/15647938.html