7'' TFT LCD Display - Touchscreen doensn't work sometimes

Hello everyone, I have a problem with my LCD touchscreen.
The SD system, and the display are working fine, but the touchscreen is giving troubles.

Sometimes it works, sometimes it doesn’t work. Resetting the power doesn’t always work, only sporadically. When it doesn’t work, the graphics load normally but if i press the screen nothing happens.
In other words, the function myTouch.dataAvailable() fails to return anything even if i press the screen.
(I tried even to press hard, no luck).

In particular, I believe there’s a problem with the function reading the data.
I’m using the UTFT and UTouch libraries, here is my code (It’s a sort of puzzle game with buttons):

//LIBRERIE

#include <SPI.h>
#include <SdFat.h>
#include <UTFT.h>
#include <UTouch.h>
#include <UTFT_SdRaw.h>

//SETUP
#define SD_CHIP_SELECT 53  // SD chip select pin
#define pin_out 7 //pin collegato all'attuatore

SdFat sd; // file system object
ArduinoOutStream cout(Serial); // print stream

UTFT myGLCD(CTE70,38,39,40,41);
UTFT_SdRaw myFiles(&myGLCD);
UTouch myTouch( 6, 5, 4, 3, 2);

//DEFINIZIONI
#define TOUCH_ORIENTATION LANDSCAPE
#define xsize 266
#define ysize 160
#define mrg 15
#define scr_width 800
#define scr_height 480

#define num_simb 3    //numero simboli diversi
#define num_butt 9    //numero di pulsanti
#define wait_time 300 //tempo disattivazione tocco
#define refresh 50    //periodo di rinfresco controllo tocco

#define avviato 0
#define irrisolto 1
#define risolto 2

//VARIABILI

int x, y;

char nome_imm[num_simb][8] = {"uno.raw", "due.raw", "tre.raw"};
char nome_imm_finale[8] = "end.raw";
int stato = avviato;
int soluzione[num_butt] = {2,1,1,3,2,2,1,3,3}; //la soluzione del gioco, ovvero la sequenza giusta
int comb[num_butt]      = {1,2,1,2,3,2,1,2,1}; //combinazione iniziale inserita
boolean buttonEnabled = true;

extern uint8_t SmallFont[];
extern uint8_t BigFont[];

//FUNZIONI

int x_pos(int n) { //0 sinistra, 1 centro, 2 destra
  return xsize*n;
  }

int y_pos(int n) { //0 alto, 1 centro, 2 basso
  return ysize*n;
  }
  
void cambia_immagine(int imm_n, int xx, int yy) {
  comb[imm_n-1] += 1;

  if (comb[imm_n-1] > num_simb) {
    comb[imm_n-1] = 1;
    }
  Serial.println("Cambio l'immagine "+String(imm_n)+", adesso e' la: "+String(comb[imm_n-1]));
  
  myFiles.load(xx, yy, xsize, ysize, nome_imm[comb[imm_n-1]-1]);
  }

bool check_solution() {
  bool giudice = true;
  for (int i = 0; i < num_butt; i++) {
    if (comb[i] != soluzione[i]) {
        giudice = false;
        return false;
        }
    }
  
  if (giudice = true) {
    stato = risolto;
    myGLCD.clrScr();
    return true;
    }
  }

void setup() {
  pinMode(pin_out,OUTPUT);
  digitalWrite(pin_out,LOW);
  
  Serial.begin(9600);
  
  Serial.println("Initialising SD card...");
  bool mysd = false;
  // see if the card is present and can be initialized:
  while (!mysd)
  {
    if (!sd.begin(SD_CHIP_SELECT, SPI_FULL_SPEED)) {
      Serial.println("Card failed, or not present");
      Serial.println("Retrying....");
    }
    else
    {
      mysd = 1;
      Serial.println("Card initialised.");
    }
  }
  Serial.println("Initialising LCD.");
  myGLCD.InitLCD();
  Serial.println("LCD initialised.");
  Serial.println("Initialising Touchscreen.");
  myTouch.InitTouch(TOUCH_ORIENTATION);
  myTouch.setPrecision(PREC_HI);
  Serial.println("Touchscreen initialised.");
  }

bool ctrl;

