Подключение TFT-дисплея к AVR.

Итак, всем привет)
Купил я на ибее такой дисплейчик:

Преимущества-цветной, есть разъем для SD-карты, последовательный интерфейс(SPI), низкая цена, возможность работы с 3.3В и 5В.

Недостатки-за такую цену я не нашел, кроме одного-мало информации на русском языке.
Путем гугления и перебора кучи инфы узнал, что контроллер ST7735, что собственно, ничего мне дало.
Единственным источником информации оказались примеры кода, которые шли в архиве у продавца. Там были примеры для STM32 и C51. Именно из примеров для С51 я и выдирал инициализацию и прочее.
Для начала параметры дисплея:
Диагональ: 1.8 дюйма
Разрешение: 128х160 пикселей
Цвет: цветной, 16-битный цвет, формат RRRRRGGGGGGBBBBB. То есть, по 5 бит на красный и синий цвета и 6 бит на зеленый(ибо человеческий глаз чувствительнее к зеленому).
Интерфейс: SPI. Причем, для SD-карты и дисплея выводы SPI разные. То есть, имеем два SPI-для дисплея и карты. В моей либе SPI программный, так что можно подключить к любому порту.
Подсветка: есть. Чтобы ее включить, нужно подать на вывод BL(BackLight) логическую 1. А еще подсветка вполне регулируется, так что можно подать туда ШИМ, что я, собственно, и сделал.
Потребление: в районе 40mA со включенной на всю подсветкой, если мне не врет мультиметр за 120 рублей.
Габариты:44.96х53.47(мм).
Итак, начну повествование.
Подробнейшего разбора кода не будет, ибо имена у всех функций «говорящие» и разобраться не составит труда(код, кстати, написан на Си, среда-IAR).
До написания полноценного UI у меня дело пока что не дошло, но все к этому идет.
Итак, вот функции, которые есть:

void write_byte(unsigned char c,unsigned char com);
void Reset();
void TFTInit();
void WriteTwoByte(unsigned char LCD_DataH,unsigned char LCD_DataL);
void TFTSingleColor(unsigned int color);
void WriteChar8x11(unsigned char x0, unsigned char y0, unsigned char s, unsigned int color);
void WriteChar5x7(unsigned char x0,unsigned char y0,unsigned char s,unsigned int color);
void WriteString8x11(unsigned char x0,unsigned char y0,unsigned char *s,unsigned int color);
void WriteString5x7(unsigned char x0,unsigned char y0,unsigned char *s,unsigned int color);
void DrawLine(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned int color);
void DrawRectangle(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned int color, unsigned char fill);
void DrawCircle(unsigned char x0, unsigned char y0, unsigned char R, unsigned int color, unsigned char fill);
void DrawTriangle(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned int color, unsigned char fill);
void BacklightInit();

Начинаю подробный разбор:
void write_byte(unsigned char c,unsigned char com)
-где с-это байт, который надо передать дисплею, а com определяет, что выводим: команду или данные, если 0-команда, если 1-данные.
void Reset()
-название говорит само за себя. Сброс дисплея))))
void TFTInit()
-инициализация дисплея
void WriteTwoByte(unsigned char LCD_DataH,unsigned char LCD_DataL)
-название говорит само за себя))) Передать дисплею 2 байта. Использую для того, чтобы передать дисплею цвет.
void TFTSingleColor(unsigned int color)
-закрасить дисплей цветом color.

