Astuces
pour économiser les pattes d'un PIC
Il
arrive parfois que, sur un PIC, on commence à manquer de pattes ...
Par exemple , un afficheur LCD 2x16 lignes "consomme" 10 pattes
(8 bits de données , le "E" , le "RS" ; le R/W peut être forcé à la
masse)
Si vous rajoutez quelques boutons poussoir, il ne vous reste que bien
peu de pattes "utiles" pour
le reste du projet
La solution consiste à passer au 16F877 : 40pattes
Mais il y a plusieurs astuces qui permettent de rester à un 28 pattes
(16F872)
ou même un 18 pattes (16F84 ou pour moi le 16F819)
Commençons par voir l'afficheur LCD
1- le R/W est forcé à la masse ;
impossible donc de lire le "busy flag" pour voir si l'afficheur est
occupé ou libre (pour la prochaine commande) .
Mais si vous lisez bien le datasheet, la plupart des commandes
s'éxécutent en <64µs
si vous acceptez de faire un "call tempo" vous économisez une ligne.
Mais il y a bien mieux : le CD4094 : c'est un registre à décalage 8
bits.
Voici le schéma:

Pour ma part, je câble sur un tout petit bout de carte d'essai le
ICL7660 et le 4094
directement à l'arrière de l'afficheur.

On obtient donc un afficheur sur 6 fils : il devient en plus
déportable
Evidemment, ceci impose un petit bout de programme (une routine) pour
converser avec l'afficheur
mais cette routine est on ne peut plus simple : il suffit de
"sérialiser" l'octet à envoyer
8 coups d'horloge sur H(du 4094) et l'afficheur LCD voit la donnée 8
bits parrallèle
Il ne reste plus qu'à envoyer une impulsion sur "E"
Autre avantage : si vous avez besoin de plus de sorties, vous pouvez :
soit cascader les 4094 (en série)
soit en mettre un second ; dans ce cas, seule l'horloge sera séparée
si un 4094 sert à l'afficheur et l'autre à un port "Z" (8 bits)
vous aurez 3 pattes :
-donnée commune au 2 CD4094
-horloge_4094_afficheur
-horloge_4094_portZ
Voilà pour les sorties.
Que faire maintenant, si vous avez beaucoup de boutons poussoirs ?
Il y a bien sûr la matrice, mais ce procédé requiert un port de 8
bit entier pour 16 touches
Je vous propose 2 solutions
Soit "l'inverse" du 4094 à savoir le 4014 (registre à décalage 8
bits en entrée)
avec 2 bits (donnée et horloge ) vous pouvez lire 8 ou 16 boutons
poussoirs... pas mal...
Mais il y a encore plus "asticieux" .
Regardez, par exemple, ce que fait SONY pour sa face avant détachable
d'auto radio :

C'est une façon de faire que je connais bien (moi qui suis fana de
walkman)
Avec seulement UNE patte vous lisez 10 à 12 touches (à condition que
cette patte soit une entrée de CAN , bien sûr)
La routine est très simple :
-vous lancez la conversion analogique
-si l'octet = FF : aucune touche n'est appuyée.
-si l'octet différent de FF, alors, les bits de poids fort vous
indiquent la touche appuyée.
Regardez par exemple les calculs que j'ai fait sous calc pour les 12
touches du haut (lsw910 à 922):

Dans la colonne "binaire" , on voit bien que les 5 bits de poids fort
indiquent votre touche appuyée.
Par contre , il faut faire attention au bruit et aux tolérances des
résistances
Par exemple, la touche BP1 est théoriquement 0001 0xxx, mais un seul
millivolt en moins et elle deviendra : 0000 1111
La routine doit donc prévoir des "encadrements" plutôt que des
comparaisons avec des valeurs fixes
Voici à quoi elle ressemble:
La première partie consiste à comparer le résultat (AD RES H)
avec 250 (ou 251 ou 252 )
si aucune touche n'est appuyée, la valeur est 255 au bruit parasite près
ensuite, la variable "numéro_de_touche" est incrémentée à chaque
comparaison de valeur

On arrive donc à ce que l'octet "numéro_de_touche" contienne un chiffre entre 0 et 6 (je n'ai mis que 6 touches)
il reste ensuite à faire l'aiguillage en fonction de ce chiffre :

et voici la routine en .asm ICI
dans cette routine, j'affiche même en décimal la valeur de ADRES pour que vous puissiez voir la valeur de votre touche
Elle contient aussi les routines pour l'afficheur LCD : à vous de piocher ce qui vous interresse !!