STM32F101-107 HAL Driver для LCD SSD1306 экрана с разрешением 128x64.
Драйвер создан для упрощение работы с экранами на чипе SSD1306 разрешением 128x64, основной функционал это работа с текстом и вывод цифровой информации, а также не сложной графики это линии и прямоугольники, что будет достаточно для написания не сложных программ. Драйвер состоит из двух файлов это DefaultFonts.h библиотека символов и сам драйвер Drivers_SSD1306_01.h.
Скачать драйвер и библиотеку символов а также демо программу для IAR.
Дополнительный материал.
Демо программа которая сделана для видео где реализованы все функции драйвера.
/*ProgCont.ru*/
#include "main.h"
#include "Drivers_SSD1306_01.h"
void SystemClock_Config(void);
uint8_t symbolArr1[]={112,145,137,131,134,147,2};//Привет!
uint8_t symbolArr2[]={126,147,143};//Это
uint8_t symbolArr3[]={141,129,140,134,142,157,139,137,138};//маленький
uint8_t symbolArr4[]={153,145,137,149,147,15};//шрифт.
uint8_t symbolArr5[]={146,145,134,133,142,137,138};//средний
uint8_t symbolArr6[]={120,97,114,124};//Часы
uint8_t symbolArr7[]={119,105,117,113,124};//Цифры
void Display_ProgCont( void);
void Display_Demo_Drver( void);
void Display_Demo_Fonts( void);
void Display_Demo_Numbers( void);
void Display_Demo_Number( void);
void Display_Demo_Watch( void);
void Display_Demo_Time( void);
void Display_Demo_Scale( void);
void Display_Demo__Grid( void);
void Display_Demo__Chart( void);
int main(void){
SystemClock_Config();
SSD1306_I2C1Init();
SSD1306_lcdInit();
SSD1306_setContrast(0);
SSD1306_clearScreen();
SSD1306_connectingLibraryFont(MediumFontRus);
HAL_Delay(2000);
while (1){
Display_ProgCont();
Display_Demo_Drver();
Display_Demo_Fonts();
Display_Demo_Numbers();
Display_Demo_Number();
Display_Demo_Watch();
Display_Demo_Time();
Display_Demo_Scale();
Display_Demo__Grid();
HAL_Delay(1000);
}
}
void SystemClock_Config(void){
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}
void Display_ProgCont( void){
SSD1306_displayText( 0, 1, "ProgCont", 8, Off);
SSD1306_displayText( 92, 1, ".ru", 3, Off);
SSD1306_displayText( 15, 4, "presents", 8, Off);
for( uint16_t count = 0; count < 210; count++){SSD1306_setContrast((uint8_t)count);HAL_Delay(15);}
HAL_Delay(2000);
SSD1306_clearScreen();
}
void Display_Demo_Drver( void){
SSD1306_displayText( 40, 0, "DEMO", 4, Off);
SSD1306_displayText( 5, 2, "Driver for", 10, Off);
SSD1306_displayText( 20, 4, "SSD1306", 7, Off);
SSD1306_displayText( 40, 6, "v_01", 4, Off);
HAL_Delay(1000);
SSD1306_inverseDisplay(On);
HAL_Delay(300);
SSD1306_inverseDisplay(Off);
HAL_Delay(300);
SSD1306_inverseDisplay(On);
HAL_Delay(300);
SSD1306_inverseDisplay(Off);
HAL_Delay(300);
for( uint16_t count = 40; count < 128; count ++){ SSD1306_displayText( count, 0, "DEMO", 4, Off); HAL_Delay(5);}
for( uint16_t count = 5; count < 128; count ++){ SSD1306_displayText( count, 2, "Driver for", 10, Off); HAL_Delay(5);}
for( uint16_t count = 20; count < 128; count ++){ SSD1306_displayText( count, 4, "SSD1306", 7, Off); HAL_Delay(5);}
for( uint16_t count = 40; count < 128; count ++){ SSD1306_displayText( count, 6, "v_01", 4, Off); HAL_Delay(5);}
}
void Display_Demo_Fonts( void){
SSD1306_connectingLibraryFont(SmallFontRus);
SSD1306_displayTextByNumber( 40, 0, symbolArr1, 7, Off);
SSD1306_displayTextByNumber( 52, 2, symbolArr2, 3, Off);
SSD1306_displayTextByNumber( 35, 4, symbolArr3, 9, Off);
SSD1306_displayTextByNumber( 48, 6, symbolArr4, 6, Off);
HAL_Delay(2000);
SSD1306_clearScreen();
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayTextByNumber( 20, 0, symbolArr1, 7, Off);
SSD1306_displayTextByNumber( 40, 2, symbolArr2, 3, Off);
SSD1306_displayTextByNumber( 20, 4, symbolArr5, 7, Off);
SSD1306_displayTextByNumber( 30, 6, symbolArr4, 6, Off);
HAL_Delay(2000);
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayTextByNumber( 20, 0, symbolArr1, 7, On);
HAL_Delay(800);
SSD1306_displayTextByNumber( 40, 2, symbolArr2, 3, On);
HAL_Delay(800);
SSD1306_displayTextByNumber( 20, 4, symbolArr5, 7, On);
HAL_Delay(800);
SSD1306_displayTextByNumber( 30, 6, symbolArr4, 6, On);
HAL_Delay(2000);
SSD1306_clearScreen();
}
void Display_Demo_Numbers( void){
SSD1306_connectingLibraryFont(MediumFontRus);
for( uint16_t count = 7; count > 0; count--){
SSD1306_clearScreen();
SSD1306_displayTextByNumber( 33, count, symbolArr7, 5, Off);
HAL_Delay(300);
}
HAL_Delay(1000);
for( uint16_t count = 1; count < 7; count++){
SSD1306_clearScreen();
SSD1306_displayTextByNumber( 33, count, symbolArr7, 5, Off);
HAL_Delay(100);
}
SSD1306_clearScreen();
HAL_Delay(300);
}
void Display_Demo_Number( void){
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayText( 10, 0, "SmallFont", 9, Off);
SSD1306_connectingLibraryFont(SmallFontRus);
for( uint16_t count = 1000; count > 0; count--){
SSD1306_displayNumber( 50, 4, count-1, 4, Off);
HAL_Delay(2);}
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayText( 5, 0, "MediumFont", 10, Off);
SSD1306_connectingLibraryFont(MediumFontRus);
for( uint16_t count = 1000; count > 0; count--){
SSD1306_displayNumber( 40, 4, count-1, 4, Off);}
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayText( 5, 0, "MediumNumb", 10, Off);
SSD1306_connectingLibraryFont(MediumNumbers);
for( uint16_t count = 1000; count > 0; count--){
SSD1306_displayNumber( 40, 4, count-1, 4, Off);}
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayText( 5, 0, "BigNumbers", 10, Off);
SSD1306_connectingLibraryFont(BigNumbers);
for( uint16_t count = 1000; count > 0; count--){
SSD1306_displayNumber( 35, 4, count-1, 4, Off);}
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayText( 5, 0, "MegaNumber", 10, Off);
SSD1306_connectingLibraryFont(MegaNumbers);
for( uint16_t count = 1000; count > 0; count--){
SSD1306_displayNumber( 15, 3, count-1, 4, Off);}
HAL_Delay(1000);
SSD1306_clearScreen();
}
void Display_Demo_Watch( void){
SSD1306_connectingLibraryFont(MediumFontRus);
for( uint16_t count = 7; count > 0; count--){
SSD1306_clearScreen();
SSD1306_displayTextByNumber( 40, count, symbolArr6, 4, Off);
HAL_Delay(300);
}
HAL_Delay(1000);
for( uint16_t count = 1; count < 7; count++){
SSD1306_clearScreen();
SSD1306_displayTextByNumber( 40, count, symbolArr6, 4, Off);
HAL_Delay(100);
}
SSD1306_clearScreen();
HAL_Delay(300);
}
void Display_Demo_Time( void){
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayText( 10, 0, "SmallFont", 9, Off);
SSD1306_connectingLibraryFont(SmallFontRus);
for( uint16_t count = 43200; count < 43206; count++){
SSD1306_displayTime( 40, 4, count, On, On, Off);
HAL_Delay(1000);}
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayText( 5, 0, "MediumFont", 10, Off);
SSD1306_connectingLibraryFont(MediumFontRus);
for( uint16_t count = 43200; count < 43206; count++){
SSD1306_displayTime( 15, 4, count, On, On, Off);
HAL_Delay(1000);}
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayText( 5, 0, "MediumNumb", 10, Off);
SSD1306_connectingLibraryFont(MediumNumbers);
for( uint16_t count = 43200; count < 43206; count++){
SSD1306_displayTime( 15, 4, count, On, On, Off);
HAL_Delay(1000);}
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayText( 5, 0, "BigNumbers", 10, Off);
SSD1306_connectingLibraryFont(BigNumbers);
for( uint16_t count = 43200; count < 43206; count++){
SSD1306_displayTime( 5, 4, count, On, On, Off);
HAL_Delay(1000);}
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayText( 5, 0, "MegaNumber", 10, Off);
SSD1306_connectingLibraryFont(MegaNumbers);
for( uint16_t count = 43200; count < 43206; count++){
SSD1306_displayTime( 5, 3, count, Off, count&1, Off);
HAL_Delay(1000);}
HAL_Delay(1000);
SSD1306_clearScreen();
}
void Display_Demo_Scale( void){
SSD1306_connectingLibraryFont(MediumFont);
SSD1306_displayText( 22, 0, "Loading", 7, Off);
SSD1306_displayText( 76, 3, "%", 1, Off);
for( uint16_t count = 0; count < 101; count++){
SSD1306_displayNumber( 40, 3, count, 3, Off);
SSD1306_displayRect( 16, 44, count+16, 60, Off);
HAL_Delay(10);}
HAL_Delay(500);
SSD1306_connectingLibraryFont(MediumFont);
SSD1306_displayText( 22, 0, "Loading", 7, Off);
SSD1306_displayText( 76, 3, "%", 1, Off);
for( uint16_t count = 0; count < 101; count++){
SSD1306_displayNumber( 40, 3, 100 - count, 3, Off);
SSD1306_displayRect( 100 - count + 16, 44, 116, 60, On);
HAL_Delay(10);}
HAL_Delay(1000);
SSD1306_clearScreen();
}
void Display_Demo__Grid( void){
for( uint16_t count = 0; count < 64; count+=8){
SSD1306_displayRect( 0, count, 127, count, Off);
HAL_Delay(60);}
for( uint16_t count = 0; count < 128; count+=8){
SSD1306_displayRect( count, 0, count, 63, Off);
HAL_Delay(60);}
SSD1306_displayText( 20, 3, "THE END", 7, Off);
HAL_Delay(1000);
for( uint16_t count = 0; count < 211; count++){SSD1306_setContrast((uint8_t)220-count);HAL_Delay(15);}
SSD1306_clearScreen();
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line){}
#endif /* USE_FULL_ASSERT */
Функции драйвера.
void SSD1306_I2C1Init(void)-настраивает I2C;
void SSD1306_lcdInit(void)-функция настраивает LCD для приёма информации;
void SSD1306_SendCommand( I2C_HandleTypeDef *hi2cS, uint8_t* data, uint8_t size)-функция передаёт в LCD команды;
void SSD1306_SendData( I2C_HandleTypeDef *hi2cS, uint8_t *data, uint16_t size)-функция отсылает в LCD данные;
void SSD1306_setAddressDisplays(uint8_t page_start, uint8_t col_start, uint8_t page_stop, uint8_t col_stop)-функция устанавливает область экрана для отображения;
void SSD1306_connectingLibraryFont(const uint8_t* library_font)-функция подключает нужную библиотеку символов;
void SSD1306_displayString( uint8_t text_x, uint8_t text_y, char* text, uint16_t count, uint8_t invers, uint8_t offsetTab)-функция используется другими функциями для вывода символов и текста;
void SSD1306_displayText( uint8_t text_x, uint8_t text_y, char* text, uint16_t count, uint8_t invers)-функция отображает знаки и текст с латинскими буквами;
void SSD1306_displayTextByNumber( uint8_t text_x, uint8_t text_y, uint8_t* number, uint16_t count, uint8_t invers)-функция отображает знаки, текс по номеру символа в таблице, используется для отображения текста с кириллицей;
void SSD1306_displayNumber( uint8_t text_x, uint8_t text_y, uint32_t display_number, uint16_t count_number, uint8_t invers)-функция отображает число;
void SSD1306_displayTime( uint8_t time_x, uint8_t time_y, uint32_t time, uint8_t sec, uint8_t dot, uint8_t invers)-функция отображает часы;
void SSD1306_displayRect( uint8_t x_start, uint8_t y_start, uint8_t x_stop, uint8_t y_stop, uint8_t erase)-функция отображает прямоугольник;
void SSD1306_clearScreen(void)-функция очищает экран;
void SSD1306_setContrast(uint8_t contrast)-функция устанавливает яркость;
void SSD1306_setZoom(uint8_t cond)-функция увеличивает содержимое экрана;
void SSD1306_inverseDisplay(uint8_t com)-функция включает инверсия экрана и отключает;
void SSD1306_scrollingInit(void)-функция настраивает экран для смещения содержимого в автоматическом режиме вправо;
void SSD1306_scrollingCommandStart(void)-функция запускает смещение содержимого экрана вправо в автоматическом режиме;
void SSD1306_scrollingCommandStop(void)-функция останавливает смещение вправо.
Описание функций.
Функция настраивает I2C1 и его выводы GPIOB.6(SCK) GPIOB.7(SDA) для взаимодействия с LCD SSD1306.
void SSD1306_I2C1Init(void);
/*Пример выполнения*/
SSD1306_I2C1Init();
Функция проводит инициализацию LCD и настраивает его для отображения информации.
void SSD1306_lcdInit(void);
/*Пример использования*/
SSD1306_lcdInit();
Функция является внутренней функцией драйвера но по не обходимости можно использовать, функция передаёт в LCD массив команд.
void SSD1306_SendCommand( uint8_t* data, uint8_t size);
/*Функция принимает параметры*/
uint8_t* data-адрес массива с командами;
uint8_t size-количество передаваемых команд в массиве.
/*Пример применения*/
uint8_t dataArr[1];
dataArr[0] = 0xA7;
SSD1306_SendCommand( dataArr, 1);
Функция является внутренней функцией драйвера но по не обходимости можно использовать, функция передаёт в LCD данные для отображения.
void SSD1306_SendData( uint8_t *data, uint16_t size);
/*Функция принимает параметры*/
uint8_t* data-адрес массива с данными;
uint8_t size-количество передаваемых данных в массиве.
/*Пример применения*/
/*Массив для символа ′>′.*/
uint8_t data_symbol[] = {0b00000001, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 0b00100000, 0b01000000, 0b10000000, 0b00000000, 0b10000000, 0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100, 0b00000010, 0b00000001};
/*Выводим символ ′>′.*/
SendData( data_symbol, 18);
Функция является внутренней функцией драйвера но по не обходимости можно использовать, функция устанавливает область экрана для отображения, выполняется перед выводом изображения в LCD.

