Problemas com menu lcd + IR

Olá sou novo aqui no fórum e estou com um problema com os menus do meu display. Ele é composto por uma primeira tela que exibe “hora e temperatura” e é controlado por um controle remoto para acessar os outros menus e sub menus. O problema é que quando passo para os outros menus ele exibe e logo depois volta para o primeiro não dando tempo para acessar as outras opções. Já tentei varias coisas mais nada. Pude observar que se colocar algo dentro dos “if” do IR a atualização do relógio e temperatura para.

#include <LiquidCrystal.h>
#include <IRremote.h>
#include <DS1302.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Wire.h>

int led13 = 13;


// --- LCD ---
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte newChar[8] = {
  B01100,
  B10010,
  B10010,
  B01100,
  B00000,
  B00000,
  B00000,
  B00000
};

// --- Sensor IR ---
const int RECV_PIN = 46;
IRrecv irrecv(RECV_PIN);
decode_results results;
int liga_desliga = 0;
int resultado = 0;
float armazenavalor;

// --- Sensor de temperatura ---
#define ONE_WIRE_BUS 39
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);

//"Pinos do RTC"
DS1302 rtc(8, 7, 6);
Time t;

// --- Funções ---
char menu = 0x01;
void menu1();
void menu2();
void changeMenu();
void dispMenu();

void temp();
void hora();
void dispSubMenu2();
void readSelect(char option);
void subMenu2_1();
void subMenu2_2();

int dl = 0;
//Hora de Ligar
int hl = 0;
//Minuto de Ligar
int ml = 0;
//Segundos de Ligar
int sl = 0;

int dd = 0;
//Hora de Desligar
int hd = 0;
//Minuto de Desligar
int md = 0;
//Segundodo de Desligar
int sd = 0;

const unsigned long menuIntervalo = 3000;
unsigned long menuTime;

// --- Frags ---
boolean cima, baixo, esq, dir, enter, sair, vermelho, verde, amarelo, azul;
char subMenu2 = 0x01;

void setup() {


  pinMode(led13, OUTPUT);

  // --- LCD ---
  lcd.begin(16, 2);
  lcd.createChar(11, newChar);



  // --- IR ---
  irrecv.enableIRIn();

  // --- Iniciar objeto da biblioteca do Dallas ---
  sensor.begin();

  //"Inicialização do RTC"
  rtc.halt(false);
  rtc.writeProtect(true);

  rtc.setDOW(THURSDAY);
  rtc.setTime(11, 33, 0);
  rtc.setDate(7, 7, 2016);



  // -- Iniciando Flangs ---
  cima = 0x00;
  baixo = 0x00;
  esq = 0x00;
  dir = 0x00;
  enter = 0x00;
  sair = 0x00;
  vermelho = 0x00;
  verde = 0x00;
  amarelo = 0x00;
  azul = 0x00;
  lcd.clear();
}

void loop() {



  menu1();

  if (irrecv.decode(&results)) {
    if (results.value != 0 ) {

      changMenu();
      dispMenu();

      irrecv.resume();
    }
  }
}

// rotação dos menus
void changMenu() {

  // -- pra cima ---
  if (results.value == 0xE0E006F9) cima = 0x01;
  // --- pra baixo ---
  if (results.value ==  0xE0E08679) baixo = 0x01;
  // --- exit ---


  if (results.value == 0xE0E006F9 && cima) {

    cima = 0x00;
    lcd.clear();
    menu++;

    if (menu > 0x02) menu = 0x01;

  }


  // --- pra baixo ---
  if (results.value ==  0xE0E08679 && baixo) {

    baixo = 0x00;
    lcd.clear();
    menu--;

    if (menu < 0x01) menu = 0x02;

  }


}

void dispMenu() {


  switch (menu) {

    //case 0x01:

    // menu1();

    //break;

    case 0x02:
      menu2();

      break;

  }
}

void menu1() {

  // --- set LCD Hora ---
  //"Temperatura em Celsius para o dispositivo 1 no indice 0"
  sensor.requestTemperatures();
  float leitura = sensor.getTempCByIndex(0);

  lcd.setCursor(0, 0);
  lcd.print("Hora:");
  lcd.setCursor(6, 0);
  lcd.print(rtc.getTimeStr(2));

  lcd.setCursor(0, 1);
  lcd.print("Temp:");
  lcd.setCursor(6, 1);
  lcd.print(leitura);
  lcd.setCursor(11, 1);

  lcd.setCursor(10 , 1);
  lcd.write(11);
  lcd.print("C");

}


void menu2() {
  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("Temporizador");

  dispSubMenu2();
}




