Не работает дисплей Mega 2560

Oger
Offline
Зарегистрирован: 16.12.2020

Господа, выручайте, вторые сутки пошли, как забрал посылку из поднебесной и мучаю её и себя. Перепробовал около десятка различных скетчей и библиотек к ним с гитхаба и других ресурсов, но экран предательски не хочет показывать ничего, кроме белого фона. Скетч и библиотеки Watashi компилируются и прекрасно записываются в Мегу, без ошибок (все делал по его инструкции). Уже написал и продавцу, на что он мне намекнул, мол ты днище тупое, лови ссылку и иди кури мануалы ( http://www.lcdwiki.com/3.5inch_Ardu...fQ87Xbr&file=3.5inch_Arduino_Display-Mega2560 ) Посмотрел там все, попробовал библиотеки, но результат остался прежним. Даже никакие тестовые скетчи, по типу алфавита и цифр, не хотят выводиться на экран. Заказывать новый экран или я где-то свернул не туда?

Коротко о девайсах:

https://aliexpress.ru/item/32538935...0390-2118316294.1600456412&sku_id=58972503692 Mega2560 R3 + 3.5" Display на ILI9486.

[url=https://radikal.ru][img]https://b.radikal.ru/b41/2012/f4/3f0f5691bbe2.jpg[/img][/url]

 
 
Oger
Offline
Зарегистрирован: 16.12.2020

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Было такое. Посмотри в библиотеке. У меня при инициализации она запрашивала код дисплея. Определяла не правильно и затыкалась.

Отключил этот блок и жестко назначил дисплей и все пошло.

И, кстати, представь программу.

Oger
Offline
Зарегистрирован: 16.12.2020

mykaida пишет:

Было такое. Посмотри в библиотеке. У меня при инициализации она запрашивала код дисплея. Определяла не правильно и затыкалась.

Отключил этот блок и жестко назначил дисплей и все пошло.

И, кстати, представь программу.

Скетч использую любой, тупо из примеров библиотек UTFT (например), там код минимален, цифры, буквы, геометрические фигуры. Люди, помогавшие, еще советовали, мол рисовые друзья подсунули не тот чип, который указан на оборотной стороне, попробуй другие пины (я объявлял дисплей, как UTFT myGLCD(CTE40, 38, 39, 40, 41); и UTFT myGLCD(ILI9486, 38, 39, 40, 41); и UTFT myGLCD(320, 480, 38, 39, 40, 41); и в тех библиотека, что скинул продавец LCDWIKI_KBV mylcd(320,480,40,38,39,44,41); Посоветовали изменять пины на 50, 51, 52, 53, но тоже тщетно

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Oger пишет:

Скетч использую любой, тупо из примеров библиотек UTFT (например)

Что пишет серийный порт? Где затыкается исполнении программы?

И, все-таки, опубликуйте программу от которой мы и будем искать проблему. У меня, например, UTFT не стоит и я пользовался стандартной Adafruit TFT.

b707
Offline
Зарегистрирован: 26.05.2017

Oger пишет:

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

Вы, походу, полный новичок в этом, вам представляется, что чем проще вы код дисплею подсунете - тем больше шансов что он ответит взаимностью :)

так у вас ничего не выйдет. Нужно найти правильную инициализацию для вашего контроллера -без нее вам даже просто одним цветом экран залить нет шансов.

Библиотека UTFT не лучший выбор для тестирования неизвестных дисплеев. Возьмите либу mkv_myfriend, у нее в примерах есть скетч, который в Сериал Монитор выдает код контроллера дисплея, запустите его и выложите вывод на форум

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

У мня такой дисплей завелся только с инициализацией от 8357b

Oger
Offline
Зарегистрирован: 16.12.2020

b707 пишет:
Вы, походу, полный новичок в этом, вам представляется, что чем проще вы код дисплею подсунете - тем больше шансов что он ответит взаимностью :)

так у вас ничего не выйдет. Нужно найти правильную инициализацию для вашего контроллера -без нее вам даже просто одним цветом экран залить нет шансов.

Библиотека UTFT не лучший выбор для тестирования неизвестных дисплеев. Возьмите либу mkv_myfriend, у нее в примерах есть скетч, который в Сериал Монитор выдает код контроллера дисплея, запустите его и выложите вывод на форум

Абсолютно верно, в ардуино полный новичок, но работаю в тех.сфере IT, поэтому что-то да умею. Собираю инфракрасную паяльную станцию на этом контроллере, для снятия чипов с плат. Завтра попробую библиотеку, которую вы посоветовали, спасибо. Но, забегая наперед, сегодня ставил LCD ID Reader, так он послал меня куда подальше, сказав, что он не читает мой дисплей...ну, точнее выдал в Мониторе порта ID 0х0000.

 

P.S. Получится ли у меня проверить правую колодку Meg'и, куда подключается дисплей, на предмет того, передают ли пины команды? Может проблема не в дисплее, а в колодке? Запаять диод (через резистор) и в Blink скетче назначать по очереди все пины с 22го по 53й.

Oger
Offline
Зарегистрирован: 16.12.2020

DetSimen пишет:

У мня такой дисплей завелся только с инициализацией от 8357b

UTFT myGLCD(HX8357b,38,39,40,41);

Так? Спасибо, завтра попробую.

Oger
Offline
Зарегистрирован: 16.12.2020

mykaida пишет:

Oger пишет:

Скетч использую любой, тупо из примеров библиотек UTFT (например)

Что пишет серийный порт? Где затыкается исполнении программы?

И, все-таки, опубликуйте программу от которой мы и будем искать проблему. У меня, например, UTFT не стоит и я пользовался стандартной Adafruit TFT.

// UTFT_Demo_480x320 
// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// This program is a demo of how to use most of the functions
// of the library with a supported display modules.
//
// This demo was made for modules with a screen resolution 
// of 480x320 pixels.
//
// This program requires the UTFT library.
//

#include <UTFT.h>

// Declare which fonts we will be using
extern uint8_t SmallFont[];

// Set the pins to the correct ones for your development shield
// ------------------------------------------------------------
// Arduino Uno / 2009:
// -------------------
// Standard Arduino Uno/2009 shield            : <display model>,A5,A4,A3,A2
// DisplayModule Arduino Uno TFT shield        : <display model>,A5,A4,A3,A2
//
// Arduino Mega:
// -------------------
// Standard Arduino Mega/Due shield            : <display model>,38,39,40,41
// CTE TFT LCD/SD Shield for Arduino Mega      : <display model>,38,39,40,41
//
// Remember to change the model parameter to suit your display module!
UTFT myGLCD(ILI9486,38,39,40,41);

void setup()
{
  randomSeed(analogRead(0));
  
// Setup the LCD
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
}

void loop()
{
  int buf[478];
  int x, x2;
  int y, y2;
  int r;

// Clear the screen and draw the frame
  myGLCD.clrScr();

  myGLCD.setColor(255, 0, 0);
  myGLCD.fillRect(0, 0, 479, 13);
  myGLCD.setColor(64, 64, 64);
  myGLCD.fillRect(0, 306, 479, 319);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setBackColor(255, 0, 0);
  myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1);
  myGLCD.setBackColor(64, 64, 64);
  myGLCD.setColor(255,255,0);
  myGLCD.print("<http://www.RinkyDinkElectronics.com/>", CENTER, 307);

  myGLCD.setColor(0, 0, 255);
  myGLCD.drawRect(0, 14, 479, 305);

// Draw crosshairs
  myGLCD.setColor(0, 0, 255);
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.drawLine(239, 15, 239, 304);
  myGLCD.drawLine(1, 159, 478, 159);
  for (int i=9; i<470; i+=10)
    myGLCD.drawLine(i, 157, i, 161);
  for (int i=19; i<220; i+=10)
    myGLCD.drawLine(237, i, 241, i);

// Draw sin-, cos- and tan-lines  
  myGLCD.setColor(0,255,255);
  myGLCD.print("Sin", 5, 15);
  for (int i=1; i<478; i++)
  {
    myGLCD.drawPixel(i,159+(sin(((i*1.13)*3.14)/180)*95));
  }
  
  myGLCD.setColor(255,0,0);
  myGLCD.print("Cos", 5, 27);
  for (int i=1; i<478; i++)
  {
    myGLCD.drawPixel(i,159+(cos(((i*1.13)*3.14)/180)*95));
  }

  myGLCD.setColor(255,255,0);
  myGLCD.print("Tan", 5, 39);
  for (int i=1; i<478; i++)
  {
    myGLCD.drawPixel(i,159+(tan(((i*1.13)*3.14)/180)));
  }

  delay(2000);

  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);
  myGLCD.setColor(0, 0, 255);
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.drawLine(239, 15, 239, 304);
  myGLCD.drawLine(1, 159, 478, 159);

