LCD de lecteur dvd de salon récupéré, besoin d'aide pour optimiser le code

Je vous présente tout d'abord le peit afficheur LCD récupéré sur un lecteur dvd de salon :

(image trouvée sur le net)
marque : KEHONG
modèle numéro : KHN70241
(source : http://sell.bizrice.com/selling-leads/928548/7-digits-led-display-Use-in-DVD-VCD.html)

Nous avons donc affaire à 7 afficheurs 7 segments dans un même afficheur, avec quelques leds supplémentaire (comme MP :D, play, pause, ...) :smiley:

Après quelques mesures, il s'avère que l'afficheur n'est autre qu'une matrice à led, dont j'ai noté le fonctionnement :
On a 17 broches sous le composant.

Les pattes 10 à 16 correspondent aux 7 digits :
10 -> 3ème chiffre
11 -> 1er chiffre
12 -> 2ème chiffre
13 -> 4ème chiffre
14 -> 5ème chiffre
15 -> 6ème chiffre
16 -> 7ème chiffre

Les pattes 1 à 7 correspondent aux 7 segments de chaque chiffres.

La patte 17 correspond aux logos, et aux ':'.

D'autres paramètres sont possibles mais la liste est longue !

Les pattes 10 à 17 sont actives au 0v et les pattes 1 à 8 sont actives au +5v


Voilà pour ce qui est de la présentation de l'afficheur, maintenant, je passe à la pratique !
Je relie les pattes de 1 à 7 sur les sorties 12 à 6 (respectivement) de mon arduino nano.
Je relie les pattes de 10 à 16 sur les sorties 4,3,5,2,1(tx),0(rx) (respectivement) de mon nano également, je n'utilise pas la patte 17 du LCD pour l'instant.


Maintenant, le code !
Et c'est là que j'aurais besoins de votre aide pour m'organiser !
Préoccupons nous uniquement des chiffre pour ce topic.

Etant donné que l'on ne peut allumer q'un seul segment à la fois, nous sommes obligé de passer par du multiplexage (charlieplexing), et n'ayant pas de multiplexeur ou autre composant spécial pour réaliser celà, je dois me débrouiller avec le code.

Donc, j'ai utilisé des fonctions pour chaque étapes, çà évite de taper un code de 30km de long pour écrire 3 mots...

Le problème par contre, c'est que du coup çà me fait un gros code en un bloc et qui n'est pas franchement optimisé, si vous y jetez un oeil, chaque fonction correspond à un caratère (chiffre ou lettre) que je peut assigner à un digit (D1, D2, D3, D4, D5, D6 ou D7), ce qui m'oblige à utiliser la fonction boucle pour incrémenter une variable it. Cette variable it sert à cadencer l'affichage de mes lettres (ex : si 0<it<100, on écrit 'hey'), on utilise une fonction reset à chaque opération pour faire du multiplexage, exemple :
Pour écrire la lettre o, on allume le segment g, puis on reset, puis le segmentc, puis on reset, puis segment d, puis reset et enfin segment e puis reset.

Mes questions :
Comment puis-je procéder pour éviter l'utilisation de la fonction reset ?
Comment puis-je convertir mes fonctions en librairie interne (dans nouvel onglet), car je n'ai pas compris les tutos trouvés sur le net.
Si quelqu'un peut m'aiguiller, ce serais vachement sympas !


Edit : voilà le code, je l'avais oublié : arduinolcddvd - Pastebin.com

personne ? :open_mouth:

Si, si, mais comme tu peux le constater, y a pas foule non plus, c'est pas le métro à Paris.... XD

Patience donc :grin:

Etant donné que l'on ne peut allumer qu'un seul segment à la fois

je dirais plutôt un seul digit à la fois. C'est manifestement un afficheur à cathode commune donc tu mets la cathode d'un des digits à zéro et tu appliques un niveau un sur les segments que tu veux allumer pour ce digit. Tu fais une petite pause pour que l'observateur ait le temps de voir les segments allumés. Ensuite tu passes au suivant et ainsi de suite.

nous sommes obligé de passer par du multiplexage (charlieplexing)

Ce n'est à priori pas du charlieplexing qui nécessite une disposition particulière des LED tête-bêche.

Si tu vas sur le Playground http://playground.arduino.cc//Main/InterfacingWithHardware#Output et que dans la page tu cherches "Seven segment displays" tu verras qu'il y a déjà des librairies qui existent. Avec un peut de chance ce que tu veux faire existe déjà.

Autrement concernant l'optimisation de ton code, si tu regardes les fonctions que tu as créées, elles sont toutes identiques la seule différences entre elles étant les segments allumés. Donc dans ces cas là tu te dis "pourquoi dupliquer le code si c'est seulement l'information qui change à chaque fois. Il faudrait peut être faire un tableau qui décrive les segments allumés ou éteint pour chaque caractère et passer en argument à cette fonction un index dans le tableau qui pointe sur le caractère à afficher."

Merci beaucoup fdufnews !
Concernant la librairie, j'ai trouvé çà :

Multiplex7Seg is a small Arduino library allowing you to multiplex 1, 2, 3 or 4 digits using any one of the pins on your Arduino, that's a 9999 digit display. You also have the ability to enable zero leading blanking for low power requirements. Mail me at bester.juan@gmail.com for additional help on using the library.

je vais essayer.

Si non, c'est pas bête le tableau contenant les pins à allumer pour chaque lettre/chiffre, merci :wink:

Multiplex7Seg is a small Arduino library allowing you to multiplex 1, 2, 3 or 4 digits

Il faudra peut être l'adapter un peu si tu veux utiliser tous les digits de ton afficheur. Mais je pense que cela peut faire une bonne base.

Commence par la faire tourner en l'état sur 4 digits de ton afficheur puis une fois certain qu'elle fonctionne comme tu le veux tu pourras la faire évoluer.