PROGCONT.RU

Форма входа







Регистрация Вход/

Пример Пример Пример


STM32F101-107 HAL Driver для LCD SSD1306 экрана с разрешением 128x64.


NONO


Данный драйвер используется с библиотекой HAL.

Драйвер создан для упрощение работы с экранами на чипе SSD1306 разрешением 128x64, основной функционал это работа с текстом и вывод цифровой информации, а также не сложной графики это линии и прямоугольники, что будет достаточно для написания не сложных программ. Драйвер состоит из двух файлов это DefaultFonts.h библиотека символов и сам драйвер Drivers_SSD1306_01.h.

Скачать драйвер и библиотеку символов а также демо программу для IAR.

NO


Дополнительный материал.



Демо программа которая сделана для видео где реализованы все функции драйвера./*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.

NO


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();






Комментариев нет  Только зарегистрированные пользователи могут оставлять комментарии!