// Draw a moving sinewave
  x=1;
  for (int i=1; i<(478*15); i++) 
  {
    x++;
    if (x==479)
      x=1;
    if (i>479)
    {
      if ((x==239)||(buf[x-1]==159))
        myGLCD.setColor(0,0,255);
      else
        myGLCD.setColor(0,0,0);
      myGLCD.drawPixel(x,buf[x-1]);
    }
    myGLCD.setColor(0,255,255);
    y=159+(sin(((i*0.7)*3.14)/180)*(90-(i / 100)));
    myGLCD.drawPixel(x,y);
    buf[x-1]=y;
  }

  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some filled rectangles
  for (int i=1; i<6; i++)
  {
    switch (i)
    {
      case 1:
        myGLCD.setColor(255,0,255);
        break;
      case 2:
        myGLCD.setColor(255,0,0);
        break;
      case 3:
        myGLCD.setColor(0,255,0);
        break;
      case 4:
        myGLCD.setColor(0,0,255);
        break;
      case 5:
        myGLCD.setColor(255,255,0);
        break;
    }
    myGLCD.fillRect(150+(i*20), 70+(i*20), 210+(i*20), 130+(i*20));
  }

  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some filled, rounded rectangles
  for (int i=1; i<6; i++)
  {
    switch (i)
    {
      case 1:
        myGLCD.setColor(255,0,255);
        break;
      case 2:
        myGLCD.setColor(255,0,0);
        break;
      case 3:
        myGLCD.setColor(0,255,0);
        break;
      case 4:
        myGLCD.setColor(0,0,255);
        break;
      case 5:
        myGLCD.setColor(255,255,0);
        break;
    }
    myGLCD.fillRoundRect(270-(i*20), 70+(i*20), 330-(i*20), 130+(i*20));
  }
  
  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some filled circles
  for (int i=1; i<6; i++)
  {
    switch (i)
    {
      case 1:
        myGLCD.setColor(255,0,255);
        break;
      case 2:
        myGLCD.setColor(255,0,0);
        break;
      case 3:
        myGLCD.setColor(0,255,0);
        break;
      case 4:
        myGLCD.setColor(0,0,255);
        break;
      case 5:
        myGLCD.setColor(255,255,0);
        break;
    }
    myGLCD.fillCircle(180+(i*20),100+(i*20), 30);
  }
  
  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some lines in a pattern
  myGLCD.setColor (255,0,0);
  for (int i=15; i<304; i+=5)
  {
    myGLCD.drawLine(1, i, (i*1.6)-10, 304);
  }
  myGLCD.setColor (255,0,0);
  for (int i=304; i>15; i-=5)
  {
    myGLCD.drawLine(478, i, (i*1.6)-11, 15);
  }
  myGLCD.setColor (0,255,255);
  for (int i=304; i>15; i-=5)
  {
    myGLCD.drawLine(1, i, 491-(i*1.6), 15);
  }
  myGLCD.setColor (0,255,255);
  for (int i=15; i<304; i+=5)
  {
    myGLCD.drawLine(478, i, 490-(i*1.6), 304);
  }
  
  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some random circles
  for (int i=0; i<100; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    x=32+random(416);
    y=45+random(226);
    r=random(30);
    myGLCD.drawCircle(x, y, r);
  }

  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some random rectangles
  for (int i=0; i<100; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    x=2+random(476);
    y=16+random(289);
    x2=2+random(476);
    y2=16+random(289);
    myGLCD.drawRect(x, y, x2, y2);
  }

  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some random rounded rectangles
  for (int i=0; i<100; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    x=2+random(476);
    y=16+random(289);
    x2=2+random(476);
    y2=16+random(289);
    myGLCD.drawRoundRect(x, y, x2, y2);
  }

  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

  for (int i=0; i<100; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    x=2+random(476);
    y=16+random(289);
    x2=2+random(476);
    y2=16+random(289);
    myGLCD.drawLine(x, y, x2, y2);
  }

  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

  for (int i=0; i<10000; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    myGLCD.drawPixel(2+random(476), 16+random(289));
  }

  delay(2000);

  myGLCD.fillScr(0, 0, 255);
  myGLCD.setColor(255, 0, 0);
  myGLCD.fillRoundRect(160, 70, 319, 169);
  
  myGLCD.setColor(255, 255, 255);
  myGLCD.setBackColor(255, 0, 0);
  myGLCD.print("That's it!", CENTER, 93);
  myGLCD.print("Restarting in a", CENTER, 119);
  myGLCD.print("few seconds...", CENTER, 132);
  
  myGLCD.setColor(0, 255, 0);
  myGLCD.setBackColor(0, 0, 255);
  myGLCD.print("Runtime: (msecs)", CENTER, 290);
  myGLCD.printNumI(millis(), CENTER, 305);
  
  delay (10000);
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Oger, неужели за два дня нельзя было прочитать правила форума?