Перед тем, как перейти к выводу текста, хочу сказать, что весь дисплей у меня разделен на знакоместа. Ориентация у меня горизонтальная, так что, если пишем шрифтом 8х11, то по горизонтали умещается 20 символов(160=8х20), а по вертикали 11 строк(128=11х11+7). Для шрифта 5х7: строк 18(128=7*18+2), а столбцов 32(160=5*32)
void WriteChar8x11(unsigned char x0, unsigned char y0, unsigned char s, unsigned int color)
-вывести символ s шрифтом 8х11 цветом color в строке y0 и столбце x0
void WriteChar5x7(unsigned char x0, unsigned char y0, unsigned char s, unsigned int color)
-вывести символ s шрифтом 5х7 цветом color в строке y0 и столбце x0
void WriteString8x11(unsigned char x0,unsigned char y0,unsigned char *s,unsigned int color)
-вывести строку s шрифтом 8х11 цветом color, начиная со строки y0 и столбца x0
void WriteString5x7(unsigned char x0,unsigned char y0,unsigned char *s,unsigned int color)
-вывести строку s шрифтом 5х7 цветом color, начиная со строки y0 и столбца x0
void DrawLine(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned int color)
-нарисовать линию цветом color, идущую из точки с координатами (x0,y0) в точку (x1,y1). Используется алгоритм Брезенхэма.
void DrawRectangle(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned int color, unsigned char fill)
-нарисовать прямоугольник с координатами вершин (x0,y0)-левая верхняя и (x1,y1)-нижняя правая вершины, цветом color. Также, если fill 0, то прямоугольник незакрашенный, а если 1-то закрашенный.
void DrawCircle(unsigned char x0, unsigned char y0, unsigned char R, unsigned int color, unsigned char fill)
-нарисовать окружность с центром а точке (x0,y0) и радиусом R(радиус в пикселях) цветом color. Если fill 0, то это окружность, а если fill 1, то круг цвета color. Так же используется алгоритм Брезенхэма.
void DrawTriangle(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned int color, unsigned char fill)
-нарисовать треугольник с координатами вершин (x0,y0), (x1,y1), (x2,y2). Если fill 0, то треугольник незакрашенный, если fill 1-закрашенный. Но! Я пока что не нашел достаточно простого алгоритма для закрашивания произвольного треугольника. Так что, fill пока что только 0. Может, есть у кого идеи?
void BacklightInit()
-инициализация подсветки.

Ну, на этом почти все.
Хотел бы добавить, что оба шрифта имеют в своем составе кириллицу, что не может не радовать)))
Ну и напоследок эксклюзивчик)))

Ссылка на ебее. Нашел самый дешевый, вроде.
Ссылка на архив с исходниками(рейтинга мало для загрузки)
  • +9
  • 29 января 2014, 14:18
  • Pika4u56

Комментарии (67)

RSS свернуть / развернуть
Было уже. JDT-1800 — это он.
0
Хм, а я эту статью не заметил, странно(. Но там под STM32 все же. Да и самому написать либы никогда не мешает. И так и не понял я, есть ли там функции для рисования.
0
Есть.
0
А, ну окей) Теперь и под AVR код есть)
0
Вообще-то код под AVR есть давно, покопайтесь на github.com/adafruit.
0
Забыл сказать, на плате есть 2 ряда контактов-8-контактная гребенка и 16-контактная. Так вот, сначала я словил кучу лулзов из-за того, что не работало ничего. Потом подпаялся к 16-контактной гребенке и все заработало. Так что, это нужно иметь ввиду.
0
Привет! А нельзя распиновку привести хотя бы текстом? Ну или просто фотографию, если там пины подписаны? Гребёнка 16 пиновая 2 по 8 с шагом 2.54мм?
0
А ещё для него какой-никакой чертёж есть с размерами и расположением отверстий?
0
Ох, извините. Но ещё 3 вопроса. Сам нашёл вид с обратной стороны на e-Bay внизу страницы. Но, видимо, там не совсем такой же, т.к. 8 контактной гребёнки там нет и BL пина тоже нет.

1) Разъём для SD карты подключен к MISO, MOSI, SCK и CS, обведённым в рамочку? Правильно?

2) Ещё там видно CS, SCK, SDA. Это для SPI записи в дисплей?

3) И что за пины AO, LED+ и LED-?
0
1.Гребенка 16-пиновая в 1 ряд)))
2.Чертеж есть в архиве на странице товара)))
3.Напишите почту, кину фото обратной стороны в качестве)))
0
Заказал сразу после выхода данного поста, но руки до дисплея дошли только сейчас. Тоже думал дисплей не пашет или библиотека неверная для работы с ним. Оказалось неверно понял распиновку. Правда у меня не оказалось 8-ми пинового разъема, а вместо него SD карта — видимо он и есть 8 пин + 2 питание/земля. Вот решил нарисовать подключение, минимальный набор, чтобы и самому не потерять. Использовал arduino с библиотекой Adafruit_ST7735.
0
Как у него с инерционностью? Скажем, если выводить меняющееся несколько раз в секунду число, смазывание заметно?
Есть возможность замерить токопотребление в статике без подсветки? Без неё, кстати, как, видно что-нибудь?
И, если не лень, было бы хорошо добавить в статью габариты дисплея и платки, для полной завершенности.
0
  • avatar
  • ACE
  • 29 января 2014, 15:57
