Afficheur 7 segments

omrani007 Messages postés 8 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 2 mai 2009 - 16 avril 2009 à 19:05
omrani007 Messages postés 8 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 2 mai 2009 - 17 avril 2009 à 22:51
comment programmer un pic16f876 pour saisir un nombre sur 5 afficheurs 7 segments?
aidez moi s'il vous plais!

12 réponses

piche32 Messages postés 23 Date d'inscription mercredi 1 octobre 2008 Statut Membre Dernière intervention 28 mai 2009
16 avril 2009 à 19:39
Salut. j'ai réalisé un projet similaire. l'idée est d'envoyer sur tous les afficheurs la valeur que chacun doit afficher et de d'allimenter l'afficheur que quand le numéro qu'il doit afficher est envoyé.
J'espere que sa pourra t'aider. a+
0
omrani007 Messages postés 8 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 2 mai 2009
17 avril 2009 à 11:29
Merci piche 32! mais je suis débutant est ce que tu peux me donner un exemple traduit en c ,et merci d'avance.
0
piche32 Messages postés 23 Date d'inscription mercredi 1 octobre 2008 Statut Membre Dernière intervention 28 mai 2009
17 avril 2009 à 11:52
while(1)
{
// Disons que ton nombre a affiché est x et qu'il vaut 12345
ton_nombre=12345 // on fixe x à 12345
//on isole chaque chiffre
dixmilliers=(x/10000); //le résultat doit etre 1
milliers=((x-dixmilliers)/1000); //2
centaines=((x-dixmilliers-milliers)/100) //3
dizaines=((x-dixmilliers-milliers-centaines)/10) //4
unites((x-dixmilliers-milliers-centaines-dizaines); //5

//ensuite on les envoie par exemple sur le portD et on commande l'allimentation de afficheur par les PIN du portB
output_d=dixmilliers; //on envoie dixmillers (1) sur le portd
output(PIN_B0)=1; //B0 allimente le premier afficheur donc elle est a 1
output(PIN_B0)=0; //les autre PIN sont a 0 car les afficheur doivent etre eteint
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=0;
delay_us(10); //on attend 10micro secondes

output_d=milliers;
output(PIN_B0)=0;
output(PIN_B0)=1;
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=0;
delay_us(10); //on attend 10micro secondes

output_d=centaines; //on envoie dixmillers (1) sur le portd
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=1;
output(PIN_B0)=0;
output(PIN_B0)=0;
delay_us(10); //on attend 10micro secondes

output_d=dizaines;
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=1;
output(PIN_B0)=0;
delay_us(10); //on attend 10micro secondes

output_d=unités;
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=1;
delay_us(10); //on attend 10micro secondes

}



La syntaxe n'est peut etre pas la meme pour toi mais l'idée est la
0
piche32 Messages postés 23 Date d'inscription mercredi 1 octobre 2008 Statut Membre Dernière intervention 28 mai 2009
17 avril 2009 à 11:52
oups pas cool l'affichage
dsl j'arrive pas a aller a la ligne
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
omrani007 Messages postés 8 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 2 mai 2009
17 avril 2009 à 13:02
Merci beacoup
0
omrani007 Messages postés 8 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 2 mai 2009
17 avril 2009 à 16:03
Et ben! J'ai dépassé quelques étapes, d'abord mon programme du clavier est comme suit:
#include<16f877.h>
#byte kbd = 0xF81              // portc 0xF82 et portD  0xF83
#byte kbd = 6                  // portc 7 et portD  8
#define set_tris_kbd(x) set_tris_b(x)

#define COL0 (1 << 4)
#define COL1 (1 << 5)
#define COL2 (1 << 6)
#define COL3 (1 << 7)

#define ROW0 (1 << 0)
#define ROW1 (1 << 1)
#define ROW2 (1 << 2)
#define ROW3 (1 << 3)

#define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)
#define ALL_PINS (ALL_ROWS|COL0|COL1|COL2|COL3)

// Keypad layout:
char const KEYS[4][4] = {{'7','8','9','/'},  // caractères de votre clavier
                         {'4','5','6','*'},
                         {'1','2','3','-'},
                         {'c','0','=','+'}};

#define KBD_DEBOUNCE_FACTOR 50

void main() {
}

char kbd_getc( ) {
   static BYTE kbd_call_count;
   static short int kbd_down;
   static char last_key;
   static BYTE col;

   BYTE kchar;
   BYTE row;

   kchar='\0';
   if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
       switch (col) {
         case 0   : set_tris_kbd(ALL_PINS&~COL0);
                    kbd=~COL0&ALL_PINS;
                    break;
         case 1   : set_tris_kbd(ALL_PINS&~COL1);
                    kbd=~COL1&ALL_PINS;
                    break;
         case 2   : set_tris_kbd(ALL_PINS&~COL2);
                    kbd=~COL2&ALL_PINS;
                    break;
         case 3   : set_tris_kbd(ALL_PINS&~COL3);
                    kbd=~COL3&ALL_PINS;
                    break;
       }

       if(kbd_down) {
         if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
           kbd_down=FALSE;
           kchar=last_key;
           last_key='\0';
         }
       } else {
          if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
             if((kbd & ROW0)==0)
               row=0;
             else if((kbd & ROW1)==0)
               row=1;
             else if((kbd & ROW2)==0)
               row=2;
             else if((kbd & ROW3)==0)
               row=3;
             last_key =KEYS[row][col];
             kbd_down = TRUE;
          } else {
             ++col;
             if(col==4)
               col=0;
          }
       }
      kbd_call_count=0;
   }
  set_tris_kbd(ALL_PINS);
  return(kchar);
