On a parfois besoin d'utiliser des claviers. Ce sont souvent des claviers matriciels, comportant huit broches, quatre pour les lignes et quatre pour les colonnes du clavier.
L'appui d'une touche établi une liaison entre la ligne et la colonne au niveau de cette touche.
Principe du décodage: Lorsque le nombre de broches du µC est suffisant, ces broches sont regroupées par huit. Ici, pour le picaxe 20M2, nous avons huit broches "B" et huit broches "C". Pour le décodage, l'ensemble des broches C est utilisé.
Le basic picaxe désigne les niveaux des huit broches C par un octet (voir
cette page) nommé pinsC.
pincC=%10100011 représente les niveaux des broches C.7 à C.0, dans cet ordre
Ex: si
pinsC= %11110000 , les 4 bits de poids fort sont au niveau haut (noté 1), les 4 bits poids faibles au niveau bas (noté 0).
Ce qui signifie que les broches C.7, C.6, C.5, C.4 sont niveau haut et C.3, C.2, C.1, C.0 au niveau bas
Pour éviter de câbler des résistances, les résistances de pullup internes des broches C.7, C.6, C.5, C.4 sont activées et donc au niveau haut (1).
Sur le schéma ci dessus:
Les lignes du clavier sont reliées à ces broches.
Les colonnes sont reliées aux broches C.0 à C.4. Le code va donner successivement à ces broches les valeurs %1110, %1101,%1011,%0111
Si la broche C.1 est à 0 et que l'on appuie sur la touche 5, la broche C.6 passe de 1 à 0. On a pinsC= %10111101
A chaque appui sur une touche, correspond une valeur particulière de pinsC.
Dans le code ci dessous, on utilise la notation décimale, plus compacte : %10111101 = 189
Comment savoir qu'une touche est appuyée:
Sans appui, pinsC= %1111xxxx (x= 0 ou 1). Or, %11110000 =240 , dans tous les cas, si un des 1 est remplacé par un 0, le nombre obtenu est inférieur à 240. donc pinsC < 240 signifie d'une touche est appuyée.
Deux commandes sont utilisées:
lookdown qui reconnait une combinaison pinsC correspondant à une numéro de touche
lookup qui attribue à ce numéro un caractère ASCII affiché sur le LCD
Il faut bien sûr veiller à ce que cette succession de transformation corresponde à la réalité.
Remarques sur le code ci dessous:
PoidsFaible est un octet qui évolue comme suit: %xxxx0001 ->%xxxx0010 -> %xxxx0100 -> %xxx1000 ->%xxxx0001
Il est inversé dans : pinsC= not PoidsFaible, par ex: PoidsFaiblle= %xxxx0010 donne pinsC = %xxxx1101
Les poids forts xxxx ne sont pas utilisés, ils sont remplacés dans pinsC par les valeurs lues sur les broches C.4 à C.7, c'est à dire 1111 si on appuie sur aucune touche: %xxxx1101 -> %11111101 (=253, non testé car > 240 )