Огляд дисплея 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. Ну і невелике відео наприкінці.

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

Top