Decodificatore Telecomando IR Funzionante, ma con delay

ho realizzato questo codice

include <IRremote.h>
int RECV_PIN = 5;
int STATUS_PIN = 13;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
int fading = 1; // se = 0 Sola acquisizione di segnali. Se = 1 funzionamento regolare
decode_results results;

//LCD
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int  val = 0;



void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Inizializza il ricevitore
  pinMode(STATUS_PIN, OUTPUT);
  //LCD
  lcd.init();
  lcd.backlight();
  lcd.setCursor(4, 0);
  lcd.print("WAITING:");
}

// Stoccaggio del codice registrato
int codeType = -1; // Tipo di codice
unsigned long codeValue; // Il valore del codice in formato RAW
unsigned int rawCodes[RAWBUF]; // La durata del RAW
int codeLen; // La lunghezza del codice
int toggle = 0;

void storeCode(decode_results *results) {
  codeType = results->decode_type;
  int count = results->rawlen;
  if (codeType == UNKNOWN) {
    Serial.println("Ricevuto un codice sconosciuto, il RAW e':");
    
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print("CODE UNKNOWN");
    lcd.setCursor(0, 1);
    lcd.print("RAW in S.Monitor");
        
    codeLen = results->rawlen - 1;
    for (int i = 1; i <= codeLen; i++) {
      if (i % 2) {
        // Mark
        rawCodes[i - 1] = results->rawbuf[i] * USECPERTICK - MARK_EXCESS;
        Serial.print(" m");
      }
      else {
        // Space
        rawCodes[i - 1] = results->rawbuf[i] * USECPERTICK + MARK_EXCESS;
        Serial.print(" s");
      }
      Serial.print(rawCodes[i - 1], DEC);
    }
    Serial.println("");
  }
  else {
    if (codeType == NEC) {
      Serial.print("Ricevuto codice NEC: ");
    }
    else if (codeType == SONY) {
      Serial.print("Ricevuto codice SONY: ");
    }
    else if (codeType == RC5) {
      Serial.print("Ricevuto codice RC5: ");
    }
    else if (codeType == RC6) {
      Serial.print("Ricevuto codice RC6: ");
    }
    else if (codeType == SAMSUNG) {
      Serial.print("Ricevuto codice Samsung: ");
    }
    else {
      Serial.print("Tipo di codice sconosciuto ");
      Serial.print(codeType, DEC);
      Serial.println("");
    }
    
    
    
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("HEX");
    lcd.setCursor(7, 0);
    lcd.print(codeValue, HEX);
    lcd.setCursor(0, 1);
    lcd.print("LENGTH");
    lcd.setCursor(13, 1);
    lcd.print(codeLen);
    
    Serial.println(results->value, HEX);
        
    codeValue = results->value;
    codeLen = results->bits;
  }
}

void loop() {
  if (irrecv.decode(&results)) {
    digitalWrite(STATUS_PIN, HIGH);
    storeCode(&results);

    irrecv.resume(); // resume receiver
    digitalWrite(STATUS_PIN, LOW);
  }
}

Fa tutto quello che deve fare, ma non capisco il motivo per cui sull’lcd il valore compare al codice successivo. Cioè con il telecomando clicco un pulsante 1 e su monitor seriale viene scritto il codice corrispondente, poi clicco il pulsante 2 e su monitor seriale viene scritto il corrispettivo codice del pulsante 2, mentre sull’lcd quello del codice 1. Continuando a premere si ha sempre il ritardo sull’lcd di un codice.

grazie

EDIT: noto in realtà che questo “delay” c’è solo quando il programma riesce a decifrare il codice, cioè sull’lcd non ho nessun ritardo se il nuovo codice non è riconosciuto.