16 juin 2016

Matrice led 8*8 : Texte Défilant en C avec MPLABX et XC8

Utilisation de plusieurs modules à base de MAX7219 pour faire défiler un texte.

Texte défilant avec Max7219 et matrice led

Présentation :


Nous avons appris à utiliser un module de led à base du circuit MAX7219, mais un seul module pour afficher un texte c'est un peu "léger".

Donc ce billet montre l'utilisation de deux modules pour afficher un texte défilant.
Pourquoi seulement deux modules ? :

le stock est épuisé, il faut que je pense à commander un lot car les délais sont parfois long, la Chine c'est loin.

En fin d'article nous d'écrirons une horloge à base de DS3231.

La vidéo du programme de démonstration "affichage défilant:


La vidéo du programme "horloge" :


Les modules sont de même type que celui décrit dans un article précédent :

max7219 module led 8x8
  
Ils seront utilisés comme ci dessous :


max7219 utilisation de deux modules

Le module de droite est relié au microcontrôleur PIC 18F4525 ou 18F14K22.

Les schémas sont inclus dans les fichiers en fin d'article.

Modules MAX7219 : Utilisation


Comme on peut le remarquer le module 1 est relié au microcontrôleur, la sortie du module 1 est reliée à l'entrée du module 2.
Si, il est utilisé plus de 2 modules il suffit de relier la sortie du module 2 à l'entrée du module 3 et ainsi de suite.

Chaque afficheur nécessite 8 données de 8 bits pour afficher un caractère, par exemple pour le caractère  0 nous trouvons dans le fichier "table.h" nos 8 données :

0x00, 0x7E, 0xA1, 0x91, 0x89, 0x85, 0x7E, 0x00,

Ceci est important car nous allons utilisé un tableau pour stocker les données à afficher dans le cas d'un affichage défilant. Un rapide calcul pour déterminer la taille du tableau : Xmodules * 8
Dans notre cas 2 * 8 = 16.

Si l'on veut afficher seulement 2 caractères dans notre cas il faut envoyer aux modules 16 octets en commençant par les 8 octets du caractère qui doit être affiché sur le module à gauche puis par les 8 octets du caractère qui doit être affiché sur le module à droite.

Pour afficher "OK" il faut donc transmettre les octets suivants :

0x00, 0x7E, 0x81, 0x81, 0x81, 0x81, 0x7E, 0x00,0x00, 0xFF, 0x18, 0x18, 0x24, 0x42, 0x81, 0x00,

Il est évident que pour afficher un message fixe de grande longueur cela demande de nombreux modules et la solution du "texte défilant" s'impose.

Pour réaliser le défilement du texte il faut effectuer 15 déplacement de la droite vers la gauche et pour cela nous utiliserons un tableau de 16 éléments.

Tout d'abord un petit schéma :

max7219 numérotation colonnes


Pour effectuer le défilement il faut transférer :

  • le contenu de C15 dans C16, 
  • le contenu de C14 dans C15,
  • ............................................. ,
  • ............................................. , 
  • et pour terminer le contenu de C1 dans C2.


Ce qui au niveau programme donne :

        for (i = 15; i > 0; i--) {
            Aff_buffer[i] = Aff_buffer[i - 1];
        }

Aff_buffer[] correspond au tableau qui stocke les valeurs à afficher.

Il manque une action, que mettons nous dans C1 ?
Tout simplement la donnée "m" de la table correspondant au caractère que l'on veut afficher

Aff_buffer[0] = table[m + (data * 8)];

Comme chaque caractère est codé sur 8 octets il faut répéter l'ensemble de ces opérations huit fois, ce qui au niveau programme donne :

for (m = 0; m < 8; m++) {

        for (i = 15; i > 0; i--) {

            Aff_buffer[i] = Aff_buffer[i - 1];

        }

        Aff_buffer[0] = table[m + (data * 8)];
}

Il faut ensuite transmettre aux 2 modules le contenu du tableau.

Ce code sera répété autant de fois que nécessaire pour afficher tous les caractères du message que l'on veut afficher.

Le contenu du tableau "Aff_buffer", pour illustrer l'affichage de "OK" :


C16 C15 C14 C13 C12 C11 C10 C9 C8 C7 C6 C5 C4 C3 C2 C1
0 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
1 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7E
2 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7E 0x81
3 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7E 0x81 0x81
4 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7E 0x81 0x81 0x81
5 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7E 0x81 0x81 0x81 0x81
6 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7E 0x81 0x81 0x81 0x81 0x7E
7 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7E 0x81 0x81 0x81 0x81 0x7E 0x00
8 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7E 0x81 0x81 0x81 0x81 0x7E 0x00 0x00
9 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7E 0x81 0x81 0x81 0x81 0x7E 0x00 0x00 0xFF
10 0x00 0x00 0x00 0x00 0x00 0x00 0x7E 0x81 0x81 0x81 0x81 0x7E 0x00 0x00 0xFF 0x18
11 0x00 0x00 0x00 0x00 0x00 0x7E 0x81 0x81 0x81 0x81 0x7E 0x00 0x00 0xFF 0x18 0x18
12 0x00 0x00 0x00 0x00 0x7E 0x81 0x81 0x81 0x81 0x7E 0x00 0x00 0xFF 0x18 0x18 0x24
13 0x00 0x00 0x00 0x7E 0x81 0x81 0x81 0x81 0x7E 0x00 0x00 0xFF 0x18 0x18 0x24 0x42
14 0x00 0x00 0x7E 0x81 0x81 0x81 0x81 0x7E 0x00 0x00 0xFF 0x18 0x18 0x24 0x42 0x81
15 0x00 0x7E 0x81 0x81 0x81 0x81 0x7E 0x00 0x00 0xFF 0x18 0x18 0x24 0x42 0x81 0x00


















O K


MPLABX XC8 : Programmes de démonstration


Un programme de démonstration  "affichage_défilant" et un programme "horloge".

Ce dernier utilise un 18F14k22 et un module horloge à base de DS3231, ce qui permet d'afficher l'heure, la date et la température grâce au capteur intégré dans le circuit DS3231.

La mise à l'heure est effectuée à l'aide d'un seul bouton poussoir, ce n'est peut être pas la meilleur solution mais cela fonctionne.

"Il faut bien se faire plaisir de temps en temps".

Un appui sur le BP affiche l'année et celle ci s'incrémente automatiquement un nouvel appui sur le BP enregistre la valeur et affiche maintenant le mois, la séquence se répète  avec la date, le jour, l'heure et enfin la minute.

Attention à ne pas rater la bonne valeur, sinon c'est un tour complet (pour l'année c'est long).
Il est intégré le calcul du nombre de jours de chaque mois en fonction du calcul des années bissextiles et du mois sélectionné.
Ceci explique l'ordre : année, mois puis date.

Ces programmes sont des programmes de démonstration, il est pratiquement obligatoire de les modifier pour une utilisation dans un montage.

Par exemple ces programmes sont écrits pour 2 afficheurs, une version qui prend en compte le nombre d'afficheurs serait plus universelle.

La prise en compte du changement d'heure "ÉTÉ / HIVER" serait également un plus.
Une solution possible ICI.


A+

Aucun commentaire:

Enregistrer un commentaire