Подключение OLED экрана к микроконтроллеру STM32F103

В данном уроке мы подключим OLED экран с драйвером управления SH1106 к микроконтроллеру STM32F103.

OLED

Обмен данных происходит по шине I2C.
Hапряжение питание 3,3В.
Ток потребления 23-33 mA

Дисплей состоит из матрицы микро светодиодов и драйвера управления ими. Матрица пикселей дисплея имеет размер 128×64. Таким образом, у нас 64 строки, каждая из которых состоит из 128 пикселей. Матрица пикселей дисплея имеет размер 128×64. 

Алгоритм работы OLED экрана:
Работа с экраном начинается с того, что ведущий формирует состояние СТАРТ: генерирует переход сигнала линии SDA из высокого состояния в низкое при высоком уровне на линии SCL. Этот переход воспринимается устройством как признак начала процедуры обмена. Процедура обмена завершается тем, что ведущий формирует состояние «СТОП» — переход состояния линии SDA из низкого состояния в высокое при высоком состоянии линии SCL.
Для подтверждения приёма байта от ведущего передатчика, ведомый передает специальный бит подтверждения,
выставляемый на шину SDA после приёма 8
бита данных.

Передача 8 бит данных от передатчика приёмнику завершаются дополнительным циклом (формированием 9-го тактового
импульса линии SCL), при котором приёмник выставляет низкий уровень сигнала на линииSDA, как флаг успешного приёма байта. 

Особенности работы OLED экрана:
Дисплей принимает два вида байт: байты управления, записываемые в регистры управления контроллера, и байты данных, записываемые в оперативную память. Перед отправкой команды или данных сначала посылается управляющий байт, в котором указывает тип байта  — команда или данные.

Управляемые команды:
Установка старших битов адреса колонки (00H — 0FH).
Установка младших битов адреса колонки (10H — 1FH).

/**********************/

При вызове команд управления состоянием
источника напряжения дисплей должен быть
выключен.
Вход в режим управления источником
напряжения (ADH);
Выкл/вкл внутренний источник напряжения
(8AH/8BH).
Установка значения подкачки напряжения (30H
— 33H).
Устанавливает выходное напряжение
встроенного источника напряжения (7.4 – 9 В).
Установка начальной строки (40H-7FH).
Устанавливает адрес строки, с которой
начинается вывод информации. Выбранная в
памяти контроллера строка окажется верхней на
дисплее.
Настройка контрастности.
Устанавливает значение контраста дисплея из
256 возможных в диапазоне 00H – FFH.
Включает две команды:
Вход в режим управления контрастом (81H);
Установка значения контраста (00H – FFH).
После отправки данной команды, происходит
автоматический выход из режима управления
контрастом.
Установка режима отображения (A0H/A1H).
Устанавливает инверсный или нормальный
режим отображения информации. Иными
словами, позволяет отображать информацию
зеркально.
Выкл/вкл режим подсветки всего дисплея (A4H
/A5H).
Устанавливает нормальный режим работы
дисплея или принудительно зажигает все
светодиоды.
Выкл/вкл инверсию состояний точек дисплея
(A6H / A7H).
Определяет нормальный режим работы дисплея,
либо инверсный, в котором в зависимости от
содержимого оперативной памяти все
выключенные светодиоды включаются, а
включенные – выключаются.
Выкл/вкл дисплей (AEH/AFH).
Установка адреса страницы (B0H-B7H)

Настройка шины I2C выполняется аналогично уроку: Подключение экрана Winstar WH1604A через I2C интерфейс. Единственным исключением это скорость работы шины, ее мы выставим 400кГц:

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

Программный код: 

I2C_HandleTypeDef hi2c2;

