Utilisation d'un afficheur 7 segments sans décodeur BCD


Schéma de câblage



La table de vérité



C7C6C5C4C3C2C1C0ChiffreHexa
1 0 0 0 0 0 0 0 0 0x80
1 1 1 0 1 1 0 0 1 0xEC
0 1 0 0 0 0 1 0 2 0x42
0 1 0 0 1 0 0 0 3 0x48
0 0 1 0 1 1 0 0 4 0x2C
0 0 0 1 1 0 0 0 5 0x18
0 0 1 1 0 0 0 0 6 0x30
1 1 0 0 1 1 0 0 7 0xCC
0 0 0 0 0 0 0 0 8 0x00
0 0 0 0 1 1 0 0 9 0x0C
0 1 1 1 1 1 1 1 erreur 0x7F


Le programme


  1.  
  2. //Directives de préprocesseur
  3. #include <16f876A.h>
  4. #use delay(clock=4000000)
  5. #fuses XT, NOWDT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
  6.  
  7. //On associe une sortie à chaque entrée de l'afficheur 7 segments
  8. #define a pin_C5
  9. #define b pin_C4
  10. #define c pin_C1
  11. #define d pin_C2
  12. #define e pin_C3
  13. #define f pin_C6
  14. #define g pin_C7
  15.  
  16. #define t1 pin_B0 //sortie pour le transistor
  17. int i, H=0; //variables global
  18. void SEG7(int H); //déclaration de la fonction SEG7
  19.  
  20. void main() //programme principal
  21. {
  22.    while(1) //boucle infinie
  23.       {
  24.          output_low(t1); //on met à 0 la base du transistor
  25.          for(i=0; i<=10; i++) // tant que i est inférieur ou égal à 10 on l'incrémente
  26.             {
  27.                SEG7(i); //on copie la nouvelle valeur de i dans la fonction SEG7
  28.                delay_ms(500); //tout les 1/2 seconde
  29.             }
  30.       }
  31.  
  32. }
  33. void SEG7(int H) //fonction SEG7
  34. {
  35.         switch(H) //fonction de base du langage C, permet de faire un choix parmi toute les possibilité suivante
  36.                 {
  37.                         case 0: output_c(0x80); //si i=0 le port C prendra alors la valeur 0x80 (voir tableau)
  38.                                 break;
  39.                         case 1: output_c(0xEC); //etc...
  40.                                 break;
  41.                         case 2: output_c(0x42);
  42.                                 break;
  43.                         case 3: output_c(0x48);
  44.                                 break;
  45.                         case 4: output_c(0x2C);
  46.                                 break;
  47.                         case 5: output_c(0x18);
  48.                                 break;
  49.                         case 6: output_c(0x30);
  50.                                 break;
  51.                         case 7: output_c(0xCC);
  52.                                 break;
  53.                         case 8: output_c(0x00);
  54.                                 break;
  55.                         case 9: output_c(0x0C);
  56.                                 break;
  57.                         default:output_c(0x7F); //si autre chose que 0 à 9 on affiche ceci
  58.                 }
  59. }
  60.  

Explications


Il s'agit ici d'un afficheur 7 segments à anode commune que l'on utilise sans décodeur BCD, une sortie du PIC est associé à une entrée de l'afficheur, et chaque entrée de l'afficheur correspond à un segments. Une fois que l'on sait à quel lettre correspond quel segment il est très facile de piloté un afficheur 7 segments. Le transistor est la pour fournir suffisamment de courant à l'afficheur pour qu'il s'allume dans de bonnes conditions (une sortie de PIC ne fournis pas beaucoup de courant, en tout cas pas suffisamment pour allumer 7 LED d'un coup).


Pour ce qui est du programme, ici on gère 7 sortie pour l'afficheur et 1 pour le transistor. 7 sorties à utilisés quasi simultanément, ça serrais plutôt lourd à programmer et surtout lourd pour la mémoire du PIC. Par exemple pour le chiffre 0 on aurais:
  1.  
  2. output_high(pin_c7);
  3. output_low(pin_c6);
  4. output_low(pin_c5);
  5. output_low(pin_c4);
  6. output_low(pin_c3);
  7. output_low(pin_c2);
  8. output_low(pin_c1);
  9.  

Et il faudrait répété cette opération 9 fois pour les autres états de l'afficheur... La fonction output_c() nous permet donc de limité largement les dégâts en réduisant le code précédent à une seul et unique ligne: output_c(0x80) ou 80 est le nombre hexadécimal correspondant à l'état des sorties permettant d'afficher un 0.


Le programme principal quand à lui affiche les nombres 0 à 9 ainsi qu'un code erreur à l'infini.

Le dossier


Je met à vôtre disposition un dossier compresser avec:

  • Le fichier source en .C

  • Tout les fichiers généré lors de la compilation (notamment le .hex utile à la simulation ou pour envoyer dans le PIC)

  • Le fichier de schéma fait sur proteus

  • La même capture d'écran qu'au dessus (pour le schéma de câblage)

  • Et la table de vérité sous excel


sans_bcd.rar


N'hésitez pas à poser vos questions via le forum!

Sugi


lay
30/5/11 à 9:15
salut, je veut realiser un décompteur , en utilisant 2 afficheurs à 7 segments, et un pic,mon probleme est comment commander 2 afficheurs à 7 segements par un seul port d'un pic,pour afficher les nombres de 0 à 20 seulement.
Si quelqu'un peut m'aider merci a vous



Matthieu
4/6/11 à 21:48
Bonjour , il faut matricer tes données : avec 2 transistor comme tu peux le voir sur le montage , avec la persistance tu verras toujours quelque chose .


Asama
5/6/11 à 14:33
bonjour j'un un probleme sur le routage j'ai pas trouvé le Package de l'afficheur 7 segment anode commune comme indique le montage ci dessus merci si quelq'un peut m'aider.

Nom (requis)
E-Mail (ne sera pas publié) (requis)
Site internet


Résultat
© robot-amateur.com - Tous droits réservés. Reproduction interdite sans autorisation.