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 !!