Обзор дисплея 128х160 точек с контроллером ST7735

Всем привет. Сегодня речь пойдет о дисплейном модуле  который можно приобрести на просторах китайских (и не лишь) магазинов примерно за 200-300р. Выглядит он вот так:

Ну ничего особенного: плата, дисплей, разъем для SD карточки. Пройдемся по ТТХ данного модуля:

  • Разрешение: 128х160;
  • Количество цветов: 262000;
  • Режимы цветового пространства: RGB444, RGB565, RGB888;
  • Напряжение питания: 5В (можно подавать и 3,3В, если запаять перемычку возле стабилизатора на плате);
  • Интерфейс подключения: SPI + служебные входы;
  • Управляющий контроллер: ST7735;
  • Размер модуля: 58х34,5 мм;
  • Размер активной области дисплея: 35х28 мм;

Настало время попытаться что-нибудь вывести на экран. Подключать мы его будем к STM32F103. Для подключения требуется 5 выводов (вообще-то у ST7735 есть и параллельный интерфейс, но тут выведен лишь SPI): SDA (MOSI), SCK, CS, A0 (RS), RESET. Ну и питание с подсветкой. Я сразу закатал дисплей в то устройство, где он будет использоваться. Уж очень хотелось проверить, как он туда становится.

С управлением все просто. Все отправляемые на дисплей данные делятся на два типа: команды и данные. Выбор осуществляется при помощи вывода A0 (RS). Когда вывод в высоком уровне дисплей воспринимает получаемую информацию, как данные. В противном случае — как команды. Т.е. управление предельно простое, главное не забывать вовремя дергать выводы RS и CS. А прочтение даташита на управляющий контроллер показало, что система команд до безобразия простая. Серьезно. Из всех цветных дисплеев, прошедших через мои руки, у данного экземпляра самая простая инициализация. Требуется всего 6 команд:

Send_CMD(0x01);
_delay_ms(12);

Send_CMD(0x11);
_delay_ms(12);

Send_CMD(0x3A);
Send_DAT(0x05);

Send_CMD(0x36);
Send_DAT(0xA0);

Send_CMD(0xB1);
Send_DAT16(0x000F);
Send_DAT16(0x000F);
Send_DAT16(0x000F);

Send_CMD(0x29);

Рассмотрим каждую из них подробнее:

  • 0x01 Программный сброс. При наличии аппаратного сброса команда необязательна;
  • 0x11 Выход из режима сна;
  • 0x3A Формат цифрового пространства. После команды передается 1 байт данных, в котором 3 первых бита используются для задания формата (011 — RGB444, 101 — RGB565, 110 — RGB666);
  • 0x36 Режим отрисовки данных из памяти дисплея. Проще говоря — ориентация. Работает аналогично предыдущей команде. Передается команда, а следом 1 байт данных, отвечающих за настройку.
  • 0xB1 Частота обновления дисплея. В принципе тоже необязательная команда, но без нее дисплей работает на минимальной частоте и видно мерцание. Здесь для настройки параметров используется целых 3 байта данных.
  • 0x29 Собственно, включение дисплея. Сразу после получения этой команды, дисплей должен залиться цветным шумом.

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

Send_CMD(0x2C);

После этого, все отправленные по SPI данные будут интерпретироваться как графические и выводиться на экран. Действие команды прекращается после перевода линии CS в высокий уровень. При записи в память адрес автоматически инкрементируется.

Теперь можно попробовать вывести что-то осмысленное. Для этого понадобятся невероятно полезные команды адресации памяти при помощи которых можно задать окно для отрисовки. Грубо говоря, прямоугольник, за пределы которого не будет выходить адресация памяти. Это позволяет здорово экономить процессорное время, т.к. отпадает надобность указывать адрес каждой строки. Достаточно установить окно и отправить данные. С адресацией дисплей разберется сам. Для установки окна есть 2 команды:

Send_CMD(0x2A);
Send_DAT(0x00);
Send_DAT(startX);
Send_DAT(0x00);
Send_DAT(stopX);

Send_CMD(0x2B);
Send_DAT(0x00);
Send_DAT(startY);
Send_DAT(0x00);
Send_DAT(stopY);

Каждая координата имеет размерность 16 бит, но разрешение дисплея всего 160х128, поэтому старшую половину можно смело записывать нулями. Теперь у нас есть все, что требуется для вывода любого изображения. Осталось написать функции для отрисовки графических примитивов и шрифтов. Функция вывода текста оптимизирована для работы со шрифтами с сайта http://www.rinkydinkelectronics.com/r_fonts.php Все, что требуется — это скачать шрифт, закинуть его в проект и указать в параметре функции вывода его название. Очень, знаете ли, удобно.

Для вывода текста служит функция:

LCD_PutString_(uint8_t x, uint8_t y, char *c, uint16_t T_color, uint16_t B_color, uint8_t space, uint8_t *font)

Тут все просто, указываем координаты начала строки, сам выводимый текст, цвет текста, цвет фона, размер пробела между символами и название шрифта. Получаем что-то вроде этого (тут у меня уже готовый интерфейс отрисован):

Яркости хватает с запасом.

Углы обзора у дисплея довольно неплохие, но, увы, лишь с 2-х сторон. Потому при установке дисплея в устройство необходимо продумать, как на него будут смотреть:

Можно вывести и картинку, для этого есть функция :

LCD_Image(uint8_t x, uint8_t y, int const *img, uint16_t w, uint16_t h);

Указываем координаты начала вывода, ссылку на массив с изображением, ширину и высоту картинки. И вуаля:

Теперь о скорости работы. У STM32F103 SPI тактируется от 32 МГц максимум, что дает скорость передачи данных 16 МБит (в случае непрерывного потока). Т.е. 2 мегабайта в секунду, что позволяет очень быстро заполнить память дисплея (40Кб для RGB 565) В результате заливка происходит практически незаметно для глаза, а вывод текста и примитивов вообще шикарно. Если же подключить дисплей к тому же AVR МК, то все будет гораздо медленнее. Тактирование 8МГц при максимальной частоте ядра в 16МГц, что дает всего 4Мбит, а значит 500Кб в секудну. В реальности скорость будет ещё ниже, т.к. непрерывно лить данные AVR не умеет. Т.е. заливка будет длиться что-то около 100мс. Хотя для того же текста скорости вполне хватит, если не пытаться зарисовать им сразу весь дисплей.

На этом, пожалуй, все. Дисплей понравился, неплохая яркость и цветопередача, простая настройка и подключение с использованием малого количества выводов МК. Самое то для всевозможных самоделок. Библиотеку для работы с дисплеем прикладываю. Передача данных не имеет привязки к конкретному МК. Для применения библиотеки с другим типом МК достаточно заменить наполнение функций Send_DAT, Send_DAT16, Send_CMD. Ну и небольшое видео напоследок.


Прикрепленные файлы:

Добавить комментарий

Ваш адрес email не будет опубликован.