#define OLED_adress 0x78
#define OLED_SETCONTRAST 0x81     //установка контраста
#define OLED_DISPLAYALLON_RESUME 0xA4
#define OLED_DISPLAYALLON 0xA5
#define OLED_NORMALDISPLAY 0xA6  //нормальный режим
#define OLED_INVERTDISPLAY 0xA7
#define OLED_DISPLAYOFF 0xAE      //выключить экран
#define OLED_DISPLAYON 0xAF       // выключить дисплей
#define OLED_SETDISPLAYOFFSET 0xD3
#define OLED_SETCOMPINS 0xDA
#define OLED_SETVCOMDETECT 0xDB
#define OLED_SETDISPLAYCLOCKDIV 0xD5
#define OLED_SETPRECHARGE 0xD9
#define OLED_SETMULTIPLEX 0xA8
#define OLED_SETLOWCOLUMN 0x00    //младшие биты адреса колонки
#define OLED_SETHIGHCOLUMN 0x10  //старшие биты адреса колонки
#define OLED_SETSTARTLINE 0x40       //стартовая строка
#define OLED_MEMORYMODE 0x20
#define OLED_COLUMNADDR 0x21
#define OLED_PAGEADDR 0x22
#define OLED_COMSCANINC 0xC0
#define OLED_COMSCANDEC 0xC8
#define OLED_SEGREMAP 0xA0
#define OLED_CHARGEPUMP 0x8D  //включить генератор подкачки 
#define OLED_SWITCHCAPVCC 0x2
#define OLED_NOP 0xE3

#define OLED_WIDTH 128
#define OLED_HEIGHT 64
#define OLED_BUFFERSIZE (OLED_WIDTH*OLED_HEIGHT)/8
#define OLED_DEFAULT_SPACE 5

#define COMAND 0x00
#define DATA 0x40
uint16_t gg;
uint8_t temp[2] = {0,0};
uint8_t temp_char[7] = {0,0,0,0,0,0,0};
unsigned char LCD_X,LCD_Y;

typedef struct {
  uint16_t CurrentX;
  uint16_t CurrentY;
  uint8_t Inverted;
  uint8_t Initialized;
} SSD1306_t;
static SSD1306_t SSD1306;

