Creating a Delay

Hello everyone,
I am trying to develop a “brute-force” way to create a delay. The reason why i cannot use things such as delay() or millis() is because i have an IR decoder code that is affecting the timer1 and timer0 functions. The code compiles and runs, but gets stuck in the delay somehow.

Here is a copy of my code:

#define F_CPU 16000000UL	// CPU clock in Hertz.
#define TMR0_PRESCALER 256UL
#define IR_BIT 1778UL	// bit duration (us) in use for IR remote (RC5 std)
#define	IR_IN  8	//IR receiver is on digital pin 8 (PORT B, bit0)

#define TMR0_T (F_CPU/TMR0_PRESCALER*IR_BIT/1000000UL)
#define TMR0_Tmin (TMR0_T - TMR0_T/3UL)	// -25%
#define TMR0_Tmax (TMR0_T + TMR0_T/3UL)	// +25%

// Variables that are set inside interrupt routines and watched outside
// must be volatile
volatile uint8_t	tmr0_OC1A_int;  // flag, signals TMR0 timeout (bad !)
volatile uint8_t	no_bits;        // RC5 bits counter (0..14)
volatile uint8_t	data_word;      // RC5 bits counter (0..14)
volatile uint16_t	ir_data_word;   // if <> holds a valid RC5 bits string (good !)

int val = 0;
boolean state = 0;    //state of button pin
boolean newState = 0;  //new button state variable


void start_timer0(uint8_t cnt) 
{
	OCR0A = cnt;
	TCNT0 = 0;
	tmr0_OC1A_int = 0;
	TIMSK0 |= _BV(OCIE0A);	// enable interrupt on OC0A match
	TCCR0B |= _BV(CS02);	// start timer0 with prescaler = 256
}

// Interrupt service routines
ISR(PCINT0_vect) 			//  signal handler for pin change interrupt
{	if(no_bits == 0)                // hunt for first start bit (must be == 1)
        {		
		if(!digitalRead(IR_IN))
                {
			start_timer0(TMR0_Tmax);
			no_bits++;
			ir_data_word = 1;
		}
	} 
        else {
		if(!tmr0_OC1A_int)             // not too much time,
                {		
			if(TCNT0 > TMR0_Tmin) // not too little.
                        {	
				// if so wait next (mid bit) interrupt edge
				start_timer0(TMR0_Tmax);
				no_bits++;
				ir_data_word <<= 1;
				if(!digitalRead(IR_IN))
                                {
					ir_data_word |= 1;
				} 
                                else 
                                {
					ir_data_word &= ~1;
				}
			}
		}
	}
}

ISR(TIM0_COMPA_vect) 
{		// timer0 OC1A match interrupt handler
	TCCR0B &= ~(_BV(CS02) | _BV(CS01) | _BV(CS00));	// stop timer
	tmr0_OC1A_int = 1;	// signal timeout
	no_bits = 0;		// start over with hunt for valid stream
	ir_data_word = 0;
}

void setup() 
{
  Serial.begin(9600);	// opens serial port, sets data rate to 9600 bps
 
// IR remote control receiver is on IR_IN digital port
        
        pinMode(IR_IN, INPUT);
        pinMode(9, INPUT);
        pinMode(4, OUTPUT);  // test output : LED for remote key "1"
        pinMode(5, OUTPUT);  // test output : LED for remote key "2"
        pinMode(6, OUTPUT);  // test output : LED for remote key "3"
        pinMode(7, OUTPUT);  // test output : LED for remote key "4"
        pinMode(10, OUTPUT);
        pinMode(11, OUTPUT);
        pinMode(13, OUTPUT);
        
// pin change interrupt enable on IR_IN port
	PCMSK0 |= _BV(PCINT0);
	PCICR |= _BV(PCIE0);

// Timer 0 : Fast PWM mode. Stopped, for now.
	TCCR0A = _BV(WGM00) | _BV(WGM01);                             
	TCCR0B = _BV(WGM02);   //'delay' disable after this line
	no_bits = 0;
	sei();			// enable interrupts
}

void loop()  
{
 uint8_t data_word;      // 0..63 holds a valid RC5 key code.

 if(digitalRead(9) == HIGH)
 {
  state = (digitalRead(9));    //state is value of button
  //delay(50);  //button debounce (not needed if debounce circuit exists)
  if(state == 0 && newState == 0)
   {  //if state and lastState are both 0 (button unpressed)
    digitalWrite(6, LOW);	 // led is off
    newState = state;			//lastState is still 0
   }
   else if(state == 1 && newState == 0)
   {  //if state is 1 (button press) and lastState is 0
    digitalWrite(6, HIGH);	//led is on
    newState = state;			 // lastState is now 1
   }
   else if(state == 0 && newState == 1)
   {  //if state is 0(button unpressed) and lastState is 1
    digitalWrite(6, HIGH);	//led is on
    //newState = 1;			  //lastState is still 1
   }
   else if(state == 1 && newState == 1)
   {  //if state is 1(button pressed) and lastState is 1
    digitalWrite(6, LOW);   //turn led off
    newState = 0;   //lastState should now be 0 again and loop repeats
   }  
 }  


          if((no_bits == 14) && ((ir_data_word & 0x37C0) == 0x3000))
                {
			no_bits = 0;				// prepare for next capture
                        data_word = ir_data_word & 0x3F;	// extract data word
                        
                        switch(data_word) 
                        {
                          
                                case 0x0C:                        //power
                                   // digitalWrite(4,HIGH);
                                    if(digitalRead(4)== LOW && digitalRead(5)== LOW)
                                    {
                                        digitalWrite(4,1);
                                        
                                        delay(25000); // HERE IS WHERE THE PROGRAM GETS STUCK AND DOES NOT SET PIN 5 HIGH
      
                                        digitalWrite(5,1);
                                    }
				    else
                                    { 
                                        digitalWrite(4,0);
                                        digitalWrite(5,0);    
                                        digitalWrite(6,0);
                                        digitalWrite(10,0);
                                        digitalWrite(11,0);
                                    }                     
                                    
                                break;    
                         
                                case 0x0D:                        //mute
				   if(digitalRead(4)== HIGH && digitalRead(5)== HIGH)
                                   {
                                    if(digitalRead(6) == LOW)
                                    {
                                        digitalWrite(6,1);
                                        digitalWrite(10,0);
                                        digitalWrite(11,0);
                                    }
				    else
                                    { 
                                        digitalWrite(6,0);
                                    }  
                                   }                              				    
                                break;
                                  
				case 0x02:			  // volume down
				 if(digitalRead(4)== HIGH && digitalRead(5)== HIGH)
                                   {
                               if(digitalRead(11) == LOW)
                                    {
                                        digitalWrite(11,1);
                                        digitalWrite(6,0);
                                    }
				    else
                                    { 
                                        digitalWrite(11,0);
                                    }
                                   }
                                break;
				
                                case 0x03:			  // volume up
				 if(digitalRead(4)== HIGH && digitalRead(5)== HIGH)
                                   {
                                if(digitalRead(10) == LOW)
                                    {
                                        digitalWrite(10,1);
                                        digitalWrite(6,0);
                                    }
				    else
                                    { 
                                        digitalWrite(10,0);
                                    }                           
				}
				break;
				
			}
		}
	}

Any help as to how i can create any kind of delay without using delay() or millis() would be great. I need an approximate delay of about 25 seconds.

Thank you all in advance.

What about micros(), is that affected also? Another option is to just count up to some number, unsigned long, calibrated with your code running for the time you need. If 32 bits isn't enough, when it gets back to 0 (or up to 0xFFFF FFFF) increment a 2nd counter and keep going.