received data through UART showing on 7 segment display using ATmega16
You never want to have a waiting loop like this within an interrupt service routine: 

ISR(USART_RXC_vect){
    while (!(UCSRA &amp; (1 &lt;&lt; RXC)))
        ; //execution will wait till the whole byte packet is received
}


One reason is that you do not know how long it will take, and it can take so much time that other interrupts that are supposed to go off just cant, because you are waiting in an interrupt handler. This can lead to unexpected behaviour. Instead use a flag, simply create a boolean and set that to true when the interrupt goes off like this:

// Necesarry includes

// Function prototypes/definitions

// Interrupt flag for usart receive
bool usart_rxc_flag = false;

int main(){
    // Set up port direction
    // Initialize timers, interrupts and usarts here

    // Variables
    char usart_receive;

    while(true){
       // Sleep

       // Receive UART
       if (usart_rxc_flag)
       {
           // Read char into variable
           usart_receive = usart_read_char();

           // Send data to segment display
           segment_send(usart_receive); 

           // Reset flag
           usart_rxc_flag = false;
       }
    }
}

ISR(USART_RXC_vect){
    usart_rxc_flag = true;
    // Other simple stuff you might wanna do
}


The code is not complete of course, that's up to you. But this should really get you in the right direction. I have commented places where you need to put your code, like initalize your usart etc. 

I have assumed you have reasons for using interrupt to receive the uart data, like reducing power consumption for example. If this is not important, then you could simply use what's called a polling-method in the main loop to continually check for uart messages and save them on the go.