Problema campionamento valori encoder

Buonasera a tutti,
mi sono cimentato nella lettura dei valori di un encoder rotativo mostrando il valore letto tramite seriale e un LCD 16x2. Nel momento in cui i risultati sono mostrati solo sul serial monitor ho una lettura rapida e continua dei valori,non perdendo nessun valore.Quando invece mostro i valori sull'LCD la frequenza con cui si aggiornano i valori sul serial monitor e di conseguenza anche sul display è piu bassa,mostrando quindi valori discontinui e perdendo parecchi valori tra il dato mostrato e il successivo.C'è qualche errore nel codice o vi è un altro tipo di problema?

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);
// encoder
#define encoderPinA  2
#define encoderPinB  3

volatile long pos = 0;

void setup() {
  // put your setup code here, to run once:
  lcd.init();
  lcd.backlight();
  Serial.begin(9600);
  pinMode(encoderPinA, INPUT_PULLUP);
  pinMode(encoderPinB, INPUT_PULLUP);  

  // encoder pin on interrupt 0 (pin 2)
  attachInterrupt(0, doEncoderA, CHANGE);
  // encoder pin on interrupt 1 (pin 3)
  attachInterrupt(1, doEncoderB, CHANGE);

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(pos);
  lcd.setCursor(0,0);
  lcd.print(pos);
  delay(300);
  lcd.clear();
}

void doEncoderA() {
  // look for a low-to-high on channel A
  if (digitalRead(encoderPinA) == HIGH) {
    // check channel B to see which way encoder is turning
    if (digitalRead(encoderPinB) == LOW) {
      pos = pos + 1;         // CW
    } else {
      pos = pos - 1;         // CCW
    }
  } else {// look for a high-to-low on channel A
    if (digitalRead(encoderPinB) == HIGH) {// check channel B to see which way encoder is turning
      pos = pos + 1;          // CW
    } else {
      pos = pos - 1;          // CCW
    }
  }  
}

void doEncoderB() {
  // look for a low-to-high on channel B
  if (digitalRead(encoderPinB) == HIGH) {
    // check channel A to see which way encoder is turning
    if (digitalRead(encoderPinA) == HIGH) {
      pos = pos + 1;         // CW
    } else {
      pos = pos - 1;         // CCW
    }
  } else { // Look for a high-to-low on channel B
    // check channel B to see which way encoder is turning
    if (digitalRead(encoderPinA) == LOW) {
      pos = pos + 1;          // CW
    } else {
      pos = pos - 1;          // CCW
    }
  }
}

Grazie in anticipo a chiunque mi possa aiutare

Sicuramente il delay(300) fa la sua parte!

innanzitutto grazie per la risposta,il delay 300 l'ho impostato per l'aggiornamento dei valori sul display,un valore minore mi da problemi nella visualizzazione sul display dove la scritta appare molto sfumata e non ben visibile.Qualche suggerimento su cosa modificare nello sketch?
Non so se la foto renda ma eliminando appunto quel delay si vede malissimo il valore

L'aggiornamento del display deve avvenire solo quando il valore cambia o, forse meglio, una o due volte al secondo:

uint32_t t_agg_display;

loop:
if(millis()-t_agg_display>499)
  {
  t_agg_display=millis();
  lcd.setCursor...
  lcd.print...
  }

Poi, lcd.clear() cancella tutto dopo il delay! Il loop è veloce, quindi cambia poco, ma starebbe meglio un attimo prima di riscrivere.
Anziché fare lcd.clear(), però, riscrivi sopra facendo in modo di coprire eventuali scritte precedenti più lunghe. Puoi usare snprintf:
https://www.google.com/search?q=c+snprintf
https://www.google.com/search?q=arduino+forum+snprintf
o, per iniziare, per poche cifre puoi fare un if che, se il valore è minore di 10, scrive uno spazio o uno zero per cancellare la cifra non più presente.

Ho provato a fare come mi hai suggerito e ora funziona alla perfezione.Grazie mille per il tuo preziosissimo aiuto :blush: