2017-07-21 6 views
1

J'ai des circuits RFID. Im essayant d'ajouter un compteur avec un 7 sept segments. Mon segment de sept donnant des nombres aléatoires comme ceci. Photo Je pense que ces chiffres sont opposés à mes nombres. Comment puis-je résoudre ce problème?Compteur Rfid à 7 segments

#include <16F887.h>  
    #fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 
    #use delay(clock=4m,oscillator) 
    #define Dig1 PIN_D0 
    #define Dig2 PIN_D1 
    #define rfid PIN_D2 
    #define reset PIN_A1 
    #use fast_io(b) 
    #use fast_io(d) 
    char birler = 0, onlar = 0, sayi = 0; 
     void main() 
    { 
     int digit[10]={0b0111111,0b0000110,0b1011011,0b1001111,0b1101101,0b1111101,0b0000111,0b1111111,0b1101111}; 

     set_tris_b(0x00); 
     output_b(1); 
     set_tris_d(0b11111100); 
     output_d(0b11111100); 
     output_b(0b11111100); 

     while(1) 
     { 
     output_b(digit[onlar]); 
     output_d(0b11111101); 
     delay_ms(5); 
     output_b(digit[birler]); 
     output_d(0b11111110); 
     delay_ms(5); 

     if(input(rfid) == 0) 
     { 
      sayi++; 
      birler = sayi%10; 
      onlar = sayi/10; 
      while(input(rfid) == 0) 
      { 
       output_b(digit[onlar]); 
       output_d(0b11111101); 
       delay_ms(5); 
       output_b(digit[birler]); 
       output_d(0b11111110); 
       delay_ms(5); 

      } 
      } 
      } 
     } 
+1

J'espère que vous apprenez que non Avoir une fonction dédiée qui gère _only_ l'affichage entrave votre capacité à déboguer un programme. –

Répondre

0

Vous devriez vraiment envisager d'isoler l'affichage de votre boucle principale, et en éliminant les retards en ligne dans votre code. Les avantages sont une meilleure lisibilité, une maintenance plus facile et l'élimination des délais pour effectuer le travail. Pendant la préparation de cette réponse, j'ai découvert que la table de vos segments contient des entrées manquantes. L'entrée pour '4' est manquante.

Le code ci-dessous est loin d'être complet. Il y a un chiffre manquant dans la table des segments de LED, vous utilisez un commutateur qui a besoin de débrayer et il manque une horloge pour les temporisateurs non bloquants.

J'ai copier/coller une grande partie de votre application, et les commentaires ajoutés ...

#include <16F887.h>  
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 
#use delay(clock=4m,oscillator) 
#define Dig1 PIN_D0 
#define Dig2 PIN_D1 
#define rfid PIN_D2 
#define reset PIN_A1 
#use fast_io(b) 
#use fast_io(d) 

// never define const arrays on the stack. 
static const int digit[10]= { 0b0111111, 0b0000110, 0b1011011, 0b1001111, /* missing '4' */ 0, 
           0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111 }; 

void display(unsigned char value) 
{ 
    static char tens = 0; 
    char dig = (tens) ? (value/10) : (value % 10); 
    dig = digit[dig]; 
    output_high((tens} ? Dig2 : Dig1); 
    output_b(dig);      // <-- clobbers the high bit of B 
    output_low((tens} ? Dig1 : Dig2); // preventing other uses for it. 
    tens = !tens; 
} 

void main() 
{ 
    char sayi = 0; 

    output_b(1); 
    output_d(0b11111100); 
    output_b(0b11111100); // why set PORTB to 1 earlier? is that a bug? 

    set_tris_b(0x00);  // always init tristate AFTER setting output 
    set_tris_d(0b11111100); 

    while(1) 
    { 
    display(sayi); 

    if(input(rfid) == 0) // debouncing needed. 30ms is a good delay for debouncing 
    { 
     sayi++;   // what happens when we reach 100 ??? 
    } 
    delay_ms(30);  // in real-life, this should not be there. 
          // there are better ways to throttle a program, 
          // including going to sleep/idle. 
    } 
} 
0

Je pense que ces chiffres sont à l'opposé de mes numéros.

Vérifiez si votre sept segments est common cathode ou non, car il semble que le code est construit pour la cathode commune à sept segments

Et si elle est anode commune et il est de votre choix, vous pouvez simplement changer le code pour l'adapter en basculant tous les bits dans digit tableau, par ex zéro sera 0b10000000

+0

Il est commun de cathode et lorsque le code envoie 11,22,33,44,55 .. le code numérique fonctionne normalement. –

0

Si vos chiffres ne sont pas correctement apparaissent, pensez à modifier le tableau de chiffres à

digit[] = {0b1, 0b10, 0b100, 0b1000, 0b10000, 0b100000, 0b1000000}; 

et exécuter chaque motif pendant 5 secondes. Cela vous dira quel bit contrôle quel segment. Ce que j'ai remarqué à propos des écrans à 7 segments de différents fabricants, c'est qu'ils ne numérotent pas toujours les segments de la même manière, donc 0b111111 peut apparaître comme 6 ou 9: pas nécessairement 0.