Проблемы с очисткой TFTдисплея

Muramur2000
Offline
Зарегистрирован: 11.11.2020

Заказал я у китайцев дисплей с тач падом на контроллере 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;

 

Morroc
Offline
Зарегистрирован: 24.10.2016

Что за дичь на русском языке ? Завязывайте с этим или уж пишите полностью весь код так.

Muramur2000
Offline
Зарегистрирован: 11.11.2020
// URTouch_QuickPaint 
// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// This program is a quick demo of how to use the library.
//
// This program requires the UTFT library and a display
// module with at least 320x240 pixels resolution.
//
// It is assumed that the display module is connected to an
// appropriate shield or that you know how to change the pin 
// numbers in the setup.
//

#include <UTFT.h>
#include <URTouch.h>

// Initialize display
// ------------------
// Set the pins to the correct ones for your development board
// -----------------------------------------------------------
// Standard Arduino Uno/2009 Shield            : <display model>,19,18,17,16
// Standard Arduino Mega/Due shield            : <display model>,38,39,40,41
// CTE TFT LCD/SD Shield for Arduino Due       : <display model>,25,26,27,28
// Teensy 3.x TFT Test Board                   : <display model>,23,22, 3, 4
// ElecHouse TFT LCD/SD Shield for Arduino Due : <display model>,22,23,31,33
//
// Remember to change the model parameter to suit your display module!
//UTFT    myGLCD(ITDB32S,38,39,40,41);

// Initialize touchscreen
// ----------------------
// Set the pins to the correct ones for your development board
// -----------------------------------------------------------
// Standard Arduino Uno/2009 Shield            : 15,10,14, 9, 8
// Standard Arduino Mega/Due shield            :  6, 5, 4, 3, 2
// CTE TFT LCD/SD Shield for Arduino Due       :  6, 5, 4, 3, 2
// Teensy 3.x TFT Test Board                   : 26,31,27,28,29
// ElecHouse TFT LCD/SD Shield for Arduino Due : 25,26,27,29,30
//
UTFT myGLCD(ST7796, 38, 39, 40, 41, 42);
URTouch  myTouch( 43, 44, 45,46, 47);

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

int color = 0;
word colorlist[] = {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, (col*30)+15);
  for (int i=1; i<7; i++)
    myGLCD.drawLine(25+i, ((col*30)+15)-i, 25+i, ((col*30)+15)+i);
  
  if (color==1)
    myGLCD.setColor(VGA_WHITE);
  else
    myGLCD.setColor(colorlist[col]);
  if (bsize==1)
    myGLCD.drawPixel(myGLCD.getDisplayXSize()-15, 177);
  else
    myGLCD.fillCircle(myGLCD.getDisplayXSize()-15, 177, bsize);
    
  myGLCD.setColor(colorlist[col]);
}

void setup()
{
  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()-1,192);
  myGLCD.drawLine(myGLCD.getDisplayXSize()-32,224,myGLCD.getDisplayXSize()-1,224);
  for (int i=0; i<8; i++)
  {
    myGLCD.setColor(colorlist[i]);
    myGLCD.fillRect(0, (i*30), 24, (((i+1)*30)-1));
  }
  drawColorMarkerAndBrushSize(color);
}

void loop()
{
  long x, y;
  
  while (myTouch.dataAvailable() == true)
  {
    myTouch.read();
    x = myTouch.getX();
    y = myTouch.getY();
    //Serial.println(x+"\t"+y);
    //x=320-x;
    //y=240-y;
    x=map(x, 0, 320, 0, 480);
    y=map(y, 0, 240, 0, 320);
    if ((x!=-1) and (y!=-1))
    {
      if (x>(31+bsize) and (x<myGLCD.getDisplayXSize()-(31+bsize)))
      {
        if (bsize==1)
          myGLCD.drawPixel(x, y);
        else
          myGLCD.fillCircle(x, y, bsize);
      }
      else
      {
        if (x<(30+bsize))
        {
          if (y<240)
          {
            color = y / 30;
            drawColorMarkerAndBrushSize(color);
            while (myTouch.dataAvailable()) {};
            delay(50);
         }
        }
        else
        {
          if (y<96)
          {
            myGLCD.setColor(VGA_BLACK);
            myGLCD.fillRect(33, 0, myGLCD.getDisplayXSize()-33, myGLCD.getDisplayYSize()-1);
            myGLCD.setColor(colorlist[color]);
          }
          if ((y>128) and (y<160))
          {
            if (bsize<7)
            {
              bsize++;
              drawColorMarkerAndBrushSize(color);
              while (myTouch.dataAvailable()) {};
              delay(50);
            }
          }
          if ((y>160) and (y<192))
          {
              bsize=4;
              drawColorMarkerAndBrushSize(color);
              while (myTouch.dataAvailable()) {};
              delay(50);
          }
          if ((y>192) and (y<224))
          {
            if (bsize>1)
            {
              bsize--;
              drawColorMarkerAndBrushSize(color);
              while (myTouch.dataAvailable()) {};
              delay(50);
            }
          }
        }
      }
    }
  }
}