b707
Offline
Зарегистрирован: 26.05.2017

Oger пишет:

P.S. Получится ли у меня проверить правую колодку Meg'и, куда подключается дисплей, на предмет того, передают ли пины команды? Может проблема не в дисплее, а в колодке? Запаять диод (через резистор) и в Blink скетче назначать по очереди все пины с 22го по 53й.

Я бы не тратил время. Вероятность, что проблема в Меге, а не в дисплее - 1 к 1000

Но если очень хочется - то можно. Нужен любой светодиод и резистор примерно на 300-500 Ом. паять необязательно, можно проводками

Oger
Offline
Зарегистрирован: 16.12.2020

b707 пишет:

Oger пишет:

P.S. Получится ли у меня проверить правую колодку Meg'и, куда подключается дисплей, на предмет того, передают ли пины команды? Может проблема не в дисплее, а в колодке? Запаять диод (через резистор) и в Blink скетче назначать по очереди все пины с 22го по 53й.

Я бы не тратил время. Вероятность, что проблема в Меге, а не в дисплее - 1 к 1000

Но если очень хочется - то можно. Нужен любой светодиод и резистор примерно на 300-500 Ом. паять необязательно, можно проводками

С самой то мегой проблем вроде нет, заливал скетч Hello World и получал его обратно по монитору порта, а вот криво запаянные колодки меня смутили.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Oger пишет:

И, все-таки, опубликуйте программу

Спасибо, а Вы уверенны, что эта библиотека поддерживает Ваш дисплей? Я не очень как то...

 

Oger
Offline
Зарегистрирован: 16.12.2020

mykaida пишет:

Oger пишет:

И, все-таки, опубликуйте программу

Спасибо, а Вы уверенны, что эта библиотека поддерживает Ваш дисплей? Я не очень как то...

 

В папке с библиотекой, есть файл memorysaver, в котором содержатся поддерживаемые дисплеи. Если мой дисп действительно на ILI9486 (в чем я уже не уверен), то он там присутствует. Но мне еще сам продавец с али скидывал ссылки (в первом посте) LCDWIKI_GUI и LCDWIKI_KBV, (мол, 100% для этого дисплея). Там история такая же. Еще вспомнил, что люди, задававшие вопросы прямо на странице изделия на али, использовали TFT_HX8357 эту библиотеку, но и с ней подружить мне не удалось.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Oger пишет:

