Delay in A/D convert code - necessary?

I'm re-arranging my code right now. I could kick myself for being so stupid as to put everything in the ISR.

All the ISR is supposed to do is update a 4 digit 7 segment LED display. All digits are tied together in the display (that is, all segment "A" are tied together, all segment "B", etc...) but of course the digit selects are separate.

I drive it without any resistors (using short on times) and I light each segment at a time so that all digits are the same brightness and so that I don't exceed the total pin current spec of the 328P.

Here's a little piece of the code to explain what I mean:

void display(uint8_t digit, uint8_t number)
{
        switch(digit) {
        case 0:
                PORTB = DIG_1;
                break;
        case 1:
                PORTB = DIG_2;
                break;
        case 2:
                PORTB = DIG_3;
                break;
        case 3:
                PORTB = DIG_4;
                break;
        default:
                break;
        }

        switch(number) {

        case 0:
                PORTD &= SEG_A; _delay_us(16); PORTD = 0b11111111;
                PORTD &= SEG_B; _delay_us(16); PORTD = 0b11111111;
                PORTD &= SEG_C; _delay_us(16); PORTD = 0b11111111;
                PORTD &= SEG_D; _delay_us(16); PORTD = 0b11111111;
                PORTD &= SEG_E; _delay_us(16); PORTD = 0b11111111;
                PORTD &= SEG_F; _delay_us(16); PORTD = 0b11111111;
                break;

        case 1:
                PORTD &= SEG_B; _delay_us(16); PORTD = 0b11111111;
                PORTD &= SEG_C; _delay_us(16); PORTD = 0b11111111;
                break;

        case 2:
                PORTD &= SEG_A; _delay_us(16); PORTD = 0b11111111;
                PORTD &= SEG_B; _delay_us(16); PORTD = 0b11111111;
                PORTD &= SEG_D; _delay_us(16); PORTD = 0b11111111;
                PORTD &= SEG_E; _delay_us(16); PORTD = 0b11111111;
                PORTD &= SEG_G; _delay_us(16); PORTD = 0b11111111;
                break;
///// etc.... there's a lot more......

The "new" version of the program will ONLY call this code (and a small function to get the individual digit values from the "value" variable) from the ISR. Now the ISR will have lots of free time between interrupts and I won't have to worry about timing!

Thanks for your help! Somehow, you helped me see the problem!

-- Roger