Matrice a LED

Buona sera a tutti, ho un problema con una matrice a LED, mi succede che in base ad una condizione mi deve visualizzare un simbolo. Ma succede che dopo che visualizza il simbolo mi lascia accese dei punti. Non riesco a risalire al problema. Qualcuno mi può indicare il punto sbagliato ?

int LEDFari = 22;
int inputPin1 = A3; //infrared proximity switch connected to digital pin 2
int inputPin2 = A4;
int val1 = 0; //this variable will read the value from the sensor
int val2 = 0;
#include <FrequencyTimer2.h>



byte H[8] = // freccia sù 
{
  B00011000, 
  B00111100, 
  B01111110, 
  B11111111, 
  B00011000, 
  B00011000, 
  B00011000, 
  B00011000
};

byte I[8] = // freccia giù 
{
  B00011000, 
  B00011000, 
  B00011000, 
  B00011000, 
  B11111111, 
  B01111110, 
  B00111100, 
  B00011000
};





int numPatterns = 1;
byte *letters[1] = {H};
byte *letters1[1] = {I};

int pattern = 0;
int pattern1 = 0;
byte col = 0;
int cols[8] = {46,49,47,40,43,42,50,52};
int rows[8] = {38,48,39,44,53,41,51,45};
//const int ARRAY_SIZE = sizeof(rows) / sizeof(int);
void setup() 

{
 for (int i = 0; i < 8; i++)
    {
        pinMode(cols[i], OUTPUT);
        pinMode(rows[i], OUTPUT);
    }
 for (int i = 0; i < 8; i++)
    {
        pinMode(cols[i], OUTPUT);
        pinMode(rows[i], OUTPUT);
    }   
 FrequencyTimer2::disable();
 FrequencyTimer2::setPeriod(2000);
 FrequencyTimer2::setOnOverflow(display);   
   
Serial.begin(9600);
pinMode(inputPin1, INPUT); //declare infrared sensor as input
pinMode(inputPin2, INPUT);
pinMode(LEDFari,OUTPUT);
}

void loop()

{
    delay(1000);
    pattern = ++pattern % numPatterns;
    pattern1 = ++pattern1 % numPatterns;
    
val1 = digitalRead(inputPin1); // read input value
val2 = digitalRead(inputPin2);
if (val1 == LOW ) //check if the input is HIGH

{
Serial.print("contatto SX");
digitalWrite(LEDFari, HIGH);
Serial.println();
}
else 
if (val1 == HIGH ) //check if the input is HIGH
{
digitalWrite(LEDFari, LOW);
}
 
if (val2 == LOW ) //check if the input is HIGH

{
Serial.print("contatto DX");
Serial.println();

}

delay(50);
}

void display()
{
  if (val2 == LOW ) //check if the input is HIGH

{
    digitalWrite(cols[col], 1);
    col = ++col % 8;
    byte mask;
    byte data = letters[pattern][col];
    for (int i = 0; i < 8; i++)
    { 
        mask = 0x01 << i;
        digitalWrite(rows[i], !!(data&mask));
    }
    digitalWrite(cols[col], 0);
}
else
if (val1 == LOW ) //check if the input is HIGH

{
    digitalWrite(cols[col], 1);
    col = ++col % 8;
    byte mask;
    byte data = letters1[pattern1][col];
    for (int i = 0; i < 8; i++)
    { 
        mask = 0x01 << i;
        digitalWrite(rows[i], !!(data&mask));
    }
    digitalWrite(cols[col], 0);
}
}

Grazie…

Beh... ti dirò, non ci capisco una pippa, ma son convinto che debba cancellare tutto prima di andare al simbolo successivo altrimenti è normale che rimangano dei punti accesi.

Io comincerei a non mettere comandi nella funzione display. E provare lo sketch che sei andato a pescare. Se quello funziona bene, allora ci sono difetti nelle modifiche che stai apportando. Procedi passo per passo.