[

Ну теперь пишем после setup()

Serial.begin (9600);

А после 39 строки

Serial.println("INIT");

И мониторим порт (Ctrl+Shift+M)

А перед этим строим порт под 9600

Oger
Offline
Зарегистрирован: 16.12.2020

mykaida пишет:

И мониторим порт (Ctrl+Shift+M)

Скачал сегодня библиотеку, под чип, который посоветовали чуть выше (TFT_HX8357.h), там есть в примерах graphicstest_320x480. С монитором порта. Вот, что он выдал в мониторе:

09:48:43.824 -> HX8357 Test!
09:48:44.108 -> Benchmark                Time (microseconds)
09:48:44.144 -> Screen fill              309396
09:48:44.969 -> Text                     47764
09:48:48.114 -> Lines                    258252
09:48:49.899 -> Horiz/Vert Lines         26680
09:48:50.489 -> Rectangles (outline)     16408
09:48:51.069 -> Rectangles (filled)      773860
09:48:52.458 -> Circles (filled)         208860
09:48:52.678 -> Circles (outline)        225732
09:48:53.431 -> Triangles (outline)      58560
09:48:54.054 -> Triangles (filled)       365448
09:48:55.059 -> Rounded rects (outline)  79544
09:48:55.688 -> Rounded rects (filled)   868092
09:48:57.119 -> Done!
 
 
Не знаю, должно ли было что-то происходить на экране, но он по прежнему не инициализировался. Откуда взялись цифры теста, непонятно. Сами цифры всегда одинаковые (в пределах 1 дефайна), если разкомментить другой дефайн драйвера (из 4х), то цифры меняются. В настройках библиотеки, лежат 4 дефайна для разных дисплеев, пробовал запустить дисп всеми по очереди, без успехов.

Сам скетч:

/* Modified by Bodmer to be an example for TFT_HX8357 library.
   This sketch uses the GLCD font only.

   The performance for each test is reported to the serial
   port at 38400 baud.

   This test occupies the whole of the display therefore
   will take twice as long as it would on a 320 x 240
   display. Bear this in mind when making performance
   comparisons.

   Make sure all the required font is loaded by editting the
   User_Setup.h file in the TFT_HX8357 library folder.

   Original header is at the end of the sketch, some text in it is
   not applicable to the HX8357 display supported by this example.
*/

#include <TFT_HX8357.h> // Hardware-specific library

// Invoke library
TFT_HX8357 tft = TFT_HX8357();

void setup() {
  Serial.begin (9600);
  Serial.println("HX8357 Test!");

  tft.begin();

  Serial.println(F("Benchmark                Time (microseconds)"));

  Serial.print(F("Screen fill              "));
  Serial.println(testFillScreen());
  delay(500);

  Serial.print(F("Text                     "));
  Serial.println(testText());
  delay(3000);

  Serial.print(F("Lines                    "));
  Serial.println(testLines(TFT_CYAN));
  delay(500);

  Serial.print(F("Horiz/Vert Lines         "));
  Serial.println(testFastLines(TFT_RED, TFT_BLUE));
  delay(500);

  Serial.print(F("Rectangles (outline)     "));
  Serial.println(testRects(TFT_GREEN));
  delay(500);

  Serial.print(F("Rectangles (filled)      "));
  Serial.println(testFilledRects(TFT_YELLOW, TFT_MAGENTA));
  delay(500);

  Serial.print(F("Circles (filled)         "));
  Serial.println(testFilledCircles(10, TFT_MAGENTA));

  Serial.print(F("Circles (outline)        "));
  Serial.println(testCircles(10, TFT_WHITE));
  delay(500);

  Serial.print(F("Triangles (outline)      "));
  Serial.println(testTriangles());
  delay(500);

  Serial.print(F("Triangles (filled)       "));
  Serial.println(testFilledTriangles());
  delay(500);

  Serial.print(F("Rounded rects (outline)  "));
  Serial.println(testRoundRects());
  delay(500);

  Serial.print(F("Rounded rects (filled)   "));
  Serial.println(testFilledRoundRects());
  delay(500);

  Serial.println(F("Done!"));

}


void loop(void) {
  for (uint8_t rotation = 0; rotation < 4; rotation++) {
    tft.setRotation(rotation);
    testText();
    delay(1000);
  }
}

unsigned long testFillScreen() {
  unsigned long start = micros();
  tft.fillScreen(TFT_BLACK);
  tft.fillScreen(TFT_RED);
  tft.fillScreen(TFT_GREEN);
  tft.fillScreen(TFT_BLUE);
  tft.fillScreen(TFT_BLACK);
  return micros() - start;
}

unsigned long testText() {
  tft.fillScreen(TFT_BLACK);
  unsigned long start = micros();
  tft.setCursor(0, 0);
  tft.setTextColor(TFT_WHITE);  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
  tft.println(1234.56);
  tft.setTextColor(TFT_RED);    tft.setTextSize(3);
  tft.println(0xDEADBEEF, HEX);
  tft.println();
  tft.setTextColor(TFT_GREEN);
  tft.setTextSize(5);
  tft.println("Groop");
  tft.setTextSize(2);
  tft.println("I implore thee,");
  tft.setTextSize(1);
  tft.setTextColor(TFT_GREEN);
  tft.println("my foonting turlingdromes.");
  tft.println("And hooptiously drangle me");
  tft.println("with crinkly bindlewurdles,");
  tft.println("Or I will rend thee");
  tft.println("in the gobberwarts");
  tft.println("with my blurglecruncheon,");
  tft.println("see if I don't!");
  return micros() - start;
}

unsigned long testLines(uint16_t color) {
  unsigned long start, t;
  int           x1, y1, x2, y2,
                w = tft.width(),
                h = tft.height();

  tft.fillScreen(TFT_BLACK);

  x1 = y1 = 0;
  y2    = h - 1;
  start = micros();
  for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = w - 1;
  for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color);
  t     = micros() - start; // fillScreen doesn't count against timing

  tft.fillScreen(TFT_BLACK);

  x1    = w - 1;
  y1    = 0;
  y2    = h - 1;
  start = micros();
  for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = 0;
  for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color);
  t    += micros() - start;

  tft.fillScreen(TFT_BLACK);

  x1    = 0;
  y1    = h - 1;
  y2    = 0;
  start = micros();
  for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = w - 1;
  for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color);
  t    += micros() - start;

  tft.fillScreen(TFT_BLACK);

  x1    = w - 1;
  y1    = h - 1;
  y2    = 0;
  start = micros();
  for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = 0;
  for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color);

  return micros() - start;
}

