Die Tastatur (Teil 1)


n dieser Lektion werden nicht nur die Tastatur und ein paar zugehörige Befehle erklärt, sondern auch weitere Grundlagen. Vorraussetzung ist wie immer, dass ihr die vorherigen Lektionen verstanden habt und anwenden könnt.

a) Eingabe abgreifen

Heute kommen wir zum wohl elemantarsten Teil eines Programms: Die Tastatur und Möglichkeiten, sie zu 'lesen'. Im ersten Teil, der Einführung, haben wir mit ngetchx() auf einen Tastendruck gewartet. Jetzt wollen wir wissen, was gedrückt wurde. Hierzu ein kleines Beispiel. Startet ein neues Projekt, dass ihr unter 'key' abspeichert. Öffnet eine neues "C Source File" und speichert es unter 'key.c'. Es sollte wie folgt aussehen:

// C Source File
// Created 29.04.04; 15:47:05

#include 

// Haupt-Funktion
void _main(void)
{
  // Lösche Bildschirminhalt
  ClrScr();           
 
  // Schrifgröße auf 'groß' stellen
  FontSetSys(F_8x10);
 
  // Schreibe "Drücke [ENTER]!!" auf den Bildschirm
  DrawStr(0, 0, "Drücke [ENTER]!!", A_NORMAL);
 
  // Tastendruck verwerten
  if (ngetchx() == KEY_ENTER)
    DrawStr(0, 30, "So ist's brav!", A_NORMAL);
  else
    DrawStr(0, 30, "Du solltest [ENTER] drücken!!", A_NORMAL);
 
  // Auf Tastendruck warten
  ngetchx();

}


Schickt es an VTI und lasst es laufen. Drückt mal [ENTER] und mal nicht.

"Zeile-für-Zeile"-Analyse: Den ClrScr() -Befehl solltet ihr bereits kennen, was neu ist, ist folgendes:

  // Schrifgröße auf 'groß' stellen
  FontSetSys(F_8x10);


Mit FontSetSys() stellt ihr den Schriftgrad fest. Wir können zwischen kleiner (F_4x6), mittlerer (F_6x8) und großer (F_8x10) Schrift wählen, wobei die Zahl immer die Pixel angibt (z.B. F_4x6 heisst Schrift mit 4 Pixel Breite und 6 Pixel Höhe). Dieser wird beibehalten, bis dass Programm beendet wird oder ihr ihn wieder neu einstellt. Die nächste Zeile dürfte klar sein, es wird lediglich "Drücke [ENTER]" auf den Bildschrim geschrieben. Das nächste ist schon interessanter:

  // Tastendruck verwerten
  if (ngetchx() == KEY_ENTER)
    DrawStr(0, 30, "So ist's brav!", A_NORMAL);
  else
    DrawStr(0, 30, "Du solltest [ENTER] drücken!!", A_NORMAL);


Hier haben wir also unsere erste If-Bedingung (SEHR wichtig für's Programmieren). In C werden Gleichheits- und Ungleichheits-Bedingungen immer mit zwei Zeichen beschrieben (== für "ist gleich", != für "ist nicht gleich"). "Ist gleich" und "ist ungleich" sollten euch (vom logischen Standpunkt her) vom BASIC-Tutorial klar sein. In C wird jedoch die Bedingung in einer klammer geschrieben. ngetchx() kann direkt verwendet werden, da es ja auf einen Tastendruck wartet und denn entsprechenden Wert zurückgibt. TIGCC bietet uns vordefinierte Tastennamen an (statt "KEY_ENTER" hätten wir auch "13" schreiben können). Deren Werte entsprechen den 'getkey()'-Werten in BASIC. In der TIGCC Documentation könnt ihr nachlesen, welche Tasten bereits vordefiniert sind (ein weiterer Vorteil dieser Sache ist die bessere Übersichtlichkeit). Wenn wir als [ENTER] drücken, steht "So ist's brav" auf dem Bildschrim; wenn nicht, dann kommt eine Ermahnung. In unserem Fall kommt nach der if-Bedingung nur eine Zeile an Anweisungen. Sind es mehr, so klammern wir alle mit geschweiften Klammern ein (siehe nächstes Beispiel).

Am Schluss warten wir erneut auf einen Tastendruck, um dem Benutzer unser Ergebnis zu zeigen.

Doch nun befassen wir uns mit einer anderen Art, die Tastatur zu lesen: kbhit()

b) kbhit() - Syntax Mit kbhit() warten wir nicht direkt auf einen Tastendruck; Wir prüfen, ob überhaupt eine Taste gedrückt wird. Fangen wir mit einem Beispiel an. Erstellt eine neue Quelldatei und speichert sie sowie das Projekt unter 'key2' ab. So sollte das Ganze dann aussehen:

// C Source File
// Created 29.04.04; 16:03:01

#include 

// Haupt-Funktion
void _main(void)
{
  // Lösche Bildschirminhalt
  clrscr();           
 
  // Schrifgröße auf 'mittel' stellen
  FontSetSys(F_6x8);
 
  // In einer 'while'-Schleife wird auf einen  Tastendruck gewartet
  while (!kbhit())
    // Schreibe "Drück' eine Taste!" auf den Bildschirm
    printf("Drück' eine Taste!/\n");

  // Den Tastaturspeicher leeren
  GKeyFlush(); 

  // Schreibe Abschlussmeldung auf das Display
  printf("\n\n\nNa endlich!!!!\n");

  // Auf Tastendruck warten
  ngetchx();

}


Anschliessend wird das Programm erzeugt und mit VTI getestet.

Nun lernen wir drei neue Dinge: die while()-Schleife, kbhit() und direkte Prüfung mit if.

  // In einer 'while'-Schleife wird auf einen  Tastendruck gewartet
  while (!kbhit())


Hier wird die Schleife definiert und alles neue kommt auf einmal. while() entspricht von der Funktion her dem 'While' aus TI-BASIC, es werden eine oder mehrere Anweisungen ausgeführt, bis ein Ereignis eintritt (hier: der Tastendruck). kbhit() ist ein Befehl, der '0' zurückgibt, wenn keinee Taste gedrückt wird (ansonsten gibt er '1' zurück). Mit den If-Bedingungen in C können wir direkte Werte (ja oder nein, also 'nich 0' oder '0') abfrage. Das bedeutet hier (da while() ja eigentlich auch eine If-Bedingung hat): Wird keine Taste gedrückt (also 'kbhit() != 1' oder besser: 'nicht kbhit())', dann werden die ganze Zeit Anweisungen gezeigt. Wird eine Taste gedrückt (also 'kbhit() == 1' oder besser: 'kbhit()'), dann springen wir aus der while()-Schleife und zeigen die Abschlussmeldung. Eigentlich gar nicht so schwer, oder? Hätten wir mehrere Anweisungen in der Schleife, würden wir sie auch mit zwei geschweiften Klammern einfassen.

Ach ja, fast hätt' ichs vergessen:

 // Den Tastaturspeicher leeren
  GKeyFlush();


kbhit() prüft ja bekanntlich, ob eine Taste gedrückt wird. Weche das war, können wir direkt danach mit ngetchx() abfragen (kommt in der nächsten Lektion). Da wir aber am Ende des Programms auf einen Tastendruck des Benutzers warten wollen und die alleinige Benutzung von ngetchx() nur den Wert der zuvor gedrückten Taste zurückgeben würde (das wird euch schon noch klar werden), müssen wir den Tastaturspeicher des TIs löschen. Und der Befehl heisst eben GKeyFlush().

Ich werde die weitere Verwendung von kbhit() in der nächsten Lektion, in der wir diese hier ausweiten, erläutern.