PROBLEMA CON LCD I2C E INTERRUPCIONES

Hola, tengo un problema con mi codigo, necesito utilizar una interrupcion de hadware (un pulsador) para detener un proceso principal como sistema de emergencia.

-Cuando yo realizao el codigo utilizando serial.print el codigo funciona en su totalidad.
-Cuando utilizo un codigo de prueba con un LCD utilizando I2C tambien despliega el texto sastifactoriamente.

*El problema es cuando utilizo ambas partes en un solo codigo:
-Compila bien y muestra que tambien carga el progrmama sin embargo no hace nada de nada.
-El codigo fisicamnete no corre, no llega ni a setup.
-Si dejo como comentario la declaracion de la interrupcion si corre el programa, o si comento
solo la parte del LCD tambien corre bien el programa, es como si no fuera compatible declarar
una interrupcion y utilizar un LCD en un mismo programa.

Dejo el codigo completo:

int LED = 13;
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,3);


void interrupcionEmergencia()         //Subrutina de interrupcion
{
 digitalWrite(LED, LOW);                                                        
 lcd.init();
 lcd.setCursor(0,2);                                                        
 lcd.print("SISTEMA  DESACTIVADO");   
 lcd.backlight();                                                          
 lcd.setCursor(1,1);                                                        
 lcd.print("PARO DE EMERGENCIA");                                                 
 lcd.setCursor(2,3);                                                        
 lcd.print("REINICIE  EQUIPO");
 Serial.print("INTERRUPCION");
interrupcionEmergencia();  // con esta parte se detiene todo hasta que se reinicie 
}

void setup()
{
 Serial.begin(9600);
 pinMode(LED, OUTPUT);
 attachInterrupt(2, interrupcionEmergencia, FALLING);   // declaracion de interrupcion
}

void loop()   //proceso de ejemplo, parpadear un led
{
lcd.init();
lcd.setCursor(7,2);                                                        
lcd.print("LOOP");
 digitalWrite(LED, HIGH);
 delay(3000);
 digitalWrite(LED, LOW);
 delay(500);
 Serial.println("ESTAS EN LOOP");  
}

Veo dos fallos:

void interrupcionEmergencia()         //Subrutina de interrupcion
{
 digitalWrite(LED, LOW);                                                       
 lcd.init();
 lcd.setCursor(0,2);                                                       
 lcd.print("SISTEMA  DESACTIVADO");   
 lcd.backlight();                                                         
 lcd.setCursor(1,1);                                                       
 lcd.print("PARO DE EMERGENCIA");                                                 
 lcd.setCursor(2,3);                                                       
 lcd.print("REINICIE  EQUIPO");
 Serial.print("INTERRUPCION");
interrupcionEmergencia();  // con esta parte se detiene todo hasta que se reinicie
}

Primero: una rutina de interrupción debe ser algo corto, operaciones simples, y poco mas. Tienes que evitar usar Serial y LiquidCrystal dentro.

Segundo: estas haciendo una llamada recursiva dentro de la misma rutina. Eso es un terrible error.

Te propongo un ejercicio: usa una variable paradaEmergencia. Inicializa a false. En la rutina de servicio de la interrupción ponla a true. En el loop, si la variable es falsa se ejecuta el código, si es cierta no hace nada.