unsigned long testFastLines(uint16_t color1, uint16_t color2) {
  unsigned long start;
  int           x, y, w = tft.width(), h = tft.height();

  tft.fillScreen(TFT_BLACK);
  start = micros();
  for (y = 0; y < h; y += 5) tft.drawFastHLine(0, y, w, color1);
  for (x = 0; x < w; x += 5) tft.drawFastVLine(x, 0, h, color2);

  return micros() - start;
}

unsigned long testRects(uint16_t color) {
  unsigned long start;
  int           n, i, i2,
                cx = tft.width()  / 2,
                cy = tft.height() / 2;

  tft.fillScreen(TFT_BLACK);
  n     = min(tft.width(), tft.height());
  start = micros();
  for (i = 2; i < n; i += 6) {
    i2 = i / 2;
    tft.drawRect(cx - i2, cy - i2, i, i, color);
  }

  return micros() - start;
}

unsigned long testFilledRects(uint16_t color1, uint16_t color2) {
  unsigned long start, t = 0;
  int           n, i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(TFT_BLACK);
  n = min(tft.width(), tft.height());
  for (i = n; i > 0; i -= 6) {
    i2    = i / 2;
    start = micros();
    tft.fillRect(cx - i2, cy - i2, i, i, color1);
    t    += micros() - start;
    // Outlines are not included in timing results
    tft.drawRect(cx - i2, cy - i2, i, i, color2);
  }

  return t;
}

unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
  unsigned long start;
  int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;

  tft.fillScreen(TFT_BLACK);
  start = micros();
  for (x = radius; x < w; x += r2) {
    for (y = radius; y < h; y += r2) {
      tft.fillCircle(x, y, radius, color);
    }
  }

  return micros() - start;
}

unsigned long testCircles(uint8_t radius, uint16_t color) {
  unsigned long start;
  int           x, y, r2 = radius * 2,
                      w = tft.width()  + radius,
                      h = tft.height() + radius;

  // Screen is not cleared for this one -- this is
  // intentional and does not affect the reported time.
  start = micros();
  for (x = 0; x < w; x += r2) {
    for (y = 0; y < h; y += r2) {
      tft.drawCircle(x, y, radius, color);
    }
  }

  return micros() - start;
}

unsigned long testTriangles() {
  unsigned long start;
  int           n, i, cx = tft.width()  / 2 - 1,
                      cy = tft.height() / 2 - 1;

  tft.fillScreen(TFT_BLACK);
  n     = min(cx, cy);
  start = micros();
  for (i = 0; i < n; i += 5) {
    tft.drawTriangle(
      cx    , cy - i, // peak
      cx - i, cy + i, // bottom left
      cx + i, cy + i, // bottom right
      tft.color565(0, 0, i));
  }

  return micros() - start;
}

unsigned long testFilledTriangles() {
  unsigned long start, t = 0;
  int           i, cx = tft.width()  / 2 - 1,
                   cy = tft.height() / 2 - 1;

  tft.fillScreen(TFT_BLACK);
  start = micros();
  for (i = min(cx, cy); i > 10; i -= 5) {
    start = micros();
    tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
                     tft.color565(0, i, i));
    t += micros() - start;
    tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
                     tft.color565(i, i, 0));
  }

  return t;
}

unsigned long testRoundRects() {
  unsigned long start;
  int           w, i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(TFT_BLACK);
  w     = min(tft.width(), tft.height());
  start = micros();
  for (i = 0; i < w; i += 6) {
    i2 = i / 2;
    tft.drawRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(i, 0, 0));
  }

  return micros() - start;
}

unsigned long testFilledRoundRects() {
  unsigned long start;
  int           i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(TFT_BLACK);
  start = micros();
  for (i = min(tft.width(), tft.height()); i > 20; i -= 6) {
    i2 = i / 2;
    tft.fillRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(0, i, 0));
  }

  return micros() - start;
}

// Original sketch header
/***************************************************
  This is our GFX example for the Adafruit ILI9341 Breakout and Shield
  ----> http://www.adafruit.com/products/1651

  Check out the links above for our tutorials and wiring diagrams
  These displays use SPI to communicate, 4 or 5 pins are required to
  interface (RST is optional)
  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.
  MIT license, all text above must be included in any redistribution
 ****************************************************/

 

Oger
Offline
Зарегистрирован: 16.12.2020

Проверил всю правую колодку, на которую на самой меге подключается дисплей светодиодом, все пины отзываются, мигает. Значит дело либо в самом дисплее, либо в неверном описании пинов, либо в чипе и тут стоит нифига не ILI9486.

b707
Offline
Зарегистрирован: 26.05.2017

Oger пишет:

Скачал сегодня библиотеку, под чип, который посоветовали чуть выше (TFT_HX8357.h), там есть в примерах graphicstest_320x480. С монитором порта. Вот, что он выдал в мониторе:

09:48:43.824 -> HX8357 Test!
09:48:44.108 -> Benchmark                Time (microseconds)
09:48:44.144 -> Screen fill              309396
09:48:44.969 -> Text                     47764
09:48:48.114 -> Lines                    258252
09:48:49.899 -> Horiz/Vert Lines         26680
09:48:50.489 -> Rectangles (outline)     16408
09:48:51.069 -> Rectangles (filled)      773860
09:48:52.458 -> Circles (filled)         208860
09:48:52.678 -> Circles (outline)        225732
09:48:53.431 -> Triangles (outline)      58560
09:48:54.054 -> Triangles (filled)       365448
09:48:55.059 -> Rounded rects (outline)  79544
09:48:55.688 -> Rounded rects (filled)   868092
09:48:57.119 -> Done!
 
 
Не знаю, должно ли было что-то происходить на экране

