Вывод данных на цветной дисплей 128*128 на базе ST7735

Вопросы и замечания по статьям и схемам, представленным на нашем сайте

При поддержке РадиоКОТструктор.ру


Ответить
Frogfot
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение Frogfot »

Повторил проект rozorh http://radiokot.ru/articles/78/ - всё запустилось с первого раза, за что автору благодарность.

Отличие только в другом индикаторе - 1,8" TFT 128х160, и контроллер у меня чуть отличается - пришлось оставить в команде MADCTL (0x36) цветовую палитру GBR, поскольку был неправильный вывод цветов. Также растянул вывод цветов и кекстовой надписи на весь дисплей - поменял в команде задания координат вывода с 128 на 160.

Картинку кота (126х126) не менял, поскольку прошивка и так почти 32 КБайта.

Потом слегка усовершенствовал программу - перешёл с программного SPI (хотя в некоторых случаях это удобно - можно брать любых 3 пина) на аппаратный SPI (дисплей я включил через резисторные делители - 1КОм от портов и 2,2КОм на землю), дисплей тоже запитан от 5В, поскольку на платке распаян стабилизатор 5В/3,3В, подсветка дисплея через резистор 510 Ом запитана от 5В.

При переходе от soft SPI к hard SPI зрительно скорость прорисовки выросла раз в 5-10 (точно не измерял), также запустил Таймер 0 для отладки - помигать светодиодом, подёргать WatchDog, потому что иногда дисплей после прошивки не запускался - пришлось передёргивать программатор.

Потом задеqствовал Chip Select на PB4 - вообще пропали зависания, скорее всего при прошивке дисплей входил в ступор от команд прошивки, поскольку задействованы одни и те же пины.

Если кому-то интересно, выложу исправленный проект под GCC и скриншоты.

Добавлено after 8 hours 15 minutes 14 seconds:
Хоть никто и не просил, выкладываю свой вариант проекта ATmega32 + TFT 1,8" 160x128 на ST7735.

Фотку я оставил, только сделал фон индикатора чёрным, а дальше в цикле вывод текста - 8 строк каждая разным цветом и переключение цвета фона тоже 8 разных цветов (1 строка из 8 будет не видна - совпадает цвет текста и цвет фона).

Прошивка в проекте в архиве.

Подключение индикатора к МК: A0 - PB3, CS - PB4, SDA - PB5, SCK - PB7.

ST7735_Mega32.rar
(271.25 КБ) 647 скачиваний
Хорошему коту и в декабре - март :)
Frogfot
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение Frogfot »

Перевёл проект для TFT 1,8" 160x128 на ST7735 с ATmega32 на STM32F051R8 с платы DISCOVERY F0. STM32F051 пошустрее - 48 МГц, флеша 64 кБ и оперативы 8 кБ, периферии в 2 раза больше + DMA. Аппаратный SPI запустил, вроде передаёт данные - во всяком случае данные с MOSI заводил на MISO - совпадают, но с ним пока дисплей чего-то не работает, и пока не разобрался, как аппаратно управлять сигналом SC. Пока для отладки сделал SOFT SPI, запустил через него 8-разрядный 7-сегментник на MAX7219 и вот сейчас TFT-шку 1,8". TFT c STM32F051 с SOFT SPI визуально работает пошустрее чем на ATmega32 на 8 МГц c HARD SPI, всё-таки 48 МГц, и прошивка для Меги была впритык, на STM32F051 занимает чуть больше 36 кБ из 64-х (у меня там много лишнего - всякая периферия - таймеры, USARTы и другое).

Если кому надо - выложу проект с SOFT SPI, пока буду разбираться с Hardовым SPI.
Хорошему коту и в декабре - март :)
kckat
Родился
Сообщения: 1
Зарегистрирован: Вс мар 03, 2019 19:35:35

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение kckat »

Добрый день!

Нужно было разобраться с SPI на STM32, а тут кот...
Короче спасибо за кота, удалось за 10 мин сделать из него STM32 кота, чему несказанно рад и делюсь результатом.
Собственно вот он какой на "голубой таблетке":
Изображение
Есть какой то мусор на бордюре справа, может потом посмотрю, не суть, главное что работает.
А так после AVR впечатление что все просто летает, на 36MHz аппаратном SPI отрисовывается практически мгновенно.
Аватара пользователя
Jurkin
Вымогатель припоя
Сообщения: 514
Зарегистрирован: Вт янв 01, 2013 15:51:19
Откуда: Vilnius

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение Jurkin »

