Не работает дисплей Mega 2560
- Войдите на сайт для отправки комментариев
Господа, выручайте, вторые сутки пошли, как забрал посылку из поднебесной и мучаю её и себя. Перепробовал около десятка различных скетчей и библиотек к ним с гитхаба и других ресурсов, но экран предательски не хочет показывать ничего, кроме белого фона. Скетч и библиотеки 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]
Было такое. Посмотри в библиотеке. У меня при инициализации она запрашивала код дисплея. Определяла не правильно и затыкалась.
Отключил этот блок и жестко назначил дисплей и все пошло.
И, кстати, представь программу.
Было такое. Посмотри в библиотеке. У меня при инициализации она запрашивала код дисплея. Определяла не правильно и затыкалась.
Отключил этот блок и жестко назначил дисплей и все пошло.
И, кстати, представь программу.
Скетч использую любой, тупо из примеров библиотек 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, но тоже тщетно
Скетч использую любой, тупо из примеров библиотек UTFT (например)
Что пишет серийный порт? Где затыкается исполнении программы?
И, все-таки, опубликуйте программу от которой мы и будем искать проблему. У меня, например, UTFT не стоит и я пользовался стандартной Adafruit TFT.
Скетч использую любой, тупо из примеров библиотек UTFT (например), там код минимален, цифры, буквы, геометрические фигуры.
Вы, походу, полный новичок в этом, вам представляется, что чем проще вы код дисплею подсунете - тем больше шансов что он ответит взаимностью :)
так у вас ничего не выйдет. Нужно найти правильную инициализацию для вашего контроллера -без нее вам даже просто одним цветом экран залить нет шансов.
Библиотека UTFT не лучший выбор для тестирования неизвестных дисплеев. Возьмите либу mkv_myfriend, у нее в примерах есть скетч, который в Сериал Монитор выдает код контроллера дисплея, запустите его и выложите вывод на форум
У мня такой дисплей завелся только с инициализацией от 8357b
так у вас ничего не выйдет. Нужно найти правильную инициализацию для вашего контроллера -без нее вам даже просто одним цветом экран залить нет шансов.
Библиотека UTFT не лучший выбор для тестирования неизвестных дисплеев. Возьмите либу mkv_myfriend, у нее в примерах есть скетч, который в Сериал Монитор выдает код контроллера дисплея, запустите его и выложите вывод на форум
Абсолютно верно, в ардуино полный новичок, но работаю в тех.сфере IT, поэтому что-то да умею. Собираю инфракрасную паяльную станцию на этом контроллере, для снятия чипов с плат. Завтра попробую библиотеку, которую вы посоветовали, спасибо. Но, забегая наперед, сегодня ставил LCD ID Reader, так он послал меня куда подальше, сказав, что он не читает мой дисплей...ну, точнее выдал в Мониторе порта ID 0х0000.
P.S. Получится ли у меня проверить правую колодку Meg'и, куда подключается дисплей, на предмет того, передают ли пины команды? Может проблема не в дисплее, а в колодке? Запаять диод (через резистор) и в Blink скетче назначать по очереди все пины с 22го по 53й.
У мня такой дисплей завелся только с инициализацией от 8357b
UTFT myGLCD(HX8357b,38,39,40,41);
Так? Спасибо, завтра попробую.
Скетч использую любой, тупо из примеров библиотек UTFT (например)
Что пишет серийный порт? Где затыкается исполнении программы?
И, все-таки, опубликуйте программу от которой мы и будем искать проблему. У меня, например, UTFT не стоит и я пользовался стандартной Adafruit TFT.
Oger, неужели за два дня нельзя было прочитать правила форума?
P.S. Получится ли у меня проверить правую колодку Meg'и, куда подключается дисплей, на предмет того, передают ли пины команды? Может проблема не в дисплее, а в колодке? Запаять диод (через резистор) и в Blink скетче назначать по очереди все пины с 22го по 53й.
Я бы не тратил время. Вероятность, что проблема в Меге, а не в дисплее - 1 к 1000
Но если очень хочется - то можно. Нужен любой светодиод и резистор примерно на 300-500 Ом. паять необязательно, можно проводками
P.S. Получится ли у меня проверить правую колодку Meg'и, куда подключается дисплей, на предмет того, передают ли пины команды? Может проблема не в дисплее, а в колодке? Запаять диод (через резистор) и в Blink скетче назначать по очереди все пины с 22го по 53й.
Я бы не тратил время. Вероятность, что проблема в Меге, а не в дисплее - 1 к 1000
Но если очень хочется - то можно. Нужен любой светодиод и резистор примерно на 300-500 Ом. паять необязательно, можно проводками
С самой то мегой проблем вроде нет, заливал скетч Hello World и получал его обратно по монитору порта, а вот криво запаянные колодки меня смутили.
И, все-таки, опубликуйте программу
Спасибо, а Вы уверенны, что эта библиотека поддерживает Ваш дисплей? Я не очень как то...
И, все-таки, опубликуйте программу
Спасибо, а Вы уверенны, что эта библиотека поддерживает Ваш дисплей? Я не очень как то...
В папке с библиотекой, есть файл memorysaver, в котором содержатся поддерживаемые дисплеи. Если мой дисп действительно на ILI9486 (в чем я уже не уверен), то он там присутствует. Но мне еще сам продавец с али скидывал ссылки (в первом посте) LCDWIKI_GUI и LCDWIKI_KBV, (мол, 100% для этого дисплея). Там история такая же. Еще вспомнил, что люди, задававшие вопросы прямо на странице изделия на али, использовали TFT_HX8357 эту библиотеку, но и с ней подружить мне не удалось.
[
Ну теперь пишем после setup()
Serial.begin (9600);
А после 39 строки
Serial.println("INIT");
И мониторим порт (Ctrl+Shift+M)
А перед этим строим порт под 9600
И мониторим порт (Ctrl+Shift+M)
Скачал сегодня библиотеку, под чип, который посоветовали чуть выше (TFT_HX8357.h), там есть в примерах graphicstest_320x480. С монитором порта. Вот, что он выдал в мониторе:
Сам скетч:
/* 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 ****************************************************/Проверил всю правую колодку, на которую на самой меге подключается дисплей светодиодом, все пины отзываются, мигает. Значит дело либо в самом дисплее, либо в неверном описании пинов, либо в чипе и тут стоит нифига не ILI9486.
Скачал сегодня библиотеку, под чип, который посоветовали чуть выше (TFT_HX8357.h), там есть в примерах graphicstest_320x480. С монитором порта. Вот, что он выдал в мониторе:
должно. должно
Строчки выше - это типа отчет, сколько микросекунд у вас на экране рисуются прямоугольники (rectangles) круги(circles) треугольники (triangles) и тд
А у вас ничего не рисуется.
Я вам советовал библиотеку kbv_myfriend - пробовали?
[Я вам советовал библиотеку kbv_myfriend - пробовали?
Извиняюсь, пропустил. Завтра утром попрбую, оставил ардуину на работе.
Возьмите либу mkv_myfriend, у нее в примерах есть скетч, который в Сериал Монитор выдает код контроллера дисплея, запустите его и выложите вывод на форум
Вот, что выдал монитор порта этой библиотеки, на примере скетча LCD_ID_readnew:
Несмотря на хоть какие-то подвижки, растолкать его так и не удалось, даже сменив инициализацию на ILI9481
А вы в библиотеке my_friend включили поддержку 9481 или 8347? Без этого не заработает
Включил конечно.
Несмотря на хоть какие-то подвижки, растолкать его так и не удалось, даже сменив инициализацию на ILI9481
Тогда тестер в руки и ищем непропай. Китайцы этим грешат.
Oger, думаю остается только обьявить свой город - может найдется кто-то, кто за небольшую денежку свожет помочь вам справится с диплеем. Но для этого нужно иметь дисплей в руках, поэтому нужен человек рядом с Вами
Oger, думаю остается только обьявить свой город - может найдется кто-то, кто за небольшую денежку свожет помочь вам справится с диплеем. Но для этого нужно иметь дисплей в руках, поэтому нужен человек рядом с Вами
К сожалению, я живу в жопе мира и у нас это в диковинку. Ездил в соседние города, они гордились (в группе ВК), что открыли магазин по ардуинкам, но у них даже в продаже не оказалось цветных дисплеев, только 2х, 4х строчечники Ч\Б, а что уж там говорить о ремонтниках...
P.S. Ставропольский край.
Несмотря на хоть какие-то подвижки, растолкать его так и не удалось, даже сменив инициализацию на ILI9481
Тогда тестер в руки и ищем непропай. Китайцы этим грешат.
Я писал выше, что проверил всю колодку светодиодом, все пины рабочие.
Я писал выше, что проверил всю колодку светодиодом, все пины рабочие.
Ищем дальше. Колодка - не пуп земли, а только середина ;)
А еще, что самое смешное, я не могу заказать новый дисплей, потому что ****я тех.поддержка алиэкспресса, спустя 12 лет моей регистрации на сайте, запросила KYC и подтверждение адреса моей прописки, хотя все 12 лет слали на этот адрес и все было ок =) Прошло уже 2 недели, отослал им все фотки, а от них ни ответа, ни привета.
Итак, т.к. победить дисплей не удалось, открыл спор на али, сделали возврат средств. Если кому интересно и есть желание (из пытавшихся помочь), могу выслать дисплей почтой или чем-нибудь еще дешманским, дабы поковырять.
ну хотите, высылайте. Адрес могу дать.
не понятно только. какой вам в том прибыток, если я его "победю", дисплея то у вас уже не будет.
не понятно только. какой вам в том прибыток, если я его "победю", дисплея то у вас уже не будет.
Видимо, если придёт точно такой же, то есть шанс, что будет и рецепт подключения.
Видимо, если придёт точно такой же, то есть шанс, что будет и рецепт подключения.
ну тогда проще мне выслать ТС один из своих дисплеев, который я уже запустил с ардуиной. Прибавив, естесственно, к цене дисплея стоимость "услуг" :)))
Итак, т.к. победить дисплей не удалось, открыл спор на али, сделали возврат средств. Если кому интересно и есть желание (из пытавшихся помочь), могу выслать дисплей почтой или чем-нибудь еще дешманским, дабы поковырять.
высылай или привези, мой аул рядом )))
НИК на яндексе - почта
высылай или привези, мой аул рядом )))
НИК на яндексе - почта
а, ну атлично.
Тогда мое предложение снимается.
Всем добрый день. Как раз сегодня получил пару LCD на которых кроме строки: - 3.5" TFT LCD Shield больше нет никаких надписей. На странице заказа в спецификации драйвер обозначен как ili9486.
Хотел быстренько протестировать их работу от стандартной UNO. Однако все найденные библиотеки отказывались работать. После загрузки больших скетчей можно было наблюдать лишь слабое изменение яркости подсветки дисплея. А монитор порта выдавал кракозябры типа как при неправильной скорости порта. Поиски проблемы вывели на библиотеку MCUFRIEND_kbv. К большой радости Все приметы из этой библиотеки прекрасно работают. Выдает ID=0x9486.
PS: а до этого тоже начал думать что проблема в дисплеях
А монитор порта выдавал кракозябры типа как при неправильной скорости порта.
о хосподи.... монитор-то тут причем?
После этой фразы все остальные заиграли новыми красками :))))
Итак, спустя почти 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 под проект.
видимо, ты весь экран чистишь перед выводом, а это весьма медленная операция
Oger, статичное изображение мерцает?
Если "нет" - ищи глюки в своей программе.
Победил мерцание в нужном скетче. Осталось повернуть отображение на 180 градусов.
Сейчас так
Надо вот в таком положении
В библиотеке которую я пользовал с подобным дисплеем были дефайны с определением поворота. В принципе в командах инициализации дисплея, в самом конце есть строки отвечающие за поворот. Если они в библиотеке прокомментированы, то можно изменить прямо в библиотеке.
Я использовал UTFT и пока не нашел параметр, отвечающий за это
Единственное, что удалось выцепить за день копания в гугле, привело на одну из веток форума, где человек пишет:
Для тех у кого 3.5" китайский дисплей на ili9481 (инициализируется с помощью UTFT myGLCD(CTE32HR,38,39,40,41);) и зеркальное изображение, в файле initlcd.h замените
на
Ну или вообще, поэксперементируйте с битами в этой конманде (можно повернуть на 90° например).
Завтра буду тестить. Только вот какие именно данные вводить - большая загадка.
Только вот какие именно данные вводить - большая загадка.
Все разгадки содержатся в дэйташите.
Вытащил кусок драйвера. Действительно команда 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;Вытащил кусок драйвера. Действительно команда 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) }