Hier mal, so wie ich es mache (schematsch)
Code:
#include <util/delay.h>
#include <avr/io.h>

void vfd_send0 (uint8_t);
void vfd_send1 (uint8_t);
void vfd_send_nibble (uint8_t);

void vfd_send0 (uint8_t b)
{
	CLR (PORT_RS);
	vfd_send_nibble (b>>4);
	vfd_send_nibble (b);
}

void vfd_send1 (uint8_t b)
{
	SET (PORT_RS);
	vfd_send_nibble (b>>4);
	vfd_send_nibble (b);
}

void vfd_send_nibble (uint8_t b)
{
	CLR (PORT_E);
	CLR (PORT_RW);
	
	VFD_CLR_DB; // PORT_DB[0..3] = 0
	if (b & (1<<0)) 	SET (PORT_DB0);
	if (b & (1<<1)) 	SET (PORT_DB1);
	if (b & (1<<2)) 	SET (PORT_DB2);
	if (b & (1<<3)) 	SET (PORT_DB3);

	SET (PORT_E);
	LOOP (100);
	CLR (PORT_E);
}
Sollte eigentlich zu verstehen sein, was da gemacht wird.
LOOP wird abgebildet auf _delay_loop_1 aus util/delay.h

Ausserdem warte ich nach dem Reset ne Zeit lang, bevor ich ein Display anfasse (mehrere zig ms).