А вот кто нить может разжевать как технически воспроизвести сиё действо:
В отличие от вывода полноцветного изображения, кодировка которого требует уйму места в памяти, для вывода одноцветных изображений любого цвета объём кода не намного превысит требующегося для работы с монохромным дисплеем, т.к. в этом случае есть возможность управлять каждым пикселем побитно, т.е. одним байтом сразу 8-ю точками экрана.

Для реализации такого незадокументированного способа мы воспользуемся редактором, который позволяет кодировать байт информации не сверху вниз, а горизонтально. Отличный вариант такого редактора – TheDotFactory (можно скачать в приложении). После поместим полученный код в память, а при выводе информации на экран будем применять следующую уловку: закрашивать пиксель, который должен быть видимым (бит=1), цветом, отличным от цвета фона, а пиксель, который видимым быть не должен (бит=0), цветом, совпадающим с цветом фона.

Смотрел код, ну чёт всё равно не въехал - мне бы шаг за шагом этот незадокументированный способ.
Ну по стандарту понятно:
CMD 0x2A, DATA 4байта
CMD 0x2B, DATA 4байта
CMD 0x2C, DATA -2ух байтовыми цветными точками заполняем выделенную область - тут всё понятно.
Ну а как например за байт 8 точек сразу зарисовать, всё вьехать не могу.
Ну получил из проги к примеру цифорку 5:
Изображение
и какими и в какой последовательности CMD, DATA закидывать эти байты в ST 7735.
Frogfot
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение Frogfot »

[uquote="Jurkin",url="/forum/viewtopic.php?p=3802372#p3802372"]Ну получил из проги к примеру цифорку 5:
Изображение
и какими и в какой последовательности CMD, DATA закидывать эти байты в ST 7735.[/uquote]
Спойлер

Код: Выделить всё

void PutChar (u8 ch, u8 x, u8 y)
{
  u8 i, j;
  SetCursorPos (x, y, x+FontHeight-1, y+FontWidth-1); // Задать область вывода

  TFT_SET_CMD;
  TFT_CS_LO;
  SPI_Send_8(RAMWR);

  TFT_SET_DAT;
  for (i=0; i<5; i++) // вывод одноцветного изображения символа - 1 байт = 8 пикселей на экране
  {
    u8 Temp = font5x7 [5*ch + i];
    for (j=0; j<8; j++)
    {
      if (Temp & 0x80) { SendData16(ColorPixel); } // Color Pixel
      else             { SendData16(ColorFon);   } // Color Fon
      Temp <<= 1;
    }
  }
  TFT_CS_HI;
}

Только прога для фонта 5х7, для фонта 7х5 надо поменять счётчики i и j.
Хорошему коту и в декабре - март :)
Аватара пользователя
Jurkin
Вымогатель припоя
Сообщения: 514
Зарегистрирован: Вт янв 01, 2013 15:51:19
Откуда: Vilnius

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение Jurkin »

[uquote="Frogfot",url="/forum/viewtopic.php?p=3811959#p3811959"]Только прога для фонта 5х7, для фонта 7х5 надо поменять счётчики i и j.[/uquote]
Спасибо, да я уже разобрался... Просто думал, что действительно есть какая то "не задокументированная" лазейка, а на деле, просто программная реализация выдачи стандартных для данного дисплея команд - за счёт этого и получается как бы один байт - восемь точек.
mab72
Открыл глаза
Сообщения: 49
Зарегистрирован: Сб мар 26, 2016 01:01:31

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение mab72 »

[uquote="Frogfot",url="/forum/viewtopic.php?p=3364318#p3364318"]Если кому надо - выложу проект с SOFT SPI...[/uquote]

Если не трудно выкладывай
Аватара пользователя
kovalgg
Родился
Сообщения: 9
Зарегистрирован: Пн дек 11, 2023 14:19:36

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение kovalgg »

Здравствуйте!Люди добрые,растолкуйте,как правильно подготовить изображение? Из картинок к программе ConvertBMP ,нормально выводится только одна из двух 128х160. Вторая какими то полосами.Дисплей st7735 128x160

Добавлено after 4 hours 51 minute 29 seconds:
Разобрался.Все картинки в программе,кроме одной, с глубиной 24 бита, а та что выводится нормально-16 бит. Возникает следующий вопрос: каким конвертером понизить глубину до 16 бит(5-6-5)?
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение shonty »

[uquote="kovalgg",url="/forum/viewtopic.php?p=4516753#p4516753"].. каким конвертером понизить глубину до 16 бит(5-6-5)?[/uquote]
В ГИМП можно преобразоваться в 16 бит
В фотошоп не знаю, но думаю и там можно.
В консольной imagemagic можно, если конвертировать с опцией -depth 16
Аватара пользователя
kovalgg
Родился
Сообщения: 9
Зарегистрирован: Пн дек 11, 2023 14:19:36

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение kovalgg »