unsigned char LCD_Buffer[0x0500] =
{
0x00, 0x00, 0x00, 0x00, 0x00,// 0
0x00, 0x00, 0x5F, 0x00, 0x00,// 1
0x00, 0x07, 0x00, 0x07, 0x00,// 2
0x14, 0x7F, 0x14, 0x7F, 0x14,// 3
0x24, 0x2A, 0x7F, 0x2A, 0x12,//4
0x23, 0x13, 0x08, 0x64, 0x62,//5
0x36, 0x49, 0x55, 0x22, 0x50,//6
0x00, 0x05, 0x03, 0x00, 0x00,//7
0x00, 0x1C, 0x22, 0x41, 0x00,//8
0x00, 0x41, 0x22, 0x1C, 0x00,//9
0x14, 0x08, 0x3E, 0x08, 0x14,//A
0x08, 0x08, 0x3E, 0x08, 0x08,//B
0x00, 0x50, 0x30, 0x00, 0x00,// C
0x08, 0x08, 0x08, 0x08, 0x08,// D
0x00, 0x60, 0x60, 0x00, 0x00,// E
0x20, 0x10, 0x08, 0x04, 0x02,// F
0x00, 0x00, 0x00, 0x00, 0x00,// 0
0x00, 0x00, 0x5F, 0x00, 0x00,// 1
0x00, 0x07, 0x00, 0x07, 0x00,// 2
0x14, 0x7F, 0x14, 0x7F, 0x14,// 3
0x24, 0x2A, 0x7F, 0x2A, 0x12,// 4
0x23, 0x13, 0x08, 0x64, 0x62,// 5
0x36, 0x49, 0x55, 0x22, 0x50,// 6
0x00, 0x05, 0x03, 0x00, 0x00,// 7
0x00, 0x1C, 0x22, 0x41, 0x00,// 8
0x00, 0x41, 0x22, 0x1C, 0x00,// 9
0x14, 0x08, 0x3E, 0x08, 0x14,// A
0x08, 0x08, 0x3E, 0x08, 0x08,// B
0x00, 0x50, 0x30, 0x00, 0x00,// C
0x08, 0x08, 0x08, 0x08, 0x08,// D
0x00, 0x60, 0x60, 0x00, 0x00,// E
0x20, 0x10, 0x08, 0x04, 0x02,// F
0x00, 0x00, 0x00, 0x00, 0x00,// space
0x00, 0x00, 0x5F, 0x00, 0x00,//  !
0x00, 0x07, 0x00, 0x07, 0x00,//  «
0x14, 0x7F, 0x14, 0x7F, 0x14,//  #
0x24, 0x2A, 0x7F, 0x2A, 0x12,// $
0x23, 0x13, 0x08, 0x64, 0x62,// %
0x36, 0x49, 0x55, 0x22, 0x50,// &
0x00, 0x05, 0x03, 0x00, 0x00,//  ‘
0x00, 0x1C, 0x22, 0x41, 0x00,//  (
0x00, 0x41, 0x22, 0x1C, 0x00,//   )
0x14, 0x08, 0x3E, 0x08, 0x14,//  *
0x08, 0x08, 0x3E, 0x08, 0x08,//  +
0x00, 0x50, 0x30, 0x00, 0x00,//  ,
0x08, 0x08, 0x08, 0x08, 0x08,//  —
0x00, 0x60, 0x60, 0x00, 0x00,//  .
0x20, 0x10, 0x08, 0x04, 0x02,//  /
0x3E, 0x51, 0x49, 0x45, 0x3E,//  0
0x00, 0x42, 0x7F, 0x40, 0x00,//  1
0x42, 0x61, 0x51, 0x49, 0x46,//  2
0x21, 0x41, 0x45, 0x4B, 0x31,//  3
0x18, 0x14, 0x12, 0x7F, 0x10,//  4
0x27, 0x45, 0x45, 0x45, 0x39,//  5
0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
0x01, 0x71, 0x09, 0x05, 0x03,//  7
0x36, 0x49, 0x49, 0x49, 0x36,//  8
0x06, 0x49, 0x49, 0x29, 0x1E,//  9
0x00, 0x36, 0x36, 0x00, 0x00,//  :
0x00, 0x56, 0x36, 0x00, 0x00,//  ;
0x08, 0x14, 0x22, 0x41, 0x00,//  <
0x14, 0x14, 0x14, 0x14, 0x14,//  =
0x00, 0x41, 0x22, 0x14, 0x08,//  >
0x02, 0x01, 0x51, 0x09, 0x06,//  ?
0x32, 0x49, 0x79, 0x41, 0x3E,//  @
0x7E, 0x11, 0x11, 0x11, 0x7E,//  A
0x7F, 0x49, 0x49, 0x49, 0x36,//  B
0x3E, 0x41, 0x41, 0x41, 0x22,//  C
0x7F, 0x41, 0x41, 0x22, 0x1C,//  D
0x7F, 0x49, 0x49, 0x49, 0x41,//  E
0x7F, 0x09, 0x09, 0x09, 0x01,//  F
0x3E, 0x41, 0x49, 0x49, 0x7A,// G
0x7F, 0x08, 0x08, 0x08, 0x7F,//  H
0x00, 0x41, 0x7F, 0x41, 0x00,//  I
0x20, 0x40, 0x41, 0x3F, 0x01,//  J
0x7F, 0x08, 0x14, 0x22, 0x41,//  K
0x7F, 0x40, 0x40, 0x40, 0x40,//  L
0x7F, 0x02, 0x0C, 0x02, 0x7F,//  M
0x7F, 0x04, 0x08, 0x10, 0x7F,//  N
0x3E, 0x41, 0x41, 0x41, 0x3E,// O
0x7F, 0x09, 0x09, 0x09, 0x06,//  P
0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
0x7F, 0x09, 0x19, 0x29, 0x46,//  R
0x46, 0x49, 0x49, 0x49, 0x31,//  S
0x01, 0x01, 0x7F, 0x01, 0x01,//  T
0x3F, 0x40, 0x40, 0x40, 0x3F,//  U
0x1F, 0x20, 0x40, 0x20, 0x1F,//  V
0x3F, 0x40, 0x38, 0x40, 0x3F,//  W
0x63, 0x14, 0x08, 0x14, 0x63,//  X
0x07, 0x08, 0x70, 0x08, 0x07,//  Y
0x61, 0x51, 0x49, 0x45, 0x43,//  Z
0x00, 0x7F, 0x41, 0x41, 0x00,//  [
0x02, 0x04, 0x08, 0x10, 0x20,//  Yen Currency Sign
0x00, 0x41, 0x41, 0x7F, 0x00,//  ]
0x04, 0x02, 0x01, 0x02, 0x04,//  ^
0x40, 0x40, 0x40, 0x40, 0x40,//  _
0x00, 0x01, 0x02, 0x04, 0x00,//  `
0x20, 0x54, 0x54, 0x54, 0x78,//  a
0x7F, 0x48, 0x44, 0x44, 0x38,//  b
0x38, 0x44, 0x44, 0x44, 0x20,//  c
0x38, 0x44, 0x44, 0x48, 0x7F,//  d
0x38, 0x54, 0x54, 0x54, 0x18,//  e
0x08, 0x7E, 0x09, 0x01, 0x02,//  f
0x0C, 0x52, 0x52, 0x52, 0x3E,//  g
0x7F, 0x08, 0x04, 0x04, 0x78,//   h
0x00, 0x44, 0x7D, 0x40, 0x00,//  i
0x20, 0x40, 0x44, 0x3D, 0x00,//  j
0x7F, 0x10, 0x28, 0x44, 0x00,//  k
0x00, 0x41, 0x7F, 0x40, 0x00,//  l
0x7C, 0x04, 0x18, 0x04, 0x78,// m
0x7C, 0x08, 0x04, 0x04, 0x78,// n
0x38, 0x44, 0x44, 0x44, 0x38,// o
0x7C, 0x14, 0x14, 0x14, 0x08,// p
0x08, 0x14, 0x14, 0x18, 0x7C,// q
0x7C, 0x08, 0x04, 0x04, 0x08,// r
0x08, 0x54, 0x54, 0x54, 0x20,// s
0x04, 0x3F, 0x44, 0x40, 0x20,//  t
0x3C, 0x40, 0x40, 0x20, 0x7C,// u
0x1C, 0x20, 0x40, 0x20, 0x1C,// v
0x3C, 0x40, 0x30, 0x40, 0x3C,// w
0x44, 0x28, 0x10, 0x28, 0x44,//  x
0x0C, 0x50, 0x50, 0x50, 0x3C,//  y
0x44, 0x64, 0x54, 0x4C, 0x44,//  z
0x00, 0x08, 0x36, 0x41, 0x00,//  <
0x00, 0x00, 0x7F, 0x00, 0x00,//  |
0x00, 0x41, 0x36, 0x08, 0x00,//  >
0x10, 0x08, 0x08, 0x10, 0x08,// Right Arrow ->
0x78, 0x46, 0x41, 0x46, 0x78,// Left Arrow <-
0x00, 0x00, 0x00, 0x00, 0x00,// 0
0x00, 0x00, 0x5F, 0x00, 0x00,// 1
0x00, 0x07, 0x00, 0x07, 0x00,// 2
0x14, 0x7F, 0x14, 0x7F, 0x14,// 3
0x24, 0x2A, 0x7F, 0x2A, 0x12,// 4
0x23, 0x13, 0x08, 0x64, 0x62,// 5
0x36, 0x49, 0x55, 0x22, 0x50,// 6
0x00, 0x05, 0x03, 0x00, 0x00,// 7
0x00, 0x1C, 0x22, 0x41, 0x00,// 8
0x00, 0x41, 0x22, 0x1C, 0x00,// 9
0x14, 0x08, 0x3E, 0x08, 0x14,// A
0x08, 0x08, 0x3E, 0x08, 0x08,// B
0x00, 0x50, 0x30, 0x00, 0x00,// C
0x08, 0x08, 0x08, 0x08, 0x08,// D
0x00, 0x60, 0x60, 0x00, 0x00,// E
0x20, 0x10, 0x08, 0x04, 0x02,// F
0x00, 0x00, 0x00, 0x00, 0x00,// 0
0x00, 0x00, 0x5F, 0x00, 0x00,// 1
0x00, 0x07, 0x00, 0x07, 0x00,// 2
0x14, 0x7F, 0x14, 0x7F, 0x14,// 3
0x24, 0x2A, 0x7F, 0x2A, 0x12,// 4
0x23, 0x13, 0x08, 0x64, 0x62,// 5
0x36, 0x49, 0x55, 0x22, 0x50,// 6
0x00, 0x05, 0x03, 0x00, 0x00,// 7
0x00, 0x1C, 0x22, 0x41, 0x00,// 8
0x00, 0x41, 0x22, 0x1C, 0x00,// 9
0x14, 0x08, 0x3E, 0x08, 0x14,// A
0x08, 0x08, 0x3E, 0x08, 0x08,// B
0x00, 0x50, 0x30, 0x00, 0x00,// C
0x08, 0x08, 0x08, 0x08, 0x08,// D
0x00, 0x60, 0x60, 0x00, 0x00,// E
0x20, 0x10, 0x08, 0x04, 0x02,// F
0x00, 0x00, 0x00, 0x00, 0x00,// 0
0x00, 0x00, 0x5F, 0x00, 0x00,// 1
0x00, 0x07, 0x00, 0x07, 0x00,// 2
0x14, 0x7F, 0x14, 0x7F, 0x14,// 3
0x24, 0x2A, 0x7F, 0x2A, 0x12,// 4
0x23, 0x13, 0x08, 0x64, 0x62,// 5
0x36, 0x49, 0x55, 0x22, 0x50,// 6
0x00, 0x05, 0x03, 0x00, 0x00,// 7
0x00, 0x1C, 0x22, 0x41, 0x00,// 8
0x00, 0x41, 0x22, 0x1C, 0x00,// 9
0x14, 0x08, 0x3E, 0x08, 0x14,// A
0x08, 0x08, 0x3E, 0x08, 0x08,// B
0x00, 0x50, 0x30, 0x00, 0x00,// C
0x08, 0x08, 0x08, 0x08, 0x08,// D
0x00, 0x60, 0x60, 0x00, 0x00,// E
0x20, 0x10, 0x08, 0x04, 0x02,// F
0x00, 0x06, 0x09, 0x09, 0x06,
0x00, 0x42, 0x7F, 0x40, 0x00,//
0x42, 0x61, 0x51, 0x49, 0x46,//
0x21, 0x41, 0x45, 0x4B, 0x31,//
0x18, 0x14, 0x12, 0x7F, 0x10,//
0x27, 0x45, 0x45, 0x45, 0x39,//
0x3C, 0x4A, 0x49, 0x49, 0x30,//
0x01, 0x71, 0x09, 0x05, 0x03,//
0x36, 0x49, 0x49, 0x49, 0x36,//
0x06, 0x49, 0x49, 0x29, 0x1E,//
0x00, 0x36, 0x36, 0x00, 0x00,//
0x00, 0x56, 0x36, 0x00, 0x00,//
0x08, 0x14, 0x22, 0x41, 0x00,//
0x14, 0x14, 0x14, 0x14, 0x14,//
0x00, 0x41, 0x22, 0x14, 0x08,//
0x02, 0x01, 0x51, 0x09, 0x06,//
0x7E, 0x11, 0x11, 0x11, 0x7E,//
0x7F, 0x49, 0x49, 0x49, 0x31,// 
0x7F, 0x49, 0x49, 0x49, 0x36,// 
0x7F, 0x01, 0x01, 0x01, 0x03,// 
0x60, 0x3E, 0x21, 0x21, 0x7F,// 
0x7F, 0x49, 0x49, 0x49, 0x41,// 
0x77, 0x08, 0x7F, 0x08, 0x77,// 
0x22, 0x41, 0x49, 0x49, 0x36,// 
0x7F, 0x10, 0x08, 0x04, 0x7F,// 
0x7F, 0x10, 0x09, 0x04, 0x7F,// 
0x7F, 0x08, 0x14, 0x22, 0x41,// 
0x40, 0x3E, 0x01, 0x01, 0x7F,// 
0x7F, 0x02, 0x0C, 0x02, 0x7F,// 
0x7F, 0x08, 0x08, 0x08, 0x7F,// 
0x3E, 0x41, 0x41, 0x41, 0x3E,//
0x7F, 0x01, 0x01, 0x01, 0x7F,// 
0x7F, 0x09, 0x09, 0x09, 0x06,// 
0x3E, 0x41, 0x41, 0x41, 0x22,// 
0x01, 0x01, 0x7F, 0x01, 0x01,// 
0x27, 0x48, 0x48, 0x48, 0x3F,// 
0x1E, 0x21, 0x7F, 0x21, 0x1E,// 
0x63, 0x14, 0x08, 0x14, 0x63,// 
0x3F, 0x20, 0x20, 0x3F, 0x60,// 
0x07, 0x08, 0x08, 0x08, 0x7F,// 
0x7F, 0x40, 0x7F, 0x40, 0x7F,// 
0x3F, 0x20, 0x3F, 0x20, 0x7F,// 
0x01, 0x7F, 0x48, 0x48, 0x30,//
0x7F, 0x48, 0x30, 0x00, 0x7F,//
0x00, 0x7F, 0x48, 0x48, 0x30,//
0x22, 0x41, 0x49, 0x49, 0x3E,//
0x7F, 0x08, 0x3E, 0x41, 0x3E,//
0x46, 0x29, 0x19, 0x09, 0x7F,//
0x20, 0x54, 0x54, 0x54, 0x78,//
0x3C, 0x4A, 0x4A, 0x4A, 0x30,//
0x7C, 0x54, 0x54, 0x28, 0x00,// 
0x7C, 0x04, 0x04, 0x04, 0x04,// 
0x60, 0x38, 0x24, 0x24, 0x7C,// 
0x38, 0x54, 0x54, 0x54, 0x18,// 
0x6C, 0x10, 0x7C, 0x10, 0x6C,//
0x00, 0x44, 0x54, 0x54, 0x28,// 
0x7C, 0x20, 0x10, 0x08, 0x7C,//
0x7C, 0x21, 0x12, 0x09, 0x7C,//
0x7C, 0x10, 0x28, 0x44, 0x00,// 
0x40, 0x38, 0x04, 0x04, 0x7C,// 
0x7C, 0x08, 0x10, 0x08, 0x7C,// 
0x7C, 0x10, 0x10, 0x10, 0x7C,// 
0x38, 0x44, 0x44, 0x44, 0x38,// 
0x7C, 0x04, 0x04, 0x04, 0x7C,//
0x7C, 0x14, 0x14, 0x14, 0x08,// 
0x38, 0x44, 0x44, 0x44, 0x00,// 
0x04, 0x04, 0x7C, 0x04, 0x04,// 
0x0C, 0x50, 0x50, 0x50, 0x3C,// 
0x08, 0x14, 0x7C, 0x14, 0x08,// 
0x44, 0x28, 0x10, 0x28, 0x44,// 
0x3C, 0x20, 0x20, 0x3C, 0x60,//
0x0C, 0x10, 0x10, 0x10, 0x7C,//
0x7C, 0x40, 0x7C, 0x40, 0x7C,//
0x3C, 0x20, 0x3C, 0x20, 0x7C,//
0x04, 0x7C, 0x50, 0x50, 0x20,// 
0x7C, 0x50, 0x20, 0x00, 0x7C,//
0x00, 0x7C, 0x50, 0x50, 0x20,//
0x28, 0x44, 0x54, 0x54, 0x38,//
0x7C, 0x10, 0x38, 0x44, 0x38,//
0x48, 0x54, 0x34, 0x14, 0x7C //
};