void dispSubMenu2() {


  if (results.value == 0xE0E046B9) dir = 0x01;

  if (results.value == 0xE0E0A659) esq = 0x01;

  if (results.value == 0xE0E046B9 && dir) {

    dir = 0x00;

    subMenu2++;

    if (subMenu2 > 0x02) subMenu2 = 0x01;

  }
  if (results.value == 0xE0E0A659 && esq ) {

    esq = 0x00;

    subMenu2--;

    if (subMenu2 < 0x01) subMenu2 = 0x02;

  }
  //irrecv.resume();

  switch (subMenu2) {

    case 0x01:


      lcd.setCursor(5, 1);
      lcd.print("1-Luz");
      readSelect(0x01);

      break;

    case 0x02:

      lcd.setCursor(5, 1);
      lcd.print("2-Filtro");
      readSelect(0x02);

      break;

  }

}




void readSelect(char option) {
  if (results.value == 0xE0E036C9) vermelho = 0x01;

  if (results.value == 0xE0E028D7) verde = 0x01;

  if (results.value == 0xE0E0A857) amarelo = 0x01;

  if (results.value == 0xE0E06897) azul = 0x01;

  if (results.value == 0xE0E016E9) enter = 0x01;

  if (results.value == 0xE0E036C9 && vermelho) {

    vermelho = 0x00;

    switch (option) {

      case 0x01:
        //lcd.clear();
        subMenu2_1(); break;

      case 0x02:
        //lcd.clear();
        subMenu2_2(); break;
    }

  }

  if (results.value == 0xE0E028D7 && verde) {

    verde = 0x00;

    switch (option) {

      case 0x01:
        //lcd.clear();
        subMenu2_1(); break;

      case 0x02:
        //lcd.clear();
        subMenu2_2(); break;
    }

  }

  if (results.value == 0xE0E0A857 && amarelo) {

    amarelo = 0x00;

    switch (option) {

      case 0x01:
        //lcd.clear();
        subMenu2_1(); break;

      case 0x02:
        //lcd.clear();
        subMenu2_2(); break;
    }

  }

  if (results.value == 0xE0E06897 && azul) {

    azul = 0x00;

    switch (option) {

      case 0x01:
        //lcd.clear();
        subMenu2_1(); break;

      case 0x02:
        //lcd.clear();
        subMenu2_2(); break;
    }

  }



  if (results.value == 0xE0E016E9 && enter) {

    enter = 0x00;

    switch (option) {

      case 0x01:
        //lcd.clear();
        subMenu2_1(); break;

      case 0x02:
        //lcd.clear();
        subMenu2_2(); break;
    }
  }

}

void subMenu2_1() {
  if (irrecv.decode(&results)) {
    if (results.value != 0 ) {
      Serial.println(results.value, HEX);
      armazenavalor = (results.value);

      lcd.clear();
      lcd.setCursor(2, 0);
      lcd.print("Fotoperiodo");


      lcd.setCursor(0, 1);
      lcd.print("H");
      lcd.print(hl);

      lcd.setCursor(4, 1);
      lcd.print("M");
      lcd.print(ml);
      t = rtc.getTime();

      if (armazenavalor == 0xE0E036C9 ) {
        hl++;
        ml++;
        lcd.setCursor(1, 1);
        lcd.print(hl);
        lcd.setCursor(5, 1);
        lcd.print(ml);
        delay(200);
      }

      if (armazenavalor == 0xE0E06897 ) {
        hl--;
        ml--;
        lcd.setCursor(1, 1);
        lcd.print(hl);
        lcd.setCursor(5, 1);
        lcd.print(ml);
        delay(200);
      }

      if (t.hour == hl)
        if (t.min == ml)
          if (t.sec == sl) {
            digitalWrite(led13, HIGH);
            delay(500);
          }


      if (t.hour == hd)
        if (t.min == md)
          if (t.sec == sd) {
            digitalWrite(led13, LOW);
            delay(500);
          }


    }
    irrecv.resume();
    delay(200);
  }
}


void subMenu2_2() {

  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Filtro:");

  if (irrecv.decode(&results)) {
    if (results.value != 0 ) {
      Serial.println(results.value, HEX);
      if (results.value == 0xE0E016E9) {
        resultado = liga_desliga % 2;
      }
      if (resultado == 0) {
        digitalWrite(led13, HIGH);
        delay(500);
        lcd.setCursor(8, 1);
        lcd.print("ON");
      } else {
        digitalWrite(led13, LOW);
        delay(500);
        lcd.setCursor(8, 1);
        lcd.print("OFF");

      }
      liga_desliga++;
    }

    irrecv.resume();
    delay(200);
  }
}