С инерционностью-честно, не пробовал еще, но закрашивание всего экрана происходит чуть меньше.чем за 1с(ATMega32, 20 МГц). Без подсветки вообще ничего не видно(только если под большим углом посмотреть на свету), именно для этого я и добавил ШИМ вывода подсветки). Потребление в районе 40mA, сейчас сам чешу репу, как бы его снизить. Габариты:44.96х53.47(мм).
0
С аппаратным SPI скорость намного выше. Кроме того, дисплей корректно работает если CS дергать только на блочную передачу, так что можно, например, сформировать блок данных и в один прием его заслать. Визуально скорость закраски в таком режиме не заметна на глаз. Сам дисплей тоже не тормозит, так что смазывания особо не заметно.
0
На дисплей (не платку, а именно дисплей) есть даташит, там все подробно расписано. К слову, у дисплея есть еще и I2C, но его используют редко из-за тормозов.
0
Хм, окей, но для аппаратного SPI я найду применение поинтереснее))) Та же SD-карта, например)
-1
Ну одно другому не мешает при хорошо продуманном подходе.
0
Сигнал CS придуман как раз для того, что бы совмещать несколько устройств на SPI.
+2
Хм, а кто-нибудь знает достаточно простой алгоритм для закрашивания треугольника?)))) В том смысле, чтобы несильно AVR-ку загружал)
0
А оно надо? Кроме как для 3Д графики, ничего на ум не приходит. Хм, ну разве что ещё стрелку аналоговых часов рисовать. Но на таком разрешении делать её треугольной никакого смысла.
0
Ну как же, нарисовать закрашенную окружность можно, а треугольник-нет что ли?))) Непорядок будет)
0
Ну если очень хочется, то можно так.
1) делим треугольник на две половины горизонтальной линией через вершину, лежащую по высоте между двумя другими.
2) заполняем первый треугольник по линиям, рассчитывая координаты левой и правой стороны (тот же алгоритм, что и для линий)
3) продолжаем для второго треугольника, «перезапустив» расчёт координат на одной из сторон.
Учесть случай, когда 2 или 3 вершины лежат на одной строке.
0
Хм, спасибо)))) Попробую это в код преобразить)
0
Я бы предложил почитать книжки про трехмерную графику. Скажем,«OpenGL. Программирование компьютерной графики» Френсиса Хилла или «Компьютерная графика и стандарт OpenGL» Херна Бейкера. Несмотря на название, ни в той, ни в другой почти ни слова про OGL, зато множество инфы по собственно алгоритмам и математике, лежащим в основе.
0
Хм, хорошо, спасибо, пойду почитаю)))))
0
Работал с этим дисплейчиком. Удобно с графикой работать в буфере, а буфер по дма кидать в девайс. Правда, есть недостаток — т.н. муар. Но для медленной графики вполне.
0
  • avatar
  • psv
  • 29 января 2014, 19:39