shonty, Здравствуйте!Благодарю за подсказку. Попробовал в фотошопе.Получилось.
Аватара пользователя
BDDW
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн май 04, 2015 12:30:18

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение BDDW »

Доброго времени суток.
Кто ни будь разбирался со всеми командами?
До конца не понятна разница между командами:
0x12 - выбор рабочей области дисплея включен (Partial mode on)
0x2A - установка начального (параметр XS) и конечного (параметр XE) адресов столбцов в ОЗУ контроллера. (Column address set)
0x2B - установка начального (параметр YS) и конечного (параметр YE) адресов строк. (Row address set)
0x30 - Частичный набор адресов начала/конца (Partial start/end address set)

С 0x2A и 0x2B - все понятно. На просторах интернета все очень хорошо разжевано. А вот про другие (на мой взгляд очень похожие команды) - ни слова.
Даташит - курил. Но по англицки плохо понимаю. Хотелось бы на пальцах.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение shonty »

BDDW писал(а):Partial mode
Полгода назад разбирался с Partial mode и скроллингом на дисплее ILI9341, в принципе тоже самое, что и ST7735.
В режиме Partial mode просто на часть экрана не выводится изображение. Зачем это нужно я так и не понял..
Скроллинг меня также не удовлетворил.. (но в ST7735 вроде нет скроллинга)

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

Наибольший интерес представляет регистр MADCTL, иной раз настройки полностью не совпадают с даташитом. Но это от дисплея зависит.
Так же на некоторых ST7735 наблюдается смещение изображения. Сейчас как раз работаю с ST7735 1,8" 128x160 MSP1803, у него смещение 1px по вертикали и 2px по горизонтали. Приходится корректировать програмно.
BDDW писал(а):Даташит - курил. Но по англицки плохо понимаю. Хотелось бы на пальцах.
По этому поводу я придерживаюсь мнения, что даташиты пишут люди, которые так же не совсем в совершенстве владеют английским. Где нибудь в Тайване.
Аватара пользователя
BDDW
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн май 04, 2015 12:30:18

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение BDDW »

[uquote="shonty",url="/forum/viewtopic.php?p=4528975#p4528975"]Полгода назад разбирался с Partial mode и скроллингом на дисплее ILI9341, в принципе тоже самое, что и ST7735.[/uquote]
Я то же сейчас разбираюсь с ними. Программа инициализации для ST7735 подошла к ILI9341. Сейчас заказал еще ST7789.
Для начала взял список команд из даташита и свел в единую таблицу (если кому надо (поможет) - прилагаю).
[uquote="shonty",url="/forum/viewtopic.php?p=4528975#p4528975"]В режиме Partial mode просто на часть экрана не выводится изображение. Зачем это нужно я так и не понял..[/uquote]
А при включении Partial mode изображение ранее выведенное на экран сохраняется, а обновление данных идет в ранее заданной области командой 0x30?
[uquote="shonty",url="/forum/viewtopic.php?p=4528975#p4528975"]Просто делал обновляемый график, вот и решил посмотреть, чем полезным можно воспользоваться.
Вобщем оставил эту затею.. Для меня бесполезные опции.[/uquote]
Я занимаюсь сейчас ровно тем же. Столкнулся с тем, что получаю координаты точки. Xочу вывести ее на экран. Логично было бы дать одну команду - какую ни будь "SET Y" и далее строка Y и цвет точки (X автоматически должен увеличиться на 1) - 5 байт. А фактически получается: 0x2A + 4 байта, 0x2B + 4 байта, 0x2C + 2 байта. И того 13 байт.
[uquote="shonty",url="/forum/viewtopic.php?p=4528975#p4528975"]Наибольший интерес представляет регистр MADCTL, иной раз настройки полностью не совпадают с даташитом. Но это от дисплея зависит.[/uquote]
0x36?
Вложения
Команды LCD.pdf
(443.25 КБ) 137 скачиваний
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение shonty »

По Partial mode я толком так и не понял саму суть этой опции. Ведь можно просто задать на дисплее любую произвольную область и заливать её пикселями.
BDDW писал(а):Я занимаюсь сейчас ровно тем же. Столкнулся с тем, что получаю координаты точки. Xочу вывести ее на экран. Логично было бы дать одну команду - какую ни будь "SET Y" и далее строка Y и цвет точки (X автоматически должен увеличиться на 1) - 5 байт. А фактически получается: 0x2A + 4 байта, 0x2B + 4 байта, 0x2C + 2 байта. И того 13 байт.
У меня вывод графика организован так:
- Массив хранится в eeprom
- "Флаг индекса", определяет в какую ячейку eeprom записывать данные и с какой ячейки выводить первый бар
Собственно сам вывод графика:
- задаётся поле вывода 160х320, точнее 320 горизонталь и 160+(толщина линии графика) вертикаль.
- из массива берётся значение согласно индексу (преобразовывается в координату, сравнивается с пределами...).
- выводится бар: цвет фона + точка (3px) графика соответствующим цветом + цвет фона до конца высоты бара.
- увеличиваем адрес eeprom, берём следующее значение.
- новый бар заливается уже рядом с предыдущим.

