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 правильно добавлены в вашем проекте.