Block characters are shown in 16x 2 LCD instead of letters while interfacing with atmega328p?
Some of your bitwise operations are confused, e.g.

  LCD_DataBus &amp;= 0xf0;           //Set PORTD LSB to HIGH since we use PD4 to PD7
  LCD_DataBus |= tempCmd;        //Set bits in PORTD


&amp;= 0xf0 clears the lower four bits of the register (PD0 - PD3). It doesn't do anything to the upper four bits.

What you probably want is &amp;= 0x0f, to clear the upper four bits before some of them are set in the next line. (Alternatively, if you aren't using the other half of PORTD, consider simply running LCD_DataBus = tempCmd.)

Also, for what it's worth, you don't need to delay for 400 ms (!!) while pulsing E. The signal only needs to be high for 450 ns (0.00045 ms); any delay will suffice. (If your clock speed is low, you may not need a delay at all.)