Прошу прошения, В браузере сработал авто перевод, а я и не заметил 

Morroc
Offline
Зарегистрирован: 24.10.2016

Не знаю что вы понимаете под мерцанием, но... myGLCD.clrScr(); в общем то пофиг - вы его один раз вызываете, попробуйте отключать вызовы отрисовки и определить какие именно функции вызывают мерцание. Другой подходящей библиотеки нет ?

Muramur2000
Offline
Зарегистрирован: 11.11.2020

Мерцать он начинает когда на мониторчике преобладает черный.

Черные фигуры на белом
https://vk.com/video537065465_456239079

Белые на черном
https://vk.com/video537065465_456239080

#include <UTFT.h>
#define BG 0,0,0
#define FG 255,255,255
UTFT myGLCD(ST7796, 38, 39, 40, 41, 42);
const int mount = 20;
int Xpoz[mount], Ypoz[mount];
int Xspeed[mount], Yspeed[mount];
int R[mount];

void setup() {
   randomSeed(analogRead(0));
   //Serial.begin(9600);
   myGLCD.InitLCD();
   myGLCD.fillScr(BG);
   for (byte i= 0; i < mount; i++){
    R[i]=random(2,11);
    Xpoz[i]=random( R[i] ,myGLCD.getDisplayXSize()-R[i]);
    Ypoz[i]=random( R[i] ,myGLCD.getDisplayYSize()-R[i]);
    Xspeed[i]=random(3,10)*((random(2))? 1 : -1);
    Yspeed[i]=random(3,10)*((random(2))? 1 : -1);
    }
    
  
}

void loop() {
  
  myGLCD.fillScr(BG);
  myGLCD.setColor(FG);
  for (byte i= 0; i < mount; i++){
    Xpoz[i]+=Xspeed[i];
    Ypoz[i]+=Yspeed[i];
    if (Xpoz[i]<=R[i] or Xpoz[i]>=myGLCD.getDisplayXSize()-R[i])Xspeed[i]= -Xspeed[i];
    if (Ypoz[i]<=R[i] or Ypoz[i]>=myGLCD.getDisplayYSize()-R[i])Yspeed[i]= -Yspeed[i]; 
    }
  for (byte i= 0; i < mount; i++){
    for (byte j= 0; j < i; j++){
      float dist = sqrt(sq(Xpoz[i]-Xpoz[j])+sq(Ypoz[i]-Ypoz[j])  );
      if (dist< 100) myGLCD.drawLine(Xpoz[i],Ypoz[i],Xpoz[j],Ypoz[j]);
      if (dist< 50) myGLCD.drawLine(Xpoz[i],Ypoz[i]-1,Xpoz[j],Ypoz[j]-1);
      if (dist< 25) myGLCD.drawLine(Xpoz[i],Ypoz[i]+1,Xpoz[j],Ypoz[j]+1);
    }
  }
  for (byte i= 0; i < mount; i++){
    myGLCD.fillCircle(Xpoz[i],Ypoz[i],R[i]);
    }
    

}

 

Morroc
Offline
Зарегистрирован: 24.10.2016

Мдя... Черные на белом вроде все ок. Белые на черном на видео жуть как выглядит, вот прям с таким не сталкивался. Любая отрисовка вызывает мерцание ? Вообще я бы цветной дисплей на обычную ардуину не вешал без необходимости, stm c библиотекой, использующей DMA, настолько быстрее рисует, что капец.