Code:
void write_display(char *str)
{
    putchar(0xFE);    // send Char-Header
    while(*str)
    {
        puts(*str);    // sende Stringzeichen
        str++;
    }

}


void puts( char *s )
{
  while( *s )
  putchar( *s);
  s++;
}
1) puts() enthält wegen einer fehlenden Klammerung eine Endlosschleife.

2) Wenn puts() einen String ausgeben soll, warum rufst du die Funktion dann in write_display() in einer Schleife mit einzelnen Zeichen auf?


Und ganz grundsätzlich: Niemals die Warnungen des Compilers ignorieren!