DocsTech
/
Микроконтроллеры(МК)
/

~ cd ssd1306 подключение к stm32: код, схема и библиотеки

Библиотека ssd1306.h представляет собой библиотеку для работы с дисплеем SSD1306, который является графическим 128×64 или 128×32 монохромным OLED дисплеем. Данная библиотека обеспечивает простой и удобный интерфейс для работы с этим дисплеем на микроконтроллерах STM32.

Библиотека ssd1306.h позволяет осуществлять различные операции с дисплеем, такие как вывод текста, графики, рисование фигур и прочее. Она упрощает взаимодействие с дисплеем и позволяет создавать разнообразные графические интерфейсы.

Библиотека fonts.h содержит различные шрифты, которые могут быть использованы для вывода текста на дисплей SSD1306. Шрифты в этой библиотеке представлены в виде массивов битовых данных, соответствующих каждому символу или знаку. Использование различных шрифтов позволяет изменять стиль и размер текста на дисплее, делая вывод информации более гибким и креативным.

Схема подключения SSD1306 к STM32

Для SSD1306 нужно необходимо подключить пины SDA и SCL STM32 в соответствующие пины SSD1306. В качестве примера использую микроконтроллер STM32F401.

Таблица 1. Подключение STM32 к SSD1306
SSD1306STM32F401
1SDAPB8
2SCLPB9
3VCC3.3V
4GNDGND

Простой Код STM32 для управления SSD1306

Написанный код проводит предварительную калибровой для вывода слов «DocsTech Help You!» на черном экране белыми буквами с продолжительностью 1 секунды. Затем циклический вывод текста «Ready :» и цифрой равной числу повторений с интервалом 500 мс.

Итак, для начала вам нужно создать новый проект в STM32Cube IDE для STM32F401. Убедитесь, что в проекте корректно настроены пины I2C для работы с экраном SSD1306 и частота I2C установлена на 4 МГц. После чего создайте файлы ssd1306.h

и fonts.h дл
работы с экраном и шрифтами. Ниже приведен пример кода, который написан на языке С/C++ и вы можете использовать для работы с экраном SSD1306:
...
Копировать
#include "ssd1306.h"
#include "fonts.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define numIterations 10 // Количество повторений текста "Ready :"

char buffer[20]; // Буфер для хранения текста перед отправкой на экран

int main() {
    SSD1306_Init(); // Инициализация экрана SSD1306

    SSD1306_Fill(Black); // Заполнение экрана черным цветом

    HAL_Delay(1000); // Задержка 1 секунда

    SSD1306_DrawText(2, 4, "DocsTech Help You!", &Font_7x10, White); // Вывод текста "DocsTech Help You!"
    SSD1306_UpdateScreen(); // Обновление экрана

    HAL_Delay(1000); // Задержка 1 секунда

    for (int i = 0; i < numIterations; i++) {
        sprintf(buffer, "Ready : %d", i); // Формирование текста "Ready : N"
        SSD1306_DrawText(2, 16, buffer, &Font_7x10, White); // Вывод текста "Ready : N"
        SSD1306_UpdateScreen(); // Обновление экрана
        HAL_Delay(500); // Задержка 500 мс
    }

    while (1) {} // Зацикливаем программу

    return 0;
}

Не забудьте подключить файлы ssd1306.h

и fonts.h с н
еобходимыми определениями для работы с экраном и шрифтами. После этого загрузите скомпилированный проект на STM32F401 и убедитесь, что все работает корректно.

Возможно, вам придется дополнить код функциями работы с экраном и шрифтами в соответствии с вашими требованиями.

Сложный Код STM32 для управления SSD1306 без использования библиотек ssd1306.h и fonts.h

Для начала вам нужно подготовить рабочую среду STM32Cube IDE с настройками для платы STM32F401, а также убедиться, что библиотека STM32Cube_FW_F4 у вас установлена. Затем вам нужно создать проект, чтобы можно было начать работу с кодом. Это код написан на C/C++ и выполняет тоже самое, что и верхний.
...
Копировать
#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_i2c.h"