должно. должно

Строчки выше - это типа отчет,  сколько микросекунд у вас на экране рисуются прямоугольники (rectangles) круги(circles) треугольники (triangles) и тд

А у вас ничего не рисуется.

Я вам советовал библиотеку kbv_myfriend - пробовали?

Oger
Offline
Зарегистрирован: 16.12.2020

b707 пишет:

[Я вам советовал библиотеку kbv_myfriend - пробовали?

Извиняюсь, пропустил. Завтра утром попрбую, оставил ардуину на работе.

Oger
Offline
Зарегистрирован: 16.12.2020

b707 пишет:

Возьмите либу mkv_myfriend, у нее в примерах есть скетч, который в Сериал Монитор выдает код контроллера дисплея, запустите его и выложите вывод на форум

Вот, что выдал монитор порта этой библиотеки, на примере скетча LCD_ID_readnew:

08:22:42.347 -> Read Special Registers on MCUFRIEND UNO shield
08:22:42.399 -> controllers either read as single 16-bit
08:22:42.441 -> e.g. the ID is at readReg(0)
08:22:42.441 -> or as a sequence of 8-bit values
08:22:42.481 -> in special locations (first is dummy)
08:22:42.561 -> 
08:22:42.561 -> diagnose any controller
08:22:42.561 -> reg(0x0000) 00 00	ID: ILI9320, ILI9325, ILI9335, ...
08:22:42.631 -> reg(0x0004) 04 04 04 04	Manufacturer ID
08:22:42.682 -> reg(0x0009) 09 09 09 09 09	Status Register
08:22:42.728 -> reg(0x000A) 0A 0A	Get Power Mode
08:22:42.761 -> reg(0x000C) 0C 0C	Get Pixel Format
08:22:42.799 -> reg(0x0030) 30 30 30 30 30	PTLAR
08:22:42.841 -> reg(0x0033) 33 33 33 33 33 33 33	VSCRLDEF
08:22:42.841 -> reg(0x0061) 61 61	RDID1 HX8347-G
08:22:42.882 -> reg(0x0062) 62 62	RDID2 HX8347-G
08:22:42.931 -> reg(0x0063) 63 63	RDID3 HX8347-G
08:22:42.981 -> reg(0x0064) 64 64	RDID1 HX8347-A
08:22:43.031 -> reg(0x0065) 65 65	RDID2 HX8347-A
08:22:43.081 -> reg(0x0066) 66 66	RDID3 HX8347-A
08:22:43.081 -> reg(0x0067) 67 67	RDID Himax HX8347-A
08:22:43.131 -> reg(0x0070) 70 70	Panel Himax HX8347-A
08:22:43.182 -> reg(0x00A1) A1 A1 A1 A1 A1	RD_DDB SSD1963
08:22:43.231 -> reg(0x00B0) B0 B0	RGB Interface Signal Control
08:22:43.271 -> reg(0x00B3) B3 B3 B3 B3 B3	Frame Memory
08:22:43.311 -> reg(0x00B4) B4 B4	Frame Mode
08:22:43.311 -> reg(0x00B6) B6 B6 B6 B6 B6	Display Control
08:22:43.394 -> reg(0x00B7) B7 B7	Entry Mode Set
08:22:43.441 -> reg(0x00BF) BF BF BF BF BF BF	ILI9481, HX8357-B
08:22:43.491 -> reg(0x00C0) C0 C0 C0 C0 C0 C0 C0 C0 C0	Panel Control
08:22:43.531 -> reg(0x00C1) C1 C1 C1 C1	Display Timing
08:22:43.581 -> reg(0x00C5) C5 C5	Frame Rate
08:22:43.581 -> reg(0x00C8) C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8 C8	GAMMA
08:22:43.681 -> reg(0x00CC) CC CC	Panel Control
08:22:43.681 -> reg(0x00D0) D0 D0 D0 D0	Power Control
08:22:43.731 -> reg(0x00D1) D1 D1 D1 D1	VCOM Control
08:22:43.767 -> reg(0x00D2) D2 D2 D2	Power Normal
08:22:43.811 -> reg(0x00D3) D3 D3 D3 D3	ILI9341, ILI9488
08:22:43.881 -> reg(0x00D4) D4 D4 D4 D4	Novatek
08:22:43.881 -> reg(0x00DA) DA DA	RDID1
08:22:43.931 -> reg(0x00DB) DB DB	RDID2
08:22:43.931 -> reg(0x00DC) DC DC	RDID3
08:22:43.981 -> reg(0x00E0) E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0	GAMMA-P
08:22:44.018 -> reg(0x00E1) E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1	GAMMA-N
08:22:44.097 -> reg(0x00EF) EF EF EF EF EF EF	ILI9327
08:22:44.177 -> reg(0x00F2) F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2	Adjust Control 2
08:22:44.221 -> reg(0x00F6) F6 F6 F6 F6	Interface Control
Запустив еще один из скетчей, наткнулся на довольно интересный отчет:

08:30:44.475 -> Diagnose whether this controller is supported
08:30:44.519 -> There are FAQs in extras/mcufriend_how_to.txt
08:30:44.519 -> 
08:30:44.566 -> tft.readID() finds: ID = 0xD3D3
08:30:44.613 -> 
08:30:44.613 -> MCUFRIEND_kbv version: 3.0.0
08:30:44.613 -> 
08:30:44.613 -> Probably a write-only Mega2560 Shield
08:30:44.659 -> Try to force ID = 0x9481
08:30:45.196 -> 
08:30:45.196 -> PORTRAIT is 320 x 480
08:30:45.196 -> 
08:30:45.196 -> Run the examples/graphictest_kbv sketch
08:30:45.247 -> All colours, text, directions, rotations, scrolls
08:30:45.296 -> should work.  If there is a problem,  make notes on paper
08:30:45.338 -> Post accurate description of problem to Forum
08:30:45.437 -> Or post a link to a video (or photos)
08:30:45.437 -> 
08:30:45.437 -> I rely on good information from remote users

Несмотря на хоть какие-то подвижки, растолкать его так и не удалось, даже сменив инициализацию на ILI9481

b707
Offline
Зарегистрирован: 26.05.2017

А вы в библиотеке my_friend включили поддержку 9481 или 8347? Без этого не заработает

Oger
Offline
Зарегистрирован: 16.12.2020

b707 пишет:
А вы в библиотеке my_friend включили поддержку 9481 или 8347? Без этого не заработает

Включил конечно.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Oger пишет:

Несмотря на хоть какие-то подвижки, растолкать его так и не удалось, даже сменив инициализацию на ILI9481

Тогда тестер в руки и ищем непропай. Китайцы этим грешат.

b707
Offline
Зарегистрирован: 26.05.2017

Oger, думаю остается только обьявить свой город - может найдется кто-то, кто за небольшую денежку свожет помочь вам справится с диплеем. Но для этого нужно иметь дисплей в руках, поэтому нужен человек рядом с Вами

Oger
Offline
Зарегистрирован: 16.12.2020

b707 пишет:

Oger, думаю остается только обьявить свой город - может найдется кто-то, кто за небольшую денежку свожет помочь вам справится с диплеем. Но для этого нужно иметь дисплей в руках, поэтому нужен человек рядом с Вами

К сожалению, я живу в жопе мира и у нас это в диковинку. Ездил в соседние города, они гордились (в группе ВК), что открыли магазин по ардуинкам, но у них даже в продаже не оказалось цветных дисплеев, только 2х, 4х строчечники Ч\Б, а что уж там говорить о ремонтниках...

P.S. Ставропольский край.

Oger
Offline
Зарегистрирован: 16.12.2020

mykaida пишет:

Oger пишет:

Несмотря на хоть какие-то подвижки, растолкать его так и не удалось, даже сменив инициализацию на ILI9481

Тогда тестер в руки и ищем непропай. Китайцы этим грешат.

Я писал выше, что проверил всю колодку светодиодом, все пины рабочие.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Oger пишет:

Я писал выше, что проверил всю колодку светодиодом, все пины рабочие.

Ищем дальше. Колодка - не пуп земли, а только середина ;)

