Zum einen kannst du das mit key so nicht machen. Zum einen deklarierst du die Variable in einer Headerdatei und dort deklariert man nie Variablen. Das heißt, du hast am Ende in jeder .c-Datei, die diesen Header einbindet, eine Deklaration dieser Variablen. Das klappt nur, weil der Linker dir die Doppelten wieder zusammensucht... Richtig wäre es, die Variable als extern char key[]; in der Headerdatei zu deklarieren und z.B. in der kb.c nochmal die eigentliche Definition char key[80]; hinzuschreiben.
Das andere, was an deiner Deklaration böse war, ist, dass du einen Pointer deklariert und ihn auch benutzt hast, aber ihn nie initialisiert hast. Das heißt, er hat halt zufällig auf irgendwelchen Speicher gezeigt. Keine gute Idee.
Was aber die entscheidende Sache ist, ist dass du die Breakcodes nicht berücksichtigst, die beim Loslassen einer Taste erzeugt werden. An diesen Stellen ist die Scancodetabelle leer und deswegen wird eine 0 in den String geschrieben. Womit er dann beendet wäre, welche Tasten auch immer hinterher noch kommen mögen. Ich hab noch das hier rein, damit hat es dann funktioniert:
if (scancode & 0x80) {
z--;
continue;
}