Библиотека для работы с дисплеем 1602

Библиотека для работы с двухстрочным 16 символьным дисплеем.

Денис Заикин

Моя реализация библиотеки для дисплея 16х2 под управлением HD44780.

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

Краткие возможности:

  • управление отображением курсора;
  • вкл/выкл дисплея;
  • вывод текста в любое место;
  • поддержка специальных символов \n и \t;
  • вывод числа с преобразованием его в строку;
  • и др.

Особенности:

  • используется исключительно 4 битный режим;
  • данные из дисплея не читаются, используются задержки силами RTOS или циклом;
  • все сигналы DATA расположены в одном порту.

Зависимости: 

  • stdint.h - обязательно;
  • string.h - обязательно;
  • stdio.h - обязательно;
  • stm32f2xx.h - определения макросов GPIO_Pin_8, GPIOC и тп, в зависимости от контроллера файл может быть stm32f10x.h, stm32f40x.h и др;
  • FreeRTOS.h - опционально, если используется в проекте, то лучше включить;
  • task.h - обязательно если используется FreeRTOS.h;

Описание функций.

void LCD1602_Init( void );

Сама важная функция, должна быть запущена перед первым использование дисплея. Инициализирует дисплей для работы:

  • 4-битный режим работы;
  • инкремент курсора;
  • курсор невидимый;

void LCD1602_WriteUserSymbol( const uint8_t number, const uint8_t *data );

Используется для записи пользовательского символа в память дисплея в ячейку указанную в аргументе number

Пример использования:

// Массив определяется следующим образом:
//       00001110    - 0x0E
//       00011111    - 0x1F
//       00010001    - 0x11
//       00010001    - 0x11
//       00011111    - 0x1F
//       00011111    - 0x1F
//       00011111    - 0x1F
//       00000000    - ОБЯЗАТЕЛЬНО должно быть 0x00
uint8_t symbol[] = {0x0E, 0x1F, 0x11, 0x11, 0x1F, 0x1F, 0x1F, 0x00};

LCD1602_WriteUserSymbol( 1, symbol);

Последний элемент массива обязательно должен быть нулем, так как эта строка отведена под курсор в виде подчеркивания.

void LCD1602_CursorToHome( void );

Устанавливает курсор в начальное положение координаты (0; 0).

  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
┌-----------------------------------------------┐
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  0
---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  1
└-----------------------------------------------┘
┌-----------------------------------------------┐
|0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10|11|12|13|14|15|
---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|
└-----------------------------------------------┘

void LCD1602_CursorToPosition( const uint8_t position );

Устанавливает курсор в позицию указанную в аргументе position, который может принимать значения от 0 до 31 (от 0 до 1F).

void LCD1602_CursorToPositionXY( const uint8_t X, const uint8_t Y );

Устанавливает курсор в строку Y и ячейку X.

void LCD1602_CursorMode( const CursoreMode cursor );

Устанавливает режим отображения курсора:

  • CURSOR_HIDE - выключает вывод курсора;
  • CURSOR_STATIC - отображается статичным подчеркиванием;
  • CURSOR_BLINK - отображается мигающим прямоугольником

void LCD1602_ClearScreen( void );

Очищает дисплей.

void LCD1602_ScreenOnOff( const FunctionalState NewState );

Включает или отключает дисплей:

  • ENABLE - дисплей включен;
  • DISABLE - дисплей выключен

void LCD1602_PrintCharOfPosition( const uint8_t position, const char symbol );

Печатает символ в выбранной позиции.

void LCD1602_PrintStringOfPosition( const uint8_t position, const char *str );

Печатает нультерминальную строку начиная с выбранной позиции. При достижении конца текущей строки текст переносится на новую. Поддерживаются символы:

  • \n - Переносит текст на новую строку;
  • \t - Вставляет два пробела (пока так).

void LCD1602_PrintNumberOfPosition( const uint8_t position, const int32_t number );

Печатает число, переведенное в строку. Переводит с помощью функции sprintf.

void LCD1602_PrintCharOfPositionXY( const uint8_t X, const uint8_t Y, const char symbol );

Аналогично функции LCD1602_PrintCharOfPosition, только вместо позиции используются координаты.

void LCD1602_PrintStringOfPositionXY( const uint8_t X, const uint8_t Y, const char *str );

Аналогично функции LCD1602_PrintStringOfPosition, только вместо позиции используются координаты.

void LCD1602_PrintNumberOfPositionXY( const uint8_t X, const uint8_t Y, const int32_t number );

Аналогично функции LCD1602_PrintNumberOfPosition, только вместо позиции используются координаты.

void LCD1602_AppendChar( const char symbol );

Добавляет символ в конец последнего вывода.

void LCD1602_AppendString( const char *str );

Дописывает нультерминальную строку, не поддерживает \n и \t.

void LCD1602_AppendNumber( const int32_t number );

Дописывает число.

Настройка библиотеки

Перед использованием необходимо в файле lcd1602.h определить макросы:

#define LCD1602_USE_FREERTOS    1              ///< Определяет будет ли использоваться FREERTOS
#define MCU_CLOCK_USECOND       (1 << 4)       ///< Количество тиков счетчика микроконтроллера в микросекунду

#define PORT_RE                 GPIOC          ///< Порт сигнала RE, тип GPIO_TypeDef
#define PIN_RE                  GPIO_Pin_8     ///< Пин сигнала RE, GPIO_Pin_x где x равен 0..15

#define PORT_RS                 GPIOC          ///< Порт сигнала RS, тип GPIO_TypeDef
#define PIN_RS                  GPIO_Pin_9     ///< Пин сигнала RS, GPIO_Pin_x где x равен 0..15

#define PORT_DATA               GPIOB          ///< Порт сигналов DATA, тип GPIO_TypeDef
#define DATA_PIN0               GPIO_Pin_15    ///< Вывод сигнала DATA0, GPIO_Pin_x где x равен 0..15
#define DATA_PIN1               GPIO_Pin_14    ///< Вывод сигнала DATA1, GPIO_Pin_x где x равен 0..15
#define DATA_PIN2               GPIO_Pin_13    ///< Вывод сигнала DATA2, GPIO_Pin_x где x равен 0..15
#define DATA_PIN3               GPIO_Pin_12    ///< Вывод сигнала DATA3, GPIO_Pin_x где x равен 0..15

Исходники можно посмотреть в моём gitlab.com