Oger
Offline
Зарегистрирован: 16.12.2020

А еще, что самое смешное, я не могу заказать новый дисплей, потому что ****я тех.поддержка алиэкспресса, спустя 12 лет моей регистрации на сайте, запросила KYC и подтверждение адреса моей прописки, хотя все 12 лет слали на этот адрес и все было ок =) Прошло уже 2 недели, отослал им все фотки, а от них ни ответа, ни привета.

Oger
Offline
Зарегистрирован: 16.12.2020

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

b707
Offline
Зарегистрирован: 26.05.2017

ну хотите, высылайте. Адрес могу дать.

не понятно только. какой вам в том прибыток, если я его "победю", дисплея то у вас уже не будет.

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

не понятно только. какой вам в том прибыток, если я его "победю", дисплея то у вас уже не будет.

Видимо, если придёт точно такой же, то есть шанс, что будет и рецепт подключения.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Видимо, если придёт точно такой же, то есть шанс, что будет и рецепт подключения.

ну тогда проще мне выслать ТС один из своих дисплеев, который я уже запустил с ардуиной. Прибавив, естесственно, к цене дисплея стоимость "услуг" :)))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Oger пишет:

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

высылай или привези, мой аул рядом  )))
НИК на яндексе - почта

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

высылай или привези, мой аул рядом  )))
НИК на яндексе - почта

а, ну атлично.

Тогда мое предложение снимается.

IgorDrev
Offline
Зарегистрирован: 28.12.2020

Всем добрый день. Как раз сегодня получил пару LCD  на которых кроме строки: - 3.5" TFT LCD Shield больше нет никаких надписей. На странице заказа в спецификации драйвер обозначен как ili9486. 
Хотел быстренько протестировать их работу от стандартной UNO. Однако все найденные библиотеки отказывались работать. После загрузки больших скетчей можно было наблюдать лишь слабое изменение яркости подсветки дисплея. А монитор порта выдавал кракозябры типа как при неправильной скорости порта. Поиски проблемы вывели на библиотеку MCUFRIEND_kbv. К большой радости Все приметы из этой библиотеки прекрасно работают. Выдает ID=0x9486. 

PS: а до этого тоже начал думать что проблема в дисплеях

b707
Offline
Зарегистрирован: 26.05.2017

IgorDrev пишет:

А монитор порта выдавал кракозябры типа как при неправильной скорости порта.

о хосподи.... монитор-то тут причем?

После этой фразы все остальные заиграли новыми красками :))))

Oger
Offline
Зарегистрирован: 16.12.2020

Итак, спустя почти 3 месяца, пришел мне другой дисп от того же продавана, на этот раз не брак, инициализировался стандартной UTFT с первого раза. Был косяк с зеркалированием отображения, но его пофиксил. Осталось 2 вопроса: какого хуанхэ дисплей так мерцает и как повернуть экран на 180 градусов, т.к. место под определенное положение дисплея уже вырезано в корпусе? В других библиотеках за это отвечает параметр rotate и т.д. но в UTFT нашел связь только с теме же параметрами, которые отвечают за зеркалирование изображения, но пока ума не дал. Убирал зеркалирование добавлением свапа в строки:

