Проблемы с очисткой TFTдисплея
- Войдите на сайт для отправки комментариев
Сб, 10/04/2021 - 14:45
Заказал я у китайцев дисплей с тач падом на контроллере ST7796. И лишь когда он пришел, я обнаружил, что его не поддерживает библиотека UTFT. С помощью форумов, интернета и чуда удалось написать для него инициализацию. И пример UTFT_Demo_480x320 отрабатывает превосходно, но при очистке экрана (myGLCD.clrScr ();), он мерцает. (Какие-то белые полосы) Потом я добавил татч пад и запустил пример URTouch_QuickPaint и тут он стал мерцать все время, но чем больше я закрашиваю тем меньше он мерцает, и вовсе перестаёт. Видимо он мерцает из-за определенного не задан цвет. Может кто знает как это поправить?
Скетч URTouch_QuickPaint:
// URTouch_QuickPaint // Copyright (C) 2015 Rinky-Dink Electronics, Henning Karlsen. Все права защищены // Интернет: http://www.RinkyDinkElectronics.com/ // // Эта программа представляет собой быструю демонстрацию того, как использовать библиотеку. // // Эта программа требует библиотеки UTFT и дисплея // модуль с разрешением не менее 320x240 пикселей. // // Предполагается, что дисплейный модуль подключен к // соответствующий щит или что вы умеете менять штифт // числа в настройке. // #include <UTFT.h> #include <URTouch.h> // Инициализируем отображение // ------------------ // Установите контакты на правильные для вашей платы разработки // ------------------------------------------------ ----------- // Стандартный Arduino Uno / 2009 Shield: <модель дисплея>, 19,18,17,16 // Стандартный Arduino Mega / Due Shield: <модель дисплея>, 38,39,40,41 // CTE TFT LCD / SD Shield для Arduino Должен: <модель дисплея>, 25,26,27,28 // Тестовая плата Teensy 3.x TFT: <модель дисплея>, 23,22, 3, 4 // ElecHouse TFT LCD / SD Shield для Arduino Due: <модель дисплея>, 22,23,31,33 // // Не забудьте изменить параметр модели в соответствии с вашим модулем отображения! // UTFT myGLCD (ITDB32S, 38,39,40,41); // Инициализируем сенсорный экран // ---------------------- // Установите контакты на правильные для вашей платы разработки // ------------------------------------------------ ----------- // Стандартный Arduino Uno / 2009 Shield: 15,10,14, 9, 8 // Стандартный Arduino Mega / Due Shield: 6, 5, 4, 3, 2 // CTE TFT LCD / SD Shield для Arduino Due: 6, 5, 4, 3, 2 // Тестовая плата Teensy 3.x TFT: 26,31,27,28,29 // ElecHouse TFT LCD / SD Shield для Arduino Срок: 25,26,27,29,30 // UTFT myGLCD (ST7796, 38, 39, 40, 41, 42); URTouch myTouch (43, 44, 45,46, 47); // Объявляем, какие шрифты мы будем использовать extern uint8_t BigFont []; int color = 0; список цветов слов [] = {VGA_WHITE, VGA_BLACK, VGA_RED, VGA_BLUE, VGA_GREEN, VGA_FUCHSIA, VGA_YELLOW, VGA_AQUA}; int bsize = 4; void drawColorMarkerAndBrushSize (int col) { myGLCD.setColor (VGA_BLACK); myGLCD.fillRect (25, 0, 31, 239); myGLCD.fillRect (myGLCD.getDisplayXSize () - 31, 161, myGLCD.getDisplayXSize () - 1, 191); myGLCD.setColor (VGA_WHITE); myGLCD.drawPixel (25, (столбец * 30) +15); для (int я = 1; я <7; я ++) myGLCD.drawLine (25 + я, ((столбец * 30) +15) -i, 25 + я, ((столбец * 30) +15) + я); если (цвет == 1) myGLCD.setColor (VGA_WHITE); еще myGLCD.setColor (список цветов [столбец]); если (размер == 1) myGLCD.drawPixel (myGLCD.getDisplayXSize () - 15, 177); еще myGLCD.fillCircle (myGLCD.getDisplayXSize () - 15, 177, bsize); myGLCD.setColor (список цветов [столбец]); } установка void () { Serial.begin (9600); myGLCD.InitLCD (); myGLCD.clrScr (); myGLCD.setFont (BigFont); myTouch.InitTouch (); myTouch.setPrecision (PREC_HI); myGLCD.setColor (VGA_WHITE); myGLCD.drawLine (32,0,32, myGLCD.getDisplayYSize () - 1); myGLCD.drawLine (myGLCD.getDisplayXSize () - 32,0, myGLCD.getDisplayXSize () - 32, myGLCD.getDisplayYSize () - 1); myGLCD.print ("C", myGLCD.getDisplayXSize () - 24, 8); myGLCD.print («L», myGLCD.getDisplayXSize () - 24, 24); myGLCD.print («E», myGLCD.getDisplayXSize () - 24, 40); myGLCD.print ("A", myGLCD.getDisplayXSize () - 24, 56); myGLCD.print («R», myGLCD.getDisplayXSize () - 24, 72); myGLCD.print («+», myGLCD.getDisplayXSize () - 24, 136); myGLCD.print ("-", myGLCD.getDisplayXSize () - 24, 200); myGLCD.fillRect (myGLCD.getDisplayXSize () - 32,96, myGLCD.getDisplayXSize () - 1,128); myGLCD.drawLine (myGLCD.getDisplayXSize () - 32,160, myGLCD.getDisplayXSize () - 1,160); myGLCD.drawLine (myGLCD.getDisplayXSize () - 32 192, myGLCD.getDisplayXSize () - 1192); myGLCD.drawLine (myGLCD.getDisplayXSize () - 32 224, myGLCD.getDisplayXSize () - 1224); для (int я = 0; я <8; я ++) { myGLCD.setColor (список цветов [i]); myGLCD.fillRect (0, (i * 30), 24, (((i + 1) * 30) -1)); } drawColorMarkerAndBrushSize (цвет); } пустой цикл () { длинные х, у; пока (myTouch.dataAvailable () == true) { myTouch.read (); х = myTouch.getX (); y = myTouch.getY (); //Serial.println(x+"\t"+y); // х = 320-х; // y = 240-y; х = карта (х, 0, 320, 0, 480); y = map (y, 0, 240, 0, 320); если ((x! = - 1) и (y! = - 1)) { если (x> (31 + bsize) и (x <myGLCD.getDisplayXSize () - (31 + bsize))) { если (размер == 1) myGLCD.drawPixel (x, y); еще myGLCD.fillCircle (x, y, bsize); } еще { если (x <(30 + bsize)) { если (y <240) { цвет = y / 30; drawColorMarkerAndBrushSize (цвет); while (myTouch.dataAvailable ()) {}; задержка (50); } } еще { если (y <96) { myGLCD.setColor (VGA_BLACK); myGLCD.fillRect (33, 0, myGLCD.getDisplayXSize () - 33, myGLCD.getDisplayYSize () - 1); myGLCD.setColor (список цветов [цвет]); } если ((y> 128) и (y <160)) { если (размер <7) { bsize ++; drawColorMarkerAndBrushSize (цвет); while (myTouch.dataAvailable ()) {}; задержка (50); } } если ((y> 160) и (y <192)) { bsize = 4; drawColorMarkerAndBrushSize (цвет); while (myTouch.dataAvailable ()) {}; задержка (50); } если ((y> 192) и (y <224)) { если (размер> 1) { bsize--; drawColorMarkerAndBrushSize (цвет); while (myTouch.dataAvailable ()) {}; задержка (50); } } } } } } }
Инициализация дисплея
case ST7796: LCD_Write_COM(0xE0); LCD_Write_DATA(0x00); LCD_Write_DATA(0x07); LCD_Write_DATA(0x10); LCD_Write_DATA(0x09); LCD_Write_DATA(0x17); LCD_Write_DATA(0x0B); LCD_Write_DATA(0x40); LCD_Write_DATA(0x8A); LCD_Write_DATA(0x4B); LCD_Write_DATA(0x0A); LCD_Write_DATA(0x0D); LCD_Write_DATA(0x0F); LCD_Write_DATA(0x15); LCD_Write_DATA(0x16); LCD_Write_DATA(0x0F); LCD_Write_COM(0xE1); LCD_Write_DATA(0x00); LCD_Write_DATA(0x1A); LCD_Write_DATA(0x1B); LCD_Write_DATA(0x02); LCD_Write_DATA(0x0D); LCD_Write_DATA(0x05); LCD_Write_DATA(0x30); LCD_Write_DATA(0x35); LCD_Write_DATA(0x43); LCD_Write_DATA(0x02); LCD_Write_DATA(0x0A); LCD_Write_DATA(0x09); LCD_Write_DATA(0x32); LCD_Write_DATA(0x36); LCD_Write_DATA(0x0F); LCD_Write_COM(0xB1); LCD_Write_DATA(0xA0); LCD_Write_COM(0xB4); LCD_Write_DATA(0x02); LCD_Write_COM(0xC0); LCD_Write_DATA(0x17); LCD_Write_DATA(0x15); LCD_Write_COM(0xC1); LCD_Write_DATA(0x41); LCD_Write_COM(0xC5); LCD_Write_DATA(0x00); LCD_Write_DATA(0x0A); LCD_Write_DATA(0x80); LCD_Write_COM(0xB6); LCD_Write_DATA(0x02); LCD_Write_COM(0x36); LCD_Write_DATA(0x48); // было 0x48 0b01001000 , чтобы перевернуть надо 0x88 0b10001000 LCD_Write_COM(0x3a); LCD_Write_DATA(0x05); //55-65k 56-262k LCD_Write_COM(0xE9); LCD_Write_DATA(0x00); LCD_Write_COM(0XF7); LCD_Write_DATA(0xA9); LCD_Write_DATA(0x51); LCD_Write_DATA(0x2C); LCD_Write_DATA(0x82); LCD_Write_COM(0x11); delay(120); LCD_Write_COM(0x29); delay(500); break;
Что за дичь на русском языке ? Завязывайте с этим или уж пишите полностью весь код так.
Прошу прошения, В браузере сработал авто перевод, а я и не заметил
Не знаю что вы понимаете под мерцанием, но... myGLCD.clrScr(); в общем то пофиг - вы его один раз вызываете, попробуйте отключать вызовы отрисовки и определить какие именно функции вызывают мерцание. Другой подходящей библиотеки нет ?
Мерцать он начинает когда на мониторчике преобладает черный.
Черные фигуры на белом
https://vk.com/video537065465_456239079
Белые на черном
https://vk.com/video537065465_456239080
Мдя... Черные на белом вроде все ок. Белые на черном на видео жуть как выглядит, вот прям с таким не сталкивался. Любая отрисовка вызывает мерцание ? Вообще я бы цветной дисплей на обычную ардуину не вешал без необходимости, stm c библиотекой, использующей DMA, настолько быстрее рисует, что капец.