GESTION ASYNCHRONE DU CLAVIER
I.Introduction
Avez-vous déjà essayé de programmer un jeu en utilisant les procédures basiques du clavier ? Vous avez du vous rendre compte que ce n'était vraiment pas la panacée, car les mouvements reposent sur la fréquence de répétition du clavier et sont donc saccadés. Alors comment faire des mouvements fluides comme dans les jeux actuels ? Hé bien voici la réponse.
II.L'interruption clavier
Au lieu d'utiliser l'interruption DOS habituelle qui lit l'état du clavier, nous allons détourner l'interruption matérielle 09h du clavier, qui est lancée à chaque fois qu'une touche du clavier est lancée, ce qui est bien pratique, car cette int est activée tant et dès que la touche est enfoncée, sans aucune préoccupation de l'état interne de l'ordinateur, puisque elle est déclenchée par le clavier lui-même.
Voyons maintenant ce que nous allons mettre dans notre gestionnaire d'interruption. Il faut d'abord savoir que lorsqu'elle est appelée, l'interruption met à jour le buffer clavier en y mettant l'état et le numéro de la touche qui a déclenché l'interruption. Ce buffer est situé au port 60h. Il suffit donc de lire ce port pour connaitre l'état des touches. La structure de ce port est la suivante :
Structure du port 60h
|
||||||||||
---|---|---|---|---|---|---|---|---|---|---|
Bits | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
Valeurs | ||||||||||
Numéro de la touche, de 0 à 127 | ||||||||||
Etat de la touche : 1 = relâchée / 0 = appuyée |
Notez bien que le numéro de la touche est totalement différent du code ASCII. Ici chaque numéro correspond à une touche du clavier parmi les 102 et non à un caractère.
Comme pour la carte son, comme l'int 09h est une interruption matérielle, donc déclenchée par un PIC, il faut dire au PIC que l'interruption a bien été exécutée, en envoyant au port 20h la valeur 20h.
Note : si vous lancez ensuite le gestionnaire d'interruption initial, alors vous n'avez pas à vous préoccuper du port 20h, puisqu'il est géré par l'interruption originelle. si vous lancez ensuite l'ancien gestionnaire d'interruption, cela permettra de mettre à jour les LEDs du clavier par exemple.
L'idéal est de stocker l'état de chaque touche dans un tableau de 128 booléens, ainsi on pourra le réutiliser pour connaitre l'état des touches.
Résumé :
pour gérer efficacement le clavier il faut donc disposer d'une procédure
gestionnaire d'interruption suivant le shéma :
{
-lit le port 60h
-met à jour le tableau des touches
-renvoie 20h au port 20h
-IRET
}
et d'un corps principal contenant :
{
-sauvegarde l'ancien vecteur de l'interruption 09h
-le remplace par l'adresse du gestionnaire d'interruption
-...
-lit le tableau de touches et agit en conséquence
-...
-restaures l'ancien vecteur d'interruption
}
Pour info, voici la correspondance entre les touches et leur numéro (vous remarquerez qu'elles ont été codées à peu près de haut en bas et de gauche à droite sur le clavier) :
Touche | Numéro |
---|---|
Escape |
01h |
1 2 3 4 5 6 7 8 9 0 ) = | 02h -> 0Dh |
Backspace | 0Eh |
Tabulation | 0Fh |
A Z E R T Y U I O P ^ $ | 10h -> 1Bh |
Enter | 1Ch |
Ctrl (gauche ou droit) | 1Dh |
Q S D F G H J K L M ù | 1Eh -> 28h |
² | 29h |
Shift gauche | 2Ah |
* | 2Bh |
W X C V B N , ; : | 2Ch -> 34h |
! ou / (pavé numérique) | 35h |
Shift droit | 36h |
* (pavé numérique) | 37h |
Alt (gauche ou droit) | 38h |
Espace |
39h |
Caps Lock | 3Ah |
F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 | 3Bh -> 44H |
Verr num | 45h |
Arrêt défil. | 46h |
7 8 9 - 4 5 6 + 1 2 3 0 . (pavé numérique) | 47h -> 53h |
> | 56h |
F11 | 57h |
F12 | 58h |
Les touches entre le pavé alphabtétique et le pavé numériques sont des extensions du pavé numérique. Lorsque Verr num est activé, l'appui sur une de ces touches équivaut à l'appui sur la touche correspondante du pavé numérique plus la touche 2Ah (shift gauche) (vous pouvez d'ailleurs essayer : activez Verr num et faites shift + touche du pavé numérique et vous verrez que ca marche), sinon si Verr num est désactivé, cela fera exactement comme pour la touche correspondante du pavé numérique (cad sans touche 42).
III.Remerciements
Document écrit par
Antoche – Antoche@altern.org - #ICQ : 38 08 99 43
Libre reproduction
et diffusion autorisée
Merci à La Bible du Programmeur et à HelpPC.
Retour à la rubrique programmation.