Ну, какой там DMA у AVR)))) Только если XMega.
0
Сори. я с стм юзал.
0
Ничего))Сам думаю летом за стм взяться, не отставать от прогресса, так сказать))))
0
Идеи в воздухе витают, только я вот такой на примету взял:
0
Охохоххоохо)))) 7 дюймов, мощщщно!))) Уже представляю себе планшет на AVR=D
А у меня мечта есть, найти дисплей в районе 2.2 дюйма с тачскрином, но с SPI. А с такими диагоналями я на ебее видел только с параллельным интерфейсом=(
0
А у меня мечта есть, найти дисплей в районе 2.2 дюйма с тачскрином, но с SPI. А с такими диагоналями я на ебее видел только с параллельным интерфейсом=(
Я как раз сегодня получил маленькую платку с ПЛИС Циклоном, нужно осваивать потихоньку, чтобы уметь подобные задачи решать.
0
Мне бы для моих целей 2.2 дюйма с SPI хватило бы))) А для параллельного интерфейса ног жалко)
0
Я об этом и говорю, хотя на практике я эту задачу не буду решать, но умение сделать преобразователь SPI-->parallel, например, да и вообще, запрограммировать ПЛИС под конкретную задачу, никогда не помешает.
0
Это-то как раз понятно))Непонятно, почему с диагональю больше, чем 1.8 дисплеи не делают с SPI))Ведь даже с 2.2 дюймами аппаратный SPI должен неплохо справиться)
0
Да вроде есть. Ebay по «tft spi» выдёт и 2.2 дюйма экраны и даже вон крутой на 5" с тачем. Другой вопрос — цена, но это уж кому на сколько оно надо.
0
Хм, странно. Я искал и мне ебей выдавал экраны с 2.2 и SPI, но без тача( С тачем и SPI есть единственный лот, но там просто дисплей, без платки, а паяться к шлейфу не хочется=(
0
Там, как правило, удобные для пайки шлейфы (то есть они именно для пайки, а не под разъем).
0
Все равно, не хочется связываться со шлейфами)
0
Ну и напрасно. Дисплей со шлейфом на свою плату ставить куда как удобнее.
0
Ну это понятно)))) Но мне, пока что, итоговый размер платы не так важен)) Так что, когда дойдет дело до миниатюрных устройств, то конечно же, буду отдавать предпочтение просто дисплею со шлейфом) А пока что, мне легче разместить ряд пятачков)
0
С одной стороны да, классно. Удобный контроллер, большой экран. А с другой за почти ту же цену можно получить целый планшет, который при желании можно использовать и как экран с графическим сопроцессором через блютуз/usb. Бонусом получаем аккум, разъемчики, схему заряда и прочее. А главное — экран будет гораздо лучше и с ёмкостным сенсором. Если не считать запуска в серию, а так, для себя, то планшет выигрывает.
+1
А с другой за почти ту же цену можно получить целый планшет
поэтому до сих пор в раздумье
0
Мне интересно, как этим дисплеем можно управлять авркой — интерфейс там до дури скоростной (либо внешне ужасно унылый), никакого гпио не напасёшься.

stm32f429, кстати, такой экран схавает на 60 Гц. Правда, с палитрой на 512 цветов на кадр (есть шанс на 16 бит, но пока не уверен), аж в два раза больше чем у денди, но зато быстро.
0
У NES вроде ж максимум 54 цвета одновременно на экране?
0
P.S. А 512 — на уровне GBA.
0
А, блин, действительно. Мне казалось, что сюбор их умел больше. Видимо, думаю я о нём лучше, чем он на самом деле был.

Но тем не менее =D Я сеййчас проверил, действительно, при одном активном слое аппаратно можно выводить картинку с разрешением 800х600 в шестнадцатибитном цвете. Для тфтшки такой вполне себе.
0
Да, крутой МК. А чем в этом плане может похвастаться STM32F439? Он вроде тоже умеет дисплейчики.
0
Два графических слоя (данные берутся по указанному в периферии адресу, т.е. откуда угодно из рам), которые могут быть представлены в разных цветовых пространствах: argb8888, rgb888, argb4444, rgb565, argb1555, табличные (256 цветов/слой) AL88 и L8, (16 цветов + 16 градаций прозрачности) AL44, ну и что-то в таком духе. Для каждого слоя по-своему. Размеры слоёв тоже могут быть различны, как и координаты вывода их на экран (что позволяет делать скроллинг изменением координат окна).
Средние экранчики могут работать с argb8888 буферами, 640х480 уже ограничены 4 байтами на два слоя на пиксель, 800х600 только двумя (1 слой 16 бит или 2 по 8).

Вывод в стандартный rgb-tft формат: R0..7, G0..7, B0..7, HS, VS, DE, DOTCLK, который понимают тфтшки. Отдельный PLL для генерации синхросигнала (совмещён с аудиоплл). Есть прерывания некоторые по завершению отрисовки, по достижению заданной строки, что позволяет даже делать полупрограммный интерлейс для всяких PAL/NTSC микросхем цап.
Эти сигналы прекрасно выводятся в VGA или HDMI без какой-либо особой дополнительной настройки с помощью специализированных микрух типа tfp410. Для VGA так вообще можно собрать цап колхозного типа.

Есть простенький аппаратный графический ускоритель, который умеет заливать прямоугольнички и копировать картинки из памяти в память с блендингом (по крайней мере заметно быстрее программной заливки).