#define SSD1306_ADDR 0x3C
#define SSD1306_WIDTH 128
#define SSD1306_HEIGHT 64

#define SSD1306_REG_CONTROL 0x00
#define SSD1306_REG_DATA 0x40

I2C_HandleTypeDef hi2c;

void SSD1306_WriteCommand(uint8_t command) {
    uint8_t data[2];
    data[0] = SSD1306_REG_CONTROL;
    data[1] = command;
    HAL_I2C_Master_Transmit(&hi2c, SSD1306_ADDR, data, 2, HAL_MAX_DELAY);
}

void SSD1306_WriteData(uint8_t* data, uint16_t size) {
    uint8_t buffer[17];
    buffer[0] = SSD1306_REG_DATA;
    for (uint16_t i = 0; i < size; i++) {
        buffer[i + 1] = data[i];
        if (((i + 1) % 16) == 0 || i == (size - 1)) {
            HAL_I2C_Master_Transmit(&hi2c, SSD1306_ADDR, buffer, i + 2, HAL_MAX_DELAY);
        }
    }
}

void SSD1306_Init() {
    uint8_t init_data[] = {
        0xAE,        // Display off
        0xD5, 0x80,  // Clock divide ratio
        0xA8, 0x3F,  // Set MUX ratio
        0xD3, 0x00,  // Display offset
        0x40,        // Start line
        0x8D, 0x14,  // Charge pump
        0x20, 0x00,  // Memory mode (horizontal)
        0xA0,        // Segment remap
        0xC0,        // Scan direction
        0xDA, 0x12,  // COM pins
        0x81, 0xCF,  // Contrast control
        0xD9, 0xF1,  // Precharge
        0xDB, 0x40,  // Vcomh
        0xA4,        // Entire display on
        0xA6,        // Normal display
        0xAF         // Display on
    };
    SSD1306_WriteData(init_data, sizeof(init_data));
}

void SSD1306_PrintText(const char* text, uint8_t size, uint8_t x, uint8_t y) {
    uint16_t text_len = strlen(text);
    uint8_t data[6 + text_len * size];
    data[0] = 0x22; // Data mode
    data[1] = x;    // Column start address
    data[2] = x;    // Column end address
    data[3] = 0x3F; // Page start address
    data[4] = 0x3F; // Page end address
    for (uint16_t i = 0; i < text_len; i++) {
        for (uint8_t j = 0; j < size; j++) {
            data[5 + i * size + j] = fonts[(text[i] - 32) * size + j];
        }
    }
    SSD1306_WriteData(data, 6 + text_len * size);
}

void HAL_Delay(uint32_t ms) {
    for (uint32_t i = 0; i < ms * 1000; i++) {
        __NOP();
    }
}

void HAL_MspInit(void) {
    __HAL_RCC_SYSCFG_CLK_ENABLE();
    __HAL_RCC_PWR_CLK_ENABLE();
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    hi2c.Instance = I2Cx;
    hi2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c.Init.ClockSpeed = 400000; // 400 kHz
    SSD1306_Init();
    while (1) {
        SSD1306_PrintText("DocsTech Help You!", 1, 10, 10);
        HAL_Delay(1000);
        for (int i = 0; i < 20; i++) {
            char buffer[50];
            sprintf(buffer, "Ready : %d", i);
            SSD1306_PrintText(buffer, 1, 10, 30);
            HAL_Delay(500);
        }
    }
}

Этот код представляет пример программы для работы с дисплеем SSD1306 по I2C на микроконтроллере STM32F401 с частотой 4 МГц. Вам также придется добавить файлы шрифтов в ваш проект. Убедитесь, что все необходимые библиотеки, файлы шрифтов и настройки I2C правильно добавлены в вашем проекте.

Главная
Курсы
Вебинары
OpenMV N6: революционный модуль машинного зрения на базе STM32N6
STM32 HAL DMA I2C: Полное Руководство с Примером
STM32 SPI HAL DMA через STM32CubeIDE: Пример Создания Проекта и Особенности Построения
SSD1306 подключение к STM32: код, схема и библиотеки
Контроллер DMX512 под STM32
БИХ (рекурсивный) фильтр на STM32
Закрыть