Не знаю на сколько понятно смог объяснить.. Но поле задаётся только один раз. График заливается в дисплей побарно, одновременно закрашивая бары предыдущего графика. Визуально почти не заметно..

Как то так..
Аватара пользователя
Илья79
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Вс июн 29, 2008 13:53:03
Контактная информация:

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение Илья79 »

Участок кода для дисплея 1,44" на Arduino IDE
Спойлер

Код: Выделить всё

#include <SPI.h>
#define SPI1_NSS_PIN PA4 
byte data;

//дефайны команд управления дисплеем
#define   SWRESET   0x01
#define   SLPOUT    0x11
#define   DISPON    0x29
#define   CASET   0x2A  //x0=int,x1=int
#define   RASET   0x2B  //y0=int,y1=int
#define   RAMWR   0x2C
#define   MADCTL    0x36  //RGB.3=1, остальные=0
#define   COLMOD    0x3A  //64k=5
#define	  INVON   0x21  // invert on0x21

//дефайны выводов порта В для управления дисплеем
#define TFT_CS  PA1
#define   A0    PA2  //dc

//инициализация дисплея
void disp_init()
{
  Send(SWRESET,0);  //программный ресет
  delay(120);

  Send(SLPOUT,0);   //будим после ресета
  delay(120);

  Send(DISPON,0);   //включаем экран

  Send(MADCTL,0);   // RGB и поворачиваем экран
  Send(0b01111000,1);
 
  Send(5,1);

  Send(INVON,0);
   
}

void Send(unsigned char DATA, unsigned char DC)
{
  unsigned char k;

  if(DC) {sbi(A0);} else cbi(A0);

  digitalWrite(SPI1_NSS_PIN, LOW); // manually take CSN low for SPI_1 transmission
  data = SPI.transfer(DATA); //Send the HEX data 0x55 over SPI-1 port and store the received byte to the <data> variable.
  digitalWrite(SPI1_NSS_PIN, HIGH); // manually take CSN high between spi transmissions
}


void Disp_set( unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1)

{
 Send(CASET,0);
  Send(0,1);
  Send(x0+1,1);
  Send(0,1);
  Send((x0+x1),1);

  Send(RASET,0);
  Send(0,1);
  Send(y0+26,1);
  Send(0,1);
  Send((y0+y1+25),1);

  Send(RAMWR,0);  
}

void Cls_disp(uint32_t back_color)
{
Disp_set(0,0,160,80);
 for(int k=0;k<12800;k++){
  Send((back_color>>16),1);
  Send((back_color>>8),1);
  Send((back_color&0xFF),1); 
 }
} 

void setup() {
 pinMode(PA1, OUTPUT);//sc
 pinMode(PA2, OUTPUT);//ds
  pinMode(PA3, OUTPUT);//res
  pinMode(PA5, OUTPUT);
   pinMode(PA7, OUTPUT);
   digitalWrite(PA3, HIGH);//1
 SPI.begin(); //Initialize the SPI_1 port.
  SPI.setBitOrder(MSBFIRST); // Set the SPI_1 bit order
  SPI.setDataMode(SPI_MODE0); //Set the  SPI_2 data mode 0
  SPI.setClockDivider(SPI_CLOCK_DIV8);      //SPI_FREQ  Slow speed (72 / 16 = 4.5 MHz SPI_1 speed)
  pinMode(SPI1_NSS_PIN, OUTPUT);
  disp_init();
Cls_disp(white);
}
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: Вывод данных на цветной дисплей 128*128 на базе ST7735

Сообщение shonty »

BDDW писал(а):Программа инициализации для ST7735 подошла к ILI9341. Сейчас заказал еще ST7789.
В качестве дополнительных источников информации можно посмотреть даташиты на
HX8353
HX8357
GC9A01
S6D02A1
....
и подобные...
Но по Partial Mode как то скупо везде написано, даже в даташитах 2019 года. Нумерация глав разная, а основная инфа везде как под копирку.

Можете ещё тут пошукать по дисплеям.

Кстати, дисплей 1.8 Inch 160x128 на синей подложке, под который я писал как под ST7735, у буржуев позиционируется как S6D02A1, но разницы в командах абсолютно никакой нет.
Ответить

Вернуться в «Статьи»