void UTFT::setXY(word x1, word y1, word x2, word y2)
{
	if (orient==LANDSCAPE)
	{
		swap(word, x1, y1);
		swap(word, x2, y2)
		y1=disp_y_size-y1;
		y2=disp_y_size-y2;
		x1=disp_x_size-x1;
		x2=disp_x_size-x2;
		swap(word, x1, x2);
		swap(word, y1, y2)
	}

 

P.S. По поводу мерцания: реально ли, что провода, соединяющие дисп с мегой так дико ловят наводки? Может прицепить на 5В резистор?

P.P.S. Видео мерцания. https://yadi.sk/i/eWYWHNZD-vjLIw

Снято на телефон, герцовка сглаживает мерцание, но в реальности просто жесть.

Update. Залил еще несколько скетчей, чтобы был занят весь экран. Вроде не мерцает, значит проблема в переделанном UTFT под проект.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

видимо, ты весь экран чистишь перед выводом, а это весьма медленная операция

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Oger, статичное изображение мерцает?

Если "нет" - ищи глюки в своей программе.

Oger
Offline
Зарегистрирован: 16.12.2020

Победил мерцание в нужном скетче. Осталось повернуть отображение на 180 градусов.

Сейчас так

Надо вот в таком положении

nik182
Offline
Зарегистрирован: 04.05.2015

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

Oger
Offline
Зарегистрирован: 16.12.2020

nik182 пишет:
В библиотеке которую я пользовал с подобным дисплеем были дефайны с определением поворота. В принципе в командах инициализации дисплея, в самом конце есть строки отвечающие за поворот. Если они в библиотеке прокомментированы, то можно изменить прямо в библиотеке.

Я использовал UTFT и пока не нашел параметр, отвечающий за это

Единственное, что удалось выцепить за день копания в гугле, привело на одну из веток форума, где человек пишет:

LynXua пишет:

Для тех у кого 3.5" китайский дисплей на ili9481 (инициализируется с помощью UTFT myGLCD(CTE32HR,38,39,40,41);) и зеркальное изображение, в файле initlcd.h замените

	LCD_Write_COM(0x36); // Set address mode
	LCD_Write_DATA(0x0A);

на

	LCD_Write_COM(0x36); // Set address mode
	LCD_Write_DATA(0x1A);

Ну или вообще, поэксперементируйте с битами в этой конманде (можно повернуть на 90° например).

Завтра буду тестить. Только вот какие именно данные вводить - большая загадка.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Oger пишет:

Только вот какие именно данные вводить - большая загадка.

Все разгадки содержатся в дэйташите.

nik182
Offline
Зарегистрирован: 04.05.2015

Вытащил кусок драйвера. Действительно команда 0х36

	case GDISP_CONTROL_ORIENTATION:
			if (g->g.Orientation == (orientation_t)g->p.ptr)
				return;
			switch((orientation_t)g->p.ptr) {
			case GDISP_ROTATE_0:
				acquire_bus(g);

				write_reg(g, 0xC0, 0x03);
				write_reg(g, 0x36, 0x00);	/* X and Y axes non-inverted */

				release_bus(g);
				g->g.Height = GDISP_SCREEN_HEIGHT;
				g->g.Width = GDISP_SCREEN_WIDTH;
				break;
			case GDISP_ROTATE_90:
				acquire_bus(g);

				write_reg(g, 0xC0, 0x02);
				write_reg(g, 0x36, 0x20);	/* Invert X and Y axes */

				release_bus(g);
				g->g.Height = GDISP_SCREEN_WIDTH;
				g->g.Width = GDISP_SCREEN_HEIGHT;
				break;
			case GDISP_ROTATE_180:
				acquire_bus(g);

				write_reg(g, 0xC0, 0x06);
				write_reg(g, 0x36, 0x00);	/* X and Y axes non-inverted */

				release_bus(g);
				g->g.Height = GDISP_SCREEN_HEIGHT;
				g->g.Width = GDISP_SCREEN_WIDTH;
				break;
			case GDISP_ROTATE_270:
				acquire_bus(g);

				write_reg(g, 0xC0, 0x07);
				write_reg(g, 0x36, 0x20);	/* Invert X and Y axes */

				release_bus(g);
				g->g.Height = GDISP_SCREEN_WIDTH;
				g->g.Width = GDISP_SCREEN_HEIGHT;
				break;
			default:
				return;
			}
			g->g.Orientation = (orientation_t)g->p.ptr;
			return; 

 

Oger
Offline
Зарегистрирован: 16.12.2020

nik182 пишет:

Вытащил кусок драйвера. Действительно команда 0х36

Итого, чтобы провернуть на 180 градусов, нужно было удалить новые свапы, которые я дописывал, чтобы избавиться от зеркального изображения и заменить значение битов в строке DATA на 

//LCD_Write_COM(0x21);   // INVERT COLOR
        LCD_Write_COM(0x36);   // MIRROR
        LCD_Write_DATA(0x8A);  // MIRROR   LCD_Write_DATA(0x0A);

 

 
Свапы стандартные:

void UTFT::setXY(word x1, word y1, word x2, word y2)
{
if (orient==LANDSCAPE)
{
swap(word, x1, y1);
swap(word, x2, y2)
y1=disp_y_size-y1;
y2=disp_y_size-y2;
swap(word, y1, y2)
}