void OLED_init(void); // инициализация экрана
void sendCommand(unsigned char command);// отправка команды 
void LCD_Clear(void); // очистка
void LCD_Char(unsigned int c); //отправка символа
void LCD_Goto(unsigned char x, unsigned char y); // переход на нужную позицию
void OLED_string(char *string); / /отправка строчки
void OLED_num_to_str(unsigned int value, unsigned char nDigit);// преобразование цифры в текст

void sendCommand(uint8_t command_s){
temp[0] = COMAND;
temp[1] = command_s;
HAL_I2C_Master_Transmit(&hi2c2,OLED_adress,temp,2,100);
}

void sendData(uint8_t data_s){
temp[0] = DATA;
temp[1] = data_s;
HAL_I2C_Master_Transmit(&hi2c2,OLED_adress,temp,2,100);
}

void LCD_Goto(unsigned char x, unsigned char y){
LCD_X = x;
LCD_Y = y;
sendCommand(0xB0 + y);
sendCommand(x & 0xf);
sendCommand(0x10 | (x >> 4));
}

void LCD_Clear(void){
unsigned short i;
unsigned short x=0;
unsigned short y=0;
LCD_Goto(0,0);

for (i=0; i<(OLED_BUFFERSIZE); i++){ //(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8)
LCD_Char(‘ ‘);
x ++;
if(x>OLED_WIDTH){
   x =0;
   y++;
   LCD_Goto(0,y);
}
}
LCD_X =OLED_DEFAULT_SPACE;
LCD_Y =0;
}