В общем-то и всё =)
0
А 429 и 439 чем отличаются?
0
По-моему, шифрованием (AES/DES/MD5/SHA1/SHA2). А так, вроде, больше ничем.
0
Там контроллер встроенный SSD1963
0
Насколько я вижу, он относится только к тачскрину. Видео там обычное тфт-ргб, судя по пинам.
0
По поводу закрашивания треугольника: Нужно определить самую верхнюю и самую нижнюю, самую левую и самую правую. Организовать вложенный цикл и окрашивать точку, если она принадлежит площади треугольника. Алгоритмически можно продумать, как не повторять бесполезные циклы в непринадлежащей треугольнику области.
0
Я тоже думаю))Можно определить самую верхнюю и левую с правой, рисовать линии между этими гранями, затем, когда левая грань кончится тоже самое проделать с оставшимся треугольником)
0
Pika4u56
Ссылка на архив не работает, если не сложно, то исправьте. Хотелось бы посмотреть.
0
  • avatar
  • mial
  • 04 сентября 2014, 23:33
Ссылку обновил, теперь работает
0
Алгоритм рисования линии работает с глюками. Попробуйте вот такие координаты DrawLine(58,58, 84, 25, WHITE);
0
Хм, странно… У меня плата с дисплеем давно разобрана, сейчас с стм играюсь пока что. А что не так? Можете фото того, что нарисовано, выложить?
0
Тоже в своё время подключал некоторые типы ТФТ к АВР. Здесь есть примеры работ по различным интерфейсам, в том числе обработка видео с камеры.
0
не подскажите библиотеку для Atmel Studio??
0
Непонятна как реализовать вот это:

void BacklightInit()//инициализация подсветки
{
  TCCR2|=(1<<CS20)|(1<<CS21)|(1<<CS22);
  CB(TCCR2,WGM20);
  CB(TCCR2,WGM21);
  CB(TCCR2,COM21);
  CB(TCCR2,COM20);
  PWMBacklight=250;
  TIMSK|=(1<<OCIE2)|(1<<TOIE2);
  TCNT2=0;
}


И вот это:

void write_byte(unsigned char c,unsigned char com)//0-command 1-data
{
  CB (PORT_LCD,CS);
  if(com==0)
    CB(PORT_LCD,RS);
  else
    SB(PORT_LCD,RS);
  SB(PORT_LCD,SCK);
  for(unsigned char i=0;i<8;i++)
  {
    if(((c>>(7-i))&1) == 1)
      SB(PORT_LCD,MOSI);
    else
      CB(PORT_LCD,MOSI);
    CB(PORT_LCD,SCK);
    SB(PORT_LCD,SCK);
  }
  SB(PORT_LCD,CS);
}
void Reset()
{
  CB(PORT_LCD,RST);
  delay_ms(1);
  SB(PORT_LCD,RST);
  delay_ms(1);
}

void TFTInit()//инициализация дисплея
{
  SB(DDR_LCD,BL);
  SB(DDR_LCD,RST);
  SB(DDR_LCD,CS);
  SB(DDR_LCD,RS);
  SB(DDR_LCD,SCK);
  SB(DDR_LCD,MOSI);
  SB(PORT_LCD,BL);
  Reset();
   .....
 }
0
Вопрос «CB» и «SB» это «Clear Bit» и «Set Bit» да?
т.е. будет вот так?
CB(xxx, bit): xxx &= ~(1<<bit);
SB(xxx, bit): xxx |= (1<<bit);


По подключению можете подсказать?
подключаю так
PD7 -- Reset -- RST
PD2 -- CS -- CS
PD3 -- A0 -- RC
PD4 -- SDA -- MOSI
PD5 -- SCL -- SCK


И непонятна что за вывод PD6 — BL у меня нет такого?
0
Вопрос «CB» и «SB» это «Clear Bit» и «Set Bit» да?
Судя по использованию — да.
И непонятна что за вывод PD6 — BL у меня нет такого?
В топике написано, что это, читай внимательнее.
0
Да извиняюсь забыл пока разбирался.
Получается по подключению так:
PD7 -- Reset -- RST
PD2 -- CS -- CS
PD3 -- A0 -- RC
PD4 -- SDA -- MOSI
PD5 -- SCL -- SCK
PD6 -- Led+ -- BL


что то у меня выводить текст не хочет белый экран просто и все. В чем может быть проблема???
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.