void SSD1306_setAddressDisplays(uint8_t page_start, uint8_t col_start, uint8_t page_stop, uint8_t col_stop);
/*Принимаемые параметры*/
page_start-стартовая страница для изображения;
col_start-стартовый ряд для изображения;
page_stop-конечная страница;
col_stop-конечный ряд.
/*Пример использования*/
SSD1306_setAddressDisplays( 0, 2, 1, 10);
Функция подключает для отображения символов нужную библиотеку, изменять библиотеки можно не ограничено раз в коде программы.
void SSD1306_connectingLibraryFont(const uint8_t* library_font);
/*Принимает адрес библиотеки*/
/*Варианты*/
SmallFont-текстовая библиотека
SmallFontRus-текстовая библиотека
MediumFont-текстовая библиотека
MediumFontRus-текстовая библиотека
MediumNumbers-цифровая библиотека
BigNumbers-цифровая библиотека
MegaNumbers-цифровая библиотек
/*Пример*/
SSD1306_connectingLibraryFont(MediumFont);
Функция является внутренней функцией драйвера но по не обходимости можно использовать, выводит по принимаемым координатам символ или текст, координаты начинают отсчёт с верхнего левого угла.
void SSD1306_displayString( uint8_t text_x, uint8_t text_y, char* text, uint16_t count, uint8_t invers, uint8_t offsetTab);
/*Принимаемые параметры*/
text_x-координата по X(ряд), от 0 до 127;
text_y-координата по Y(страница), от 0 до 7;
text-массив символов;
count-количество отображаемых символов из массива;
invers-включить On инверсию отображения или Off отключить;
offsetTab-смещения относительно кодировки ASCII, определяется в библиотеке символов третьим байтом, для текстовых библиотек будет 32 для цифровых 45.
/*Пример использования текстовых библиотек*/
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayString( 20, 3, "Hello!", 6, Off, 32);
/*Для цифровых библиотек*/
SSD1306_connectingLibraryFont(MediumNumbers);
SSD1306_displayString( 20, 3, "123456", 6, Off, 45);
Функция выводит на экран LCD символы, текст. Используется для английского алфавита.
void SSD1306_displayText( uint8_t text_x, uint8_t text_y, char* text, uint16_t count, uint8_t invers);
/*Принимаемые параметры*/
text_x-координата по X(ряд), от 0 до 127;
text_y-координата по Y(страница), от 0 до 7;
text-массив символов;
count-количество отображаемых символов из массива;
invers-включить On инверсию отображения или Off отключить.
/*Пример применения*/
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayText( 0, 3, "Hello1234", 9, Off);
Функция используется для вывода русских букв, текстов а также символов по порядковому номеру символа в библиотеке.
void SSD1306_displayTextByNumber( uint8_t text_x, uint8_t text_y, uint8_t* number, uint16_t count, uint8_t invers);
/*Принимаемые параметры*/
text_x-координата по X(ряд), от 0 до 127;
text_y-координата по Y(страница), от 0 до 7;
number-массив номеров символов(текста);
count-количество отображаемых символов из массива;
invers-включить On инверсию отображения или Off отключить.
/*Пример использования*/
uint8_t symbolArr1[]={112,145,137,131,134,147,2};//Привет!
SSD1306_connectingLibraryFont(MediumFontRus);
SSD1306_displayTextByNumber( 20, 0, symbolArr1, 7, Off);
Функция отображает число значение которого может быть от 0 до 9999999.
void SSD1306_displayNumber( uint8_t text_x, uint8_t text_y, uint32_t display_number, uint16_t count_number, uint8_t invers);
/*Принимаемые параметры*/
text_x-координата по X(ряд), от 0 до 127;
text_y-координата по Y(страница), от 0 до 7;
display_number-число формата uint32_t от 0 до 9999999;
count_number-количество отображаемых цифер, отсчёт от меньшего значения;
invers-включить On инверсию отображения или Off отключить.
/*Пример использования*/
SSD1306_connectingLibraryFont(BigNumbers);
for( uint32_t count = 1000; count > 0; count--){
SSD1306_displayNumber( 35, 4, count, 4, Off);
}
Функция отображает часы формата Часы:Минуты:Секунды или Часы:Минуты.
void SSD1306_displayTime( uint8_t time_x, uint8_t time_y, uint32_t time, uint8_t sec, uint8_t dot, uint8_t invers);
/*Принимаемые параметры*/
time_x-координата по X(ряд), от 0 до 127;
time_y-координата по Y(страница), от 0 до 7;
time-время формат uint32_t секунды*минуты*часы;
sec-отображать секунды On или нет Off;
dot-отображать разделяющие точки On или нет Off;
invers-включить On инверсию отображения или Off отключить.
/*Пример применения*/
SSD1306_connectingLibraryFont(BigNumbers);
for( uint32_t count = 43200; count < 43206; count++){
SSD1306_displayTime( 5, 4, count, On, On, Off);
HAL_Delay(1000);
}
Функция отображает закрашенный прямоугольник, минимальный размер 1 пиксель и максимальный весь экран. Применяется также для рисования линий.
void SSD1306_displayRect( uint8_t x_start, uint8_t y_start, uint8_t x_stop, uint8_t y_stop, uint8_t erase);
/*Принимаемые параметры*/
x_start-координата верхнего-левого угла по X прямоугольника значение от 0 до 127;
y_start-координата верхнего-левого угла по Y прямоугольника значение от 0 до 63;
x_stop-координата нижнего-правого угла по X прямоугольника значение от 0 до 127;
y_stop-координата нижнего-правого угла по Y прямоугольника значение от 0 до 63;
erase-стереть нужную область это On отобразить Off.
/*Пример применение*/
SSD1306_displayRect( 16, 44, 32, 60, Off);
Функция очищает экран.
void SSD1306_clearScreen(void);
/*Пример*/
SSD1306_clearScreen();
Функция устанавливает яркость экрана.
void SSD1306_setContrast(uint8_t contrast);
/*Принимает параметр*/
contrast-значение от 0 до 255(максимальная яркость).
/*Пример*/
SSD1306_setContrast(100);
Функция является аппаратной контроллера SSD1306, увеличивает содержимое экрана.
void SSD1306_setZoom(uint8_t cond);
/*Принимает параметр*/
cond-On увеличить Off уменьшить.
/*Пример*/
SSD1306_setZoom(On);
Функция инвертирует цвета экрана.
void SSD1306_inverseDisplay(uint8_t com);
/*Принимает параметр*/
com-On инвертировать Off нормальное отображение.
/*Пример*/
SSD1306_inverseDisplay(On);
Функция является аппаратной контроллера SSD1306, запускает смещение вправо содержимого экрана.
Инициализация процесса сдвига, выполняется перед стартом.
void SSD1306_scrollingInit(void);
Запуск смещения.
void SSD1306_scrollingCommandStart(void);
Остановка смещение.
void SSD1306_scrollingCommandStop(void);
/*Пример*/
SSD1306_scrollingInit();
SSD1306_scrollingCommandStart();