void LCD_Char(unsigned int c){
unsigned char x = 0;
temp_char[0] = 0x40;
for (x=0; x<5; x++){
   temp_char[x+1] = LCD_Buffer[c*5+x];
}
temp_char[6] = 0;
HAL_I2C_Master_Transmit(&hi2c2, OLED_adress, temp_char, 7,1000);

LCD_X += 8;
if(LCD_X>OLED_WIDTH){
   LCD_X = OLED_DEFAULT_SPACE;
}
}

void OLED_string(char *string){
while(*string != ‘\0’)
{
LCD_Char(*string);
string++;
}
}

void OLED_num_to_str(unsigned int value, unsigned char nDigit){
switch(nDigit){
    case 5: LCD_Char(value/10000+48);
    case 4: LCD_Char((value/1000)%10+48);
    case 3: LCD_Char((value/100)%10+48);
   case 2: LCD_Char((value/10)%10+48);
   case 1: LCD_Char(value%10+48);
}
}

void OLED_init(void){
// Выключить дисплей
sendCommand(OLED_DISPLAYOFF);

sendCommand(OLED_SETDISPLAYCLOCKDIV);
sendCommand(0x80);

sendCommand(OLED_SETMULTIPLEX);
//sendCommand(0x1F);//128×32
sendCommand(0x3F);//128×64

sendCommand(OLED_SETDISPLAYOFFSET);
sendCommand(0x00);

sendCommand(OLED_SETSTARTLINE | 0x00);//0

// Используем внутреннюю подкачку
sendCommand(OLED_CHARGEPUMP);
sendCommand(0x14);

// Горизонтальный режим памяти
sendCommand(OLED_MEMORYMODE);
sendCommand(0x00);

sendCommand(OLED_SEGREMAP | 0x1);

sendCommand(OLED_COMSCANDEC);

sendCommand(OLED_SETCOMPINS);
//sendCommand(0x02);//128×32
sendCommand(0x12);//128×64

// Max contrast
sendCommand(OLED_SETCONTRAST);
//sendCommand(0x0F);//0xCF
sendCommand(0xCF);//0xCF

sendCommand(OLED_SETPRECHARGE);
sendCommand(0xF1);

sendCommand(OLED_SETVCOMDETECT);
//sendCommand(0x10);//0x40
sendCommand(0x40);//0x40

sendCommand(OLED_DISPLAYALLON_RESUME);

// Нормальный режим (не инверсный)
sendCommand(OLED_NORMALDISPLAY);

// Включаем дисплей
sendCommand(OLED_DISPLAYON);
}

Использование кода.

OLED_init();
LCD_Clear();
LCD_Goto(0,0);
OLED_string(«Ok»);
LCD_Goto(0,1);
OLED_string(«I2C include SSD1306»);
LCD_Goto(0,3);
LCD_Char(33);

gg=0;
while (1)
{
LCD_Goto(52,5); // переходим в нужную позицию.
OLED_num_to_str(gg++,5); // выводим символы с таблицы LCD_Buffer
HAL_Delay(500);
}
}