聯盛德 HLK-W806 (六): I2C驅動SSD1306 128x64 OLED液晶屏


目錄

SSD1306 OLED

SSD1306驅動的128x64 OLED液晶屏是嵌入式應用中最常見的一種屏幕, 特點是亮度高耗電小可視角度大.
這種屏幕常見的pin腳類型有兩種: 4線的I2C和6/7/8線的SPI. 這里介紹的是I2C類型的連接和驅動. 如果需要查看SPI方式的驅動, 請點擊 4線SPI驅動SSD1306/SSD1315 128x64 OLED液晶屏

連接

對應本演示的連接方式為

  • SCL -> PA1
  • SDA -> PA4
  • GND -> GND
  • VCC -> 3.3V

W806的I2C只有兩種選擇: PA1+PA4 和 PB20+PB19

庫文件

本示例移植自Github上Lutsai Alexander的 stm32libs項目, 根據W806的I2C HAL接口修改了傳輸部分, 去除了DMA方法, 並修改了字體展示部分以適應當前SDK的字體格式. 這個庫文件支持

  • 畫點
  • 畫線
  • 畫圓
  • 輸出文字(需要軟字庫)
  • 畫圖

使用

驅動SSD1306時, 需要引入的文件為

  • ssd1306.c
  • ssd1306.h
  • ssd1306_fonts.c
  • ssd1306_fonts.h

在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模式

/**
 * Mode switch: 0 - SPI, 1 - I2C
 */
#define SSD1306_MODE_I2C          1

修改當前屏幕對應的參數: 地址, 寬度, 高度

/* 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示例

Update 2023-02-23: 已經修復SSD1306在較低I2C外設頻率下無法正常顯示的問題. 調整了預分頻寄存器值計算公式, 減小時鍾誤差.

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM