Table des matières

Documentation rédigée par whyp

Introduction

Le Clavier est l’élément à partir duquel l’utilisateur va utiliser votre programme. Il est donc nécessaire d’en connaitre parfaitement son utilisation et son fonctionnement. 3 types d’accées sont possibles, avec leurs avantages et leurs inconvénients.

Le Clavier à Accées par interruptions

C’est la méthode la plus simple d’accés au clavier. Elle consiste simplement `a appeler une interruption du dos ou du bios, et d’interpr´eter leur réponse. Remarques : L’interruption la plus rapide est toujours 16h, car c’est le bios qui gére l’accés au clavier, tandis que l’interruption 21h est une interruption du dos.

Le Clavier à Accès direct en mémoire

Entrons plus en détail dans le fonctionnement du clavier : Toute pression d’une touche du clavier génére l’interruption 9. Cette action va mettre en mémoire la valeur de la touche qui a été activée. Cette zone est située en 0000h : 041Ch. Pour y accéder, il suit donc de faire :

codage en C :

peekb (0x41 , 0 xC ); // cette fonction renvoie la valeur de la touche 9

et en assembleur :

mov ax ,0 x41
mov es ,ax
mov si ,0xC
mov al ,[es:si] ;al prend la valeur de la touche initialement pressée.

Le Clavier à Accès par les ports

L’accès au clavier directement à travers les ports de communication o re des avantages exceptionnels en terme de vitesse, et surtout de gestion multiple de touches. C’est le moyen le plus direct et rapide d’accéder à une touche. Malheureusement, ce n’est pas aussi simple que pour les types d’accès précédents. Pour savoir si une touche a été activée, la recherche va séfectuer par ligne de clavier, la réponse sera ultérieurement communiquée par colonne de clavier.

lignetouches
0On
10 a EXE
21 a -
34 a /
47 a DEL
5a+b/c à →
6X,@,T à tan
7ALPHA a ESC
8SHIFT a MENU
9touches directionnels
10F1 à F6

Nous devons prendre une variable de 16bit initialisée a 0 et positionner le nième bit a 1, en fonction du numéro de ligne. Il s’agit d’un simple décalage d’au maximum 10bit puisqu’il y a 10 lignes. Par exemple, si on souhaite tester les touches directionnelles, notre variable aura cette forme : 0000000001000000

Pour le décalage, en C on écrira :

unsigned short Var; //crée une variable de 16bit
Var=0;
Var$ <$$ <$n ; //ou n est le numéro de la ligne

En Assembleur :

mov ax ,0
shl ax ,n ;ou n est le numéro de la ligne

Une fois notre variable préte, on l’ecrit dans le port numéro 13h. Mais la taille d’un port étant de seulement 8bit, écrire 16bit en 13h aura pour effet d’ecrire ´egalement dans le port 14h, mais ne vous inquiétez pas ceci est tout a fait normal. De cette manière, le controleur clavier a pris connaissance de la touche que nous souhaitons tester, ou plutot de la ligne car il s’agit pour l’instant d’une ligne. Le controleur clavier renvoi alors la valeur de cette ligne dans le port 13h, sur 8bit seulement. Pour les op´erations d’entr´ee sortie en C, on utilisera inportb et outport, en assembleur in et out. Nous devons à présent lire la valeur envoyée par ce port et l’interpréter. Si elle vaut 0, aucune touche n’a été pressée. Sinon, il faut examiner sa valeur binaire. Cette derni`ere est donnée cette fois ci en fonction du numéro de colonne de la touche. Le tableau ci-dessous représente la touche correspondant au croisement final des lignes et des colonnes :

N° ligne-N° colone6 5 4 3 2 1 0
0 On
1 0 . x10 (-) Exe
2 1 2 3 + -
3 4 5 6 x /
4 7 8 9 Del
5 A+b/c xy ( )
6 X,@,T log ln sin cos tan
7 Alpha Vars ˆ Esc
8 Shift Ctrl Optn Menu
9 Gauche Haut Bas Droite
10 F1 F2 F3 F4 F5 F6

Par exemple, si vous testez la ligne 10, et que la valeur colonne 01010000 est renvoyée, cela signifie que les touches F1 et F3 avaient été pressées. Les algorithmes utilisés peuvent avoir plusieurs formes selon que l’on souhaite simplement savoir si une touche quelconque est pressée ou si l’on cible une touche précise.

Exemple de test en C (Cette fonction teste si une touche spécifique est pressée et renvoie 1 le cas échéant. On envoie comme paramétre le numéro de la ligne et la valeur renvoyée par le clavier si la touche était pressée) :

int keyport( int ligne , int valeur ) //Vérifie si la touche choisie est pressée.
{
outport(0x13 ,(1 < < ligne ));
if ( inportb(0 x13 )== valeur ) return 1; //La touche est bien pressée,on renvoie 1
else return 0; // La touche n’est pas pressée,on renvoie 0
}

Cependant, en utilisant ce système d’accès au clavier, vous allez rencontrer un problème. Les touches pressées continueront à etre mises dans le buffer touche (zone contenant une liste des touches pressées) de la graph100. Ceci est génant si vous souhaitez par la suite utiliser un autre type d’accès clavier, il vous faudra d’abord vider ce buffer, puis seulement après capter une touche. Pour résoudre ce problème, plusieurs solutions s’offrent à vous, ma préférée et qui donne les meilleurs résultats, consiste à désactiver l’interruption 9. Ceci offre de multiples avantages exposés ci-dessous :

Il est à noter que cette interruption peut etre restaurée à tout moment si on prend la précaution de sauvegarder son adresse initiale, en utilisant en C la fonction dos getvect() Pour la substituer par une fonction de votre choix (une fonction vide fera évidement l’affaire), utiliser dos setvect(). En assembleur, il vous suffit de sauvegarder l’adresse de cette interruption lue dans la table d’interruption, puis de remplacer cette adresse par celle de l’interruption 0xFF. (Voir chapitre sur les interruptions).