Comment écrire la suite du programme pour commander les afficheurs?
0
omrani007 Messages postés 8 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 2 mai 2009
17 avril 2009 à 16:11
ah j'ai oublié les 8 broches du clavier sont connecté aux pins Rb
0
piche32 Messages postés 23 Date d'inscription mercredi 1 octobre 2008 Statut Membre Dernière intervention 28 mai 2009
17 avril 2009 à 16:21
Si ton portD n'est pas du tout utilisé tu peu y connecter les afficheurs et il te reste bien 5 sorties pour les commandes d'allimentation? nan?
0
omrani007 Messages postés 8 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 2 mai 2009
17 avril 2009 à 16:29
mon port D est connecté a un afficheur LCD qui est réservé pour un affichage interne
0
piche32 Messages postés 23 Date d'inscription mercredi 1 octobre 2008 Statut Membre Dernière intervention 28 mai 2009
17 avril 2009 à 16:44
A ce compte la il faut que tu mulltiplexe ton nombre.tu l'envoie avec une sortie.il faut une autre sortie ou tu fournira une horloge de la meme frequence que la transmission du nombre.ensuite tu pourra démultipèxé avec un composant (je ne sait plus la référence). ensuite avec un registre a décalage tu poura commander l'alimentation. tu aura juste a envoyé un chiffre sur trois sorties du pic... tu vois ce que je veu dire?
0
omrani007 Messages postés 8 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 2 mai 2009
17 avril 2009 à 18:08
j'ai fait des modifications sur ton programme de cette façon mais il ne marche pas.
#include<16F876.h>
#use delay(clock=40000000)
#define PIN_D
#define PIN_B             
#define PIN_C

void main()
{
int dixmilliers,milliers,dizaines,unites,centaines,x;
while(1) {

//on isole chaque chiffre
dixmilliers=(x/10000); //le résultat doit etre1
milliers=((x-dixmilliers)/1000); //2
centaines=((x-dixmilliers-milliers)/100); //3
dizaines=((x-dixmilliers-milliers-centaines)/10); //4
unites=((x-dixmilliers-milliers-centaines-dizaines)); //5 //ensuite on les envoie par exemple sur le portD et on commande l'allimentation de afficheur par les PIN du portB
output_d=dixmilliers; //on envoie dixmillers (1) sur le portd
output(PIN_B0)=1; //B0 allimente le premier afficheur donc elle est a 1
output(PIN_B1)=0; //les autre PIN sont a 0 car les afficheur doivent etre eteint
output(PIN_B2)=0;
output(PIN_B3)=0;
output(PIN_B4)=0;
delay_us(10); //on attend 10micro secondes
output_d=milliers;
output(PIN_B0)=0;
output(PIN_B0)=1;
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=0;
delay_us(10); //on attend 10micro secondes
output_d=centaines; //on envoie dixmillers (1) sur le portd
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=1;
output(PIN_B0)=0;
output(PIN_B0)=0;
delay_us(10); //on attend 10micro secondes
output_d=dizaines;
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=1;
output(PIN_B0)=0;
delay_us(10); //on attend 10micro secondes
output_d=unités;
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=0;
output(PIN_B0)=1;
delay_us(10);//on attend 10micro secondes
}
}
comme je te dit je suis un débutant
0
omrani007 Messages postés 8 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 2 mai 2009
17 avril 2009 à 22:51
Est ce que vous pouvez me corriger ce programme ci-dessus?
0
Rejoignez-nous