void loop() {
  switch (stato) {
    case avviato:
    myGLCD.clrScr();
    myFiles.load(x_pos(0), y_pos(0), xsize, ysize, nome_imm[0]);
    myFiles.load(x_pos(1), y_pos(0), xsize, ysize, nome_imm[1]);
    myFiles.load(x_pos(2), y_pos(0), xsize, ysize, nome_imm[0]);
    myFiles.load(x_pos(0), y_pos(1), xsize, ysize, nome_imm[1]);
    myFiles.load(x_pos(1), y_pos(1), xsize, ysize, nome_imm[2]);
    myFiles.load(x_pos(2), y_pos(1), xsize, ysize, nome_imm[1]);
    myFiles.load(x_pos(0), y_pos(2), xsize, ysize, nome_imm[0]);
    myFiles.load(x_pos(1), y_pos(2), xsize, ysize, nome_imm[1]);
    myFiles.load(x_pos(2), y_pos(2), xsize, ysize, nome_imm[0]);
    stato = irrisolto;
    Serial.println("Pictures loaded! Ready to go!");
    ctrl = false;
    break;
    case irrisolto:
    if (myTouch.dataAvailable()){ //Se premi il display...
      if (!ctrl) {
        Serial.println("Il Touch funziona!");
        ctrl = true;
        }
      myTouch.read();
      x = myTouch.getX();
      y = myTouch.getY();
      //Serial.println("Toccato in: "+String(x)+","+String(y));
      if (x > x_pos(2)+mrg && x < x_pos(3) && y > y_pos(2)+mrg && y < y_pos(3) && buttonEnabled){ // selezione nono tasto
        buttonEnabled = false; //Disable button
        Serial.println("Toccato tasto 9");
        cambia_immagine(9, x_pos(2), y_pos(2));
        delay(wait_time);
        }
      else if (x > x_pos(1)+mrg && x < x_pos(2)-mrg && y > y_pos(2)+mrg && y < y_pos(3) && buttonEnabled){ // selezione ottavo tasto
        buttonEnabled = false; //Disable button
        Serial.println("Toccato tasto 8");
        cambia_immagine(8, x_pos(1), y_pos(2));
        delay(wait_time);
        }
      else if (x > x_pos(0) && x < x_pos(1)-mrg && y > y_pos(2)+mrg && y < y_pos(3) && buttonEnabled){ // selezione settimo tasto
        buttonEnabled = false; //Disable button
        Serial.println("Toccato tasto 7");
        cambia_immagine(7,x_pos(0),y_pos(2));
        delay(wait_time);
        }
      else if (x > x_pos(2)+mrg && x < x_pos(3) && y > y_pos(1)+mrg && y < y_pos(2)-mrg && buttonEnabled){ // selezione sesto tasto
        buttonEnabled = false; //Disable button
        Serial.println("Toccato tasto 6");
        cambia_immagine(6, x_pos(2), y_pos(1));
        delay(wait_time);
        }
      else if (x > x_pos(1)+mrg && x < x_pos(2)-mrg && y > y_pos(1)+mrg && y < y_pos(2)-mrg && buttonEnabled){ // selezione quinto tasto
        buttonEnabled = false; //Disable button
        Serial.println("Toccato tasto 5");
        cambia_immagine(5, x_pos(1), y_pos(1));
        delay(wait_time);
        }
      else if (x > x_pos(0) && x < x_pos(1)-mrg && y > y_pos(1)+mrg && y < y_pos(2)-mrg && buttonEnabled){ // selezione quarto tasto
        buttonEnabled = false; //Disable button
        Serial.println("Toccato tasto 4");
        cambia_immagine(4,x_pos(0),y_pos(1));
        delay(wait_time);
        }
      else if (x > x_pos(2)+mrg && x < x_pos(3) && y > y_pos(0) && y < y_pos(1)-mrg && buttonEnabled) { // selezione terzo tasto
        buttonEnabled = false; //Disable button
        Serial.println("Toccato tasto 3");
        cambia_immagine(3,x_pos(2),y_pos(0));
        delay(wait_time);
        }
      else if (x > x_pos(1)+mrg && x < x_pos(2)-mrg && y > y_pos(0) && y < y_pos(1)-mrg && buttonEnabled){ // selezione secondo tasto
        buttonEnabled = false; //Disable button
        Serial.println("Toccato tasto 2");
        cambia_immagine(2,x_pos(1),y_pos(0));
        delay(wait_time);
        }
      else if (x > x_pos(0) && x < x_pos(1)-mrg && y > y_pos(0) && y < y_pos(1)-mrg && buttonEnabled) { // selezione primo tasto
        buttonEnabled = false; //Disable button
        Serial.println("Toccato tasto 1");
        cambia_immagine(1,y_pos(0),y_pos(0));
        delay(wait_time);
        }
      check_solution();
      
      buttonEnabled = true; 
      delay(refresh);  
      }
    else {//Se non premi non accade nulla
      //Serial.println("test");
      }
    break;
    case risolto:
    Serial.println("Loading Ending Picture...");
    myGLCD.clrScr();
    myFiles.load(0, 0, scr_width, scr_height, nome_imm_finale); //immagine gioco risolto
    digitalWrite(pin_out,HIGH);
    Serial.println("Game concluded, waiting to die...");
    while (1);
    }
}

I’m also using a TFT LCD MEGA Shield V2.2 and Arduino MEGA.
The LCD is a CTE70, I suppose (it includes an integrated SD card reader).

Even the Utouch examples included in the library suffer the same problem,
so I believe there problem is deep.

I hope I don’t have to throw away the LCD display (which costed some money…).

I have no clue about what is the cause and how to solve this.

Can you please help me guys? Thank you in advance.