¿porque el keypad 4x4 deja de funcionar después del primer ciclo?

He estado trabajando en un proyecto propio utilizando un sensor de flujo de agua, un lcd y un keypad y la idea es:

Insertar una medida de agua en litros.
Medir y mostrar en pantalla cuando esa cantidad halla cruzado.
Pedir una nueva medida.

Pero después del primer ciclo, el programa deja de reconocer el keypad.

He buscado mucho y encontré que podría ser o la memoria o el uso de la función delay, respecto a estas sugerencias:

La memoria que resta son 1623, lo cual creo que es suficiente y para el segundo... remplacé delay por la función millis, y funciona exactamente igual que con delay, el primer ciclo sí y luego no. Agracería que me apoyaran.

// Bibliotecas. *************************************************************************

#include <LiquidCrystal.h>
#include <Keypad.h>

// Variables. ***************************************************************************

LiquidCrystal lcd(A0,A1,A2,A3,A4,A5);

byte rowPins[4] = {13,12,11,10}; //connect to the row pinouts of the keypad
byte colPins[3] = {9,8,7}; //connect to the column pinouts of the keypad

volatile int rpmcont;

int ante = 0;
int Calc;
int cont;
int meta;
byte porcentaje;
byte STEP = 0;

char key;

float Vol;

char keys[4][3] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, 4, 3);

// Funciones. ***************************************************************************

void rpm ()
{
  rpmcont++;
}

void ImprimirPantallaBase (){

  lcd.clear();
  
  cont = 3;
  meta = 0;
  porcentaje = 0;
  rpmcont = 0;
  Vol = 0;
  
  lcd.setCursor(2,1);
  lcd.print("0 rpm");
  lcd.setCursor(2,0);
  lcd.print("0 L/min");
  lcd.setCursor(14,0);
  lcd.print("0%");
  lcd.setCursor(14,1);
  lcd.print("ml");

  digitalWrite(6,LOW);
  digitalWrite(5,LOW);
  digitalWrite(4,LOW);

  STEP = 1;
  
}

void Tempo(int t){

  int a,b;
  a = millis();
  while(millis() - a <= t){}
  
}

void LeerVolumen (){

  key = keypad.getKey();
    
  if (cont >= 0){
    
    if(key == '0'){
      Vol = Vol + 0*pow(10,cont);
      cont = cont-1;
      lcd.setCursor(11-cont,1);
      lcd.print('0');
    }

    if(key == '1'){
      Vol = Vol + 1*pow(10,cont);
      cont = cont-1;
      lcd.setCursor(11-cont,1);
      lcd.print('1');
    }

    if(key == '2'){
      Vol = Vol + 2*pow(10,cont);
      cont = cont-1;
      lcd.setCursor(11-cont,1);
      lcd.print('2');
    }

    if(key == '3'){
      Vol = Vol + 3*pow(10,cont);
      cont = cont-1;
      lcd.setCursor(11-cont,1);
      lcd.print('3');
    }

    if(key == '4'){
      Vol = Vol + 4*pow(10,cont);
      cont = cont-1;
      lcd.setCursor(11-cont,1);
      lcd.print('4');
    }

    if(key == '5'){
      Vol = Vol + 5*pow(10,cont);
      cont = cont-1;
      lcd.setCursor(11-cont,1);
      lcd.print('5');
    }

    if(key == '6'){
      Vol = Vol + 6*pow(10,cont);
      cont = cont-1;
      lcd.setCursor(11-cont,1);
      lcd.print('6');
    }

    if(key == '7'){
      Vol = Vol + 7*pow(10,cont);
      cont = cont-1;
      lcd.setCursor(11-cont,1);
      lcd.print('7');
    }

    if(key == '8'){
      Vol = Vol + 8*pow(10,cont);
      cont = cont-1;
      lcd.setCursor(11-cont,1);
      lcd.print('8');
    }

    if(key == '9'){
      Vol = Vol + 9*pow(10,cont);
      cont = cont-1;
      lcd.setCursor(11-cont,1);
      lcd.print('9');
    }
  }
  
  else{
    STEP = 2;
  }
      
}

void FijarMeta(){
  
    meta = ceil(Vol);
    ante = meta;
    
    lcd.setCursor(9,1);
    lcd.print("    ");
    lcd.setCursor(9,1);
 
    if(meta >= 0 && meta < 10){lcd.print(' '); lcd.print(' '); lcd.print(' ');}      
    if(meta >= 10 && meta < 100){lcd.print(' '); lcd.print(' ');}
    if(meta >= 100 && meta < 1000){lcd.print(' ');}
    
    lcd.print(meta);
    lcd.setCursor(14,1);
    lcd.print("ml");

    STEP = 3;
    
}

void Llenar(){
  
    rpmcont = 0;

    sei();
    Tempo(200);
    cli();
         
    Calc = rpmcont*5/7.5;
    lcd.setCursor(1,0);
  
    if (Calc < 10){lcd.print(" ");}
    lcd.print(Calc);
    lcd.setCursor(4,0);
    lcd.print("L/min");
  
    lcd.setCursor(0,1);
    if (rpmcont < 10){lcd.print("  ");}
    else if (rpmcont >= 10 && rpmcont < 100){lcd.print(" ");}
    lcd.print(rpmcont);
    lcd.setCursor(4,1);
    lcd.print("rpm");
    
    attachInterrupt(1,rpm,RISING);
    Vol = Vol - 1000*Calc/60/5;
    porcentaje = (meta - Vol)/meta*100;

    if (Vol >= 250){
      digitalWrite(6,HIGH);
      digitalWrite(5,LOW);
      digitalWrite(4,HIGH);
    }
    else{
      digitalWrite(6,LOW);
      digitalWrite(5,HIGH);
      digitalWrite(4,HIGH);
    }

    lcd.setCursor(12,0);
    if (porcentaje < 10){lcd.print("  ");}
    else if (porcentaje >= 10 && porcentaje < 100){lcd.print(" ");}
    lcd.print(porcentaje);
    lcd.print("%");
    
    lcd.setCursor(9,1);
    if (Vol > -100 && Vol <= -10){lcd.print(" ");}
    else if (Vol > -10 && Vol < 0){lcd.print("  ");}
    else if (Vol >= 0 && Vol < 10){lcd.print("   ");}
    else if (Vol >= 10 && Vol < 100){lcd.print("  ");}
    else if (Vol >= 100 && Vol < 1000){lcd.print(" ");}    
    lcd.print(int(Vol));

    if(Vol <= 0){STEP = 5;}
  
}

// Setup. *******************************************************************************

void setup(){
  
  Serial.begin(9600);
  lcd.clear();
  lcd.begin(16,2);
  attachInterrupt(1,rpm,RISING);
  pinMode(6,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(4,OUTPUT);
  rpmcont = 0;

}

// Loop. ********************************************************************************
  
void loop(){

    if (STEP == 0){
      
      ImprimirPantallaBase();
      
    }
    else if (STEP == 1){
      
      LeerVolumen();
      
    }
    else if (STEP == 2){
  
      FijarMeta();
      
    }
    else if (STEP == 3)  {
      
        digitalWrite(6,LOW);
        digitalWrite(5,HIGH);
        digitalWrite(4,HIGH);
        STEP = 4;
        
    }
    else if (STEP == 4){
  
      Llenar();
    
    }
    else if (STEP == 5){
  
      digitalWrite(6,LOW);
      digitalWrite(5,LOW);
      digitalWrite(4,LOW);
      STEP = 6;
        
    }
    else{
      
      STEP = STEP - 6;
    }
}

Me parece que tenés que volver a setear cont=3 cuando terminás de leer el teclado porque queda en cero en la primer lectura y cuando quiere hacer la segunda lectura el if (cont>=0) hace que saltee la función. Por otro lado que sentido tiene llamar a la función rpm() si ejecuta solo una instrucción? Directamente poné rpmcont++ donde llamás a esa función. Y para la lectura del teclado tal vez te se simplifique usando un switch case el lugar de tantos if. Suerte

No creo que sea que cont = 0 porque cuando termina el ciclo, el loop vuelve a ejecutar la función ImprimirPantallaBase que hace cont = 3 para empezar de nuevo, además, no importa en que parte ponga otro .getkey(), después del primero deja de leerlo.

Gracias por sus comentarios y ayuda en mi código, pero tampoco STEP es el poblema, he tratado poniendo STEP = 0 y tampoco.