Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Обзор дисплея 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)

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

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

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

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

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. Ну и небольшое видео напоследок.

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

Теги:

Опубликована: Изменена: 25.05.2018 0 5
Я собрал 0 4
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 4 Проголосовало: 4 чел.

Комментарии (18) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
+1
andro #
А куда подевались Размер модуля и Размер активной области дисплея
Ответить
0

[Автор]
BARS_ #
Добавил, скоро появятся.
Ответить
0
Starik #
Уважаемый автор, объясните пожалуйста - зачем данному дисплею нужна SD карточка и что туда нужно записать - знакогенератор?
Ответить
0

[Автор]
BARS_ #
Дисплею она не нужна, туда можно вставить карточку и подключить ее к МУ по SPI. Ну а записать туда можно все, что душа пожелает
Ответить
0
Михаил #
Спасибо за статью, дисплей и правда очень недурственный, и отлично подходит для поделок. Сам недавно заказал пару штук для изучения. Был немного невнимателен сначала, и хотел спросить про отсутствие массива знакогенератора, но в статье на самом деле все есть. И шрифты там шикарные. А вот с массивом изображений пока непонятно...
Ответить
0

[Автор]
BARS_ #
А массив изображения - это просто массив из bmp файла. Т.е. открываем картинку в hex редакторе, копируем все, что является данными изображения (см. структуру bmp файла) и вставляем в массив. Дальше этот массив просто выводим на дисплей.
Ответить
+1
Михаил #
Спасибо. Теперь вопросов не осталось.
Ответить
0
Starik #
Уважаемый BARS, ещё один вопрос. Какой ток потребляет дисплей? Буду очень благодарен, если найдёте время ответить.
Ответить
0

[Автор]
BARS_ #
1.8 мА сам дисплей и 43 мА подсветка. Напряжение 3,3В.
Ответить
+1
Лекс 59 #
Спасибо Автору. Полезный и достаточно качественный обзор. Дисплейчик интересный и не из дорогих. А многое, из информации данного обзора, я не встречал пока в других источниках.
Ответить
0
andro #
Какова цена модуля? И можно ли на его базе собрать автономный AVR программатор mPROG?
Ответить
0

[Автор]
BARS_ #
Цена в начале статьи. Собрать можете все, что угодно, это просто дисплей. А куда его подключать - ваш выбор
Ответить
0
andro #
Да я видел, в начале статьи есть ссылка, но по ней находятся другие дисплеи.
Ответить
+1

[Автор]
BARS_ #
Вот конкретно тот, что в статье https://www.aliexpress.com/item/1-8-inch-TFT-LCD-Display-module-ST7735S-128x160-51-AVR-STM32-ARM-8-16-bit/2055099048.html
Ответить
+1
andro #
Нормально, благодарю.
Ответить
0
ALex #
Не работает
_delay_ms заменил на HAL_Delay
Выхода GPIO Дергаю через BRR и BSRR(дернул из проверенной в работе библиотеки)
#define LCD_RST_L ST7735_RES_GPIO_Port -> BRR = ST7735_RES_Pin
#define LCD_RST_H ST7735_RES_GPIO_Port -> BSRR = ST7735_RES_Pin
Ответить
0
ALex #
Заработало когда включил SPI
В функции LCD_Init перед всеми командами вставил SPI1->CR1 |= SPI_CR1_SPE;
И все заработало
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
USB осциллограф DSO-2090 Сатфайндер
вверх