probleme de programme en C!!!
Répondre à la discussion
Affichage des résultats 1 à 28 sur 28

probleme de programme en C!!!



  1. #1
    invite764d6438

    probleme de programme en C!!!


    ------

    salut a tous,

    j'ai un probleme depuis je vais devenir fouu, le programme affiche toujours la meme chose sur l'afficheur LCD "erreur" dans tous les cas.

    il s'agit d'une petite serrure codée, j'entre 4 chiffre sur le lcd (1,2,3,4) le programme doit afficher bon code si c'est le cas et erreur sinon mais il affiche erreur tout le temps!!! meme lorsque je mets 1 2 3 4 je ne comprends pas ce qui est cloche j'ai revérifier le programme une centaine de fois normalement c'est correct???


    Code:
    unsigned short kp, cnt=0;
    unsigned char i=0;
    char password[4];
    char comp[5] = {0, 1, 2, 3, 4};               // Pas utilisé pour le moment
    
    // Keypad module connections
    char  keypadPort at PORTD;
    // End Keypad module connections
    
    
    char txt1[] = "Code Bon";
    char txt2[] = "Erreur";
    
    // LCD module connections
    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;
    
    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    // End LCD module connections
    
    
     char compare(){
    
         if (password[1]==1 && password[2]==2 && password[3]==3 && password[4]==4){
          Lcd_Cmd(_LCD_CLEAR);
          Lcd_Out(1,6,txt1);
          }
         else {
         Lcd_Cmd(_LCD_CLEAR);
         Lcd_Out(1,6,txt2);
         }
          }
          
     
    
    void main() {                              // Reset counter
      Keypad_Init();                           // Initialize Keypad
      ANSEL  = 0;                              // Configure AN pins as digital I/O
      ANSELH = 0;
      Lcd_Init();                              // Initialize LCD
      Lcd_Cmd(_LCD_CLEAR);                     // Clear display
      Lcd_Cmd(_LCD_CURSOR_OFF);                // Cursor off
      do {
       kp = 0;                                // Reset key code variable
    
        // Wait for key to be pressed and released
        do
    
          kp = Keypad_Key_Click();             // Store key code in kp variable
        while (!kp);
    
        switch (kp) {
          case  1: kp = 49; break; // 1       
          case  2: kp = 50; break; // 2
          case  3: kp = 51; break; // 3
          case  4: kp = 65; break; // A
          case  5: kp = 52; break; // 4
          case  6: kp = 53; break; // 5
          case  7: kp = 54; break; // 6
          case  8: kp = 66; break; // B
          case  9: kp = 55; break; // 7
          case 10: kp = 56; break; // 8
          case 11: kp = 57; break; // 9
          case 12: kp = 67; break; // C
          case 13: kp = 42; break; // *
          case 14: kp = 48; break; // 0
          case 15: kp = 35; break; // #
          case 16: kp = 68; break; // D
    
        }
    
    
         if (kp != 0){         // A chaque appui sur une touche
              cnt++;           // On incremente cnt pour décaler de 1 vers la droite pour afficher le chiffre suivant
              i++;             // on incremente i pour parcourir le tableau password
              password[i]=kp;
              Lcd_Chr(1, cnt, password[i]);
              if(i==4) compare();     // des que i est egal a 4   on appel la fonction compare() pour verifier que c'est le bon code                
              
              }
    
          
      } while (1);
    }

    -----

  2. #2
    Seb.26

    Re : probleme de programme en C!!!

    hello,

    j'ai l’impression que tu compare des valeurs avec des codes ASCII :
    if (password[1]==1 && password[2]==2 && password[3]==3 && password[4]==4){
    mais dans password, tu stocke les valeurs qui viennent de ton switch (qui ressemblent à des codes ASCII)

    De plus tu devrais rajouter un 'default' dans le switch pour mettre kp à 0 si le code est inconnu, sinon le 'if(kp!=0)' ne sert à rien puisque c'est impossible ...

    @+
    Dernière modification par Seb.26 ; 01/05/2013 à 21h40.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  3. #3
    invite764d6438

    Re : probleme de programme en C!!!

    ahh et a la place il faut que je mettre quoi? a la place de if (password[1]==1 && password[2]==2 && password[3]==3 && password[4]==4)?

  4. #4
    gienas
    Modérateur

    Re : probleme de programme en C!!!

    Bonsoir à tous

    Citation Envoyé par Seb.26 Voir le message
    ... j'ai l’impression ...
    Ce n'est, en effet, pas une impression.

    Il ne faut pas confondre '1' et 1.

    Il faut faire pareil dans la déclaration et dans le test.

    Comme le char peut contenir un chiffre, un vrai, on peut utiliser les chiffres dans les deux cas.


    Mais, pour respecter le fait que ce sont des char, il vaudrait mieux s'aligner sur '1' ... partout
    .

  5. A voir en vidéo sur Futura
  6. #5
    invite89e2ec4b

    Re : probleme de programme en C!!!

    ahh et a la place il faut que je mettre quoi? a la place de if (password[1]==1 && password[2]==2 && password[3]==3 && password[4]==4)?
    if (password[1]==49 && password[2]==50 && password[3]==51 && password[4]==65), ça devrait le faire.

    Et il faut remettre i à 0, non?

  7. #6
    invite764d6438

    Re : probleme de programme en C!!!

    alors je viens de constater un truc qui je pense est l'erreur le code ecrit est compatible avec ce clavier http://www.google.ci/imgres?imgurl=h...9QEwAg&dur=233

    et moi sur proteus j'utilise ce clavier https://www.google.ci/search?hl=fr&g...ad%3B800%3B403




    ce n'est pas le meme mais l'autre ne figure pas sur proteus donc j'ai utilisé le clavier calculatrice et la les chiffre sont inversé par rapport au premier au lieu de 1 par exemple on a 7 j'ai essayé de faire ce que vous avez dis mais ca passe je pense il faut changer de clavier ou rajouter des boutons poussoir tout simplement?

  8. #7
    invite764d6438

    Re : probleme de programme en C!!!

    j'ai essayé ca mais ca marche pas encore

    if (password[1]==49 && password[2]==50 && password[3]==51 && password[4]==52)

  9. #8
    spown

    Re : probleme de programme en C!!!

    essaye ca :
    Code:
     if (password[1]=='49' && password[2]=='50' && password[3]=='51' && password[4]=='65')
    Sinon tu peux mettre comme ça :

    Code:
    char *password ="1234";
    int indice=0;
    if(password[indice] == kp)	
      ++indice;
    else 
      indice = 0;
    if(indice == 4)
    	{
               indice=0;
               Lcd_Cmd(_LCD_CLEAR);
               Lcd_Out(1,6,txt1);
             }

  10. #9
    invite764d6438

    Re : probleme de programme en C!!!

    Citation Envoyé par spown Voir le message
    essaye ca :
    Code:
     if (password[1]=='49' && password[2]=='50' && password[3]=='51' && password[4]=='65')
    Sinon tu peux mettre comme ça :

    Code:
    char *password ="1234";
    int indice=0;
    if(password[indice] == kp)	
      ++indice;
    else 
      indice = 0;
    if(indice == 4)
    	{
               indice=0;
               Lcd_Cmd(_LCD_CLEAR);
               Lcd_Out(1,6,txt1);
             }
    salut j'ai essayé les deux mais c'est toujours pareil je commence a avoir mal a la tete ca fait 3 h je trimme pour un petit souci surement

  11. #10
    spown

    Re : probleme de programme en C!!!

    tu as essayé ca :

    Code:
    char *password ="1234";
    int indice=0;
    if(password[indice] == kp-49)	
      ++indice;
    else 
      indice = 0;
    if(indice == 4)
    	{
               indice=0;
               Lcd_Cmd(_LCD_CLEAR);
               Lcd_Out(1,6,txt1);
             }

  12. #11
    invite764d6438

    Re : probleme de programme en C!!!

    oui j'ai essayé ca ne marche tjrs pas

    j'ai aussi modifier et essayer ca mais pareil ca ne marche pas, la premiere valeur c'est password[1] pour info car i commence à 1

    Code:
    
     char compare(){
    char c=0;
    char indice;
    char *password ="1234";
    for(indice=1;indice<5; indice++){
    if(password[indice] == kp-49)
    c++;
    }
    if(c == 4)
    	{
               indice=1;
               Lcd_Cmd(_LCD_CLEAR);
               Lcd_Out(1,6,txt1);
             }
     else {
         Lcd_Cmd(_LCD_CLEAR);
         Lcd_Out(1,6,txt2);
         }
          }

  13. #12
    spown

    Re : probleme de programme en C!!!

    tu vois quoi sur le LCD ?

  14. #13
    invite764d6438

    Re : probleme de programme en C!!!

    une fois que je rentre les 4 chiffres, il m'écrit toujours Erreur meme lorsque je rentre le bon code (1 2 3 4) il m'envoie toujours le message erreur

  15. #14
    invitef86a6203

    Re : probleme de programme en C!!!

    les tableaux en C commencent avec l'index 0 pas 1 !
    Et en plus, quand tu met l'index 4 avec une dimension de 4 sur le tableau ça pointe sur la donnée suivante puisque ça dépasse !

  16. #15
    invite764d6438

    Re : probleme de programme en C!!!

    Citation Envoyé par freepicbasic Voir le message
    les tableaux en C commencent avec l'index 0 pas 1 !
    Et en plus, quand tu met l'index 4 avec une dimension de 4 sur le tableau ça pointe sur la donnée suivante puisque ça dépasse !

    Oui je sais mais en fait dans cette partie de code

    on incrémente i directement et la premiere valeur enregistrée par kp est password[1], voila pourquoi quand on fait la comparaison je veux commencer avec l'indice 1

    Code:
     if (kp != 0){         // A chaque appui sur une touche
              cnt++;           // On incremente cnt pour décaler de 1 vers la droite pour afficher le chiffre suivant
              i++;             // on incremente i pour parcourir le tableau password
              password[i]=kp;
              Lcd_Chr(1, cnt, password[i]);
              if(i==4) compare();     // des que i est egal a 4   on appel la fonction compare() pour verifier que c'est le bon code                
              
              }

  17. #16
    spown

    Re : probleme de programme en C!!!

    C'est mieux de commencer par 0. Parce que ça pourrait faire conflit au data par la suite des instructions. Mais je sens qu'il y quelque chose qui tourne mal au niveau de if(i==4) compare(); .

    La tu fais appel à compare() sans les variables internes.

    Peux tu m'afficher juste la fonction compare() avec ta dernière version modifier qui ne fonctionne pas.

  18. #17
    spown

    Re : probleme de programme en C!!!

    Tiens , essaye ca :

    Code:
    unsigned short kp, cnt=0;
    unsigned char i=0;
    char password[4];
    char comp[5] = {0, 1, 2, 3, 4};               // Pas utilisé pour le moment
    
    // Keypad module connections
    char  keypadPort at PORTD;
    // End Keypad module connections
    
    
    char txt1[] = "Code Bon";
    char txt2[] = "Erreur";
    
    // LCD module connections
    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;
    
    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    // End LCD module connections
    
    char indice;
    char *password ="1234";
    
    char compare(){
    
    	if(password[indice] == kp-49)
    	indice++;
    	else 
    		{
    		 Lcd_Cmd(_LCD_CLEAR);
    		 Lcd_Out(1,6,txt2);
    		}
    	if(indice == 4)
    		{
               indice=0;
               Lcd_Cmd(_LCD_CLEAR);
               Lcd_Out(1,6,txt1);
            }
     
          }
          
     
    
    void main() {                              // Reset counter
      Keypad_Init();                           // Initialize Keypad
      ANSEL  = 0;                              // Configure AN pins as digital I/O
      ANSELH = 0;
      Lcd_Init();                              // Initialize LCD
      Lcd_Cmd(_LCD_CLEAR);                     // Clear display
      Lcd_Cmd(_LCD_CURSOR_OFF);                // Cursor off
    
       kp = 0;                                // Reset key code variable
    
        // Wait for key to be pressed and released
     
    
       
    
        
    
    
          
       while (1)
    
         {
      
    	 kp = Keypad_Key_Click();  
    		    
         switch (kp) {
          case  1: kp = 49; break; // 1       
          case  2: kp = 50; break; // 2
          case  3: kp = 51; break; // 3
          case  4: kp = 65; break; // A
          case  5: kp = 52; break; // 4
          case  6: kp = 53; break; // 5
          case  7: kp = 54; break; // 6
          case  8: kp = 66; break; // B
          case  9: kp = 55; break; // 7
          case 10: kp = 56; break; // 8
          case 11: kp = 57; break; // 9
          case 12: kp = 67; break; // C
          case 13: kp = 42; break; // *
          case 14: kp = 48; break; // 0
          case 15: kp = 35; break; // #
          case 16: kp = 68; break; // D
    				}
    			if(kp)
    				{
    				password[i]=kp;
    				cnt++;           // On incremente cnt pour décaler de 1 vers la droite pour afficher le chiffre suivant
    				i++;  
    				Lcd_Chr(1, cnt, password[i]);
    				compare(); 
    			    
    		       }
      
        }
    }

  19. #18
    invitef86a6203

    Re : probleme de programme en C!!!

    Avec un OU c est plus logique !
    Non ?

    Et aussi vérifie ce qui sort de ta routine clavier !
    Si c'est un chiffre binaire, de l'ASCII ou autre ?

    Avec autre, tu pourrais avoir sur un octet ; colonne , rangée chacun sur 4 bits ...


    Code:
         if (password[1]==1 || password[2]==2 || password[3]==3 || password[4]==4){
          Lcd_Cmd(_LCD_CLEAR);
          Lcd_Out(1,6,txt1);
          }

  20. #19
    invite635643ae

    Re : probleme de programme en C!!!

    Le code que tu as écris n'est pas logique, dans la fonction compare(), ou est la boucle qui permet de parcourir l'indice 'indice' jusqu'à 4? il doit bien y avoir une comparaison entre ce qui est rentré au clavier et les tests, de plus ne faut il pas initialiser indice à 0 au départ. puis dans le if(kp) la condition ne pourra jamais être satisfaite; l'indice i sera toujours en retard de +1



    char *password ="1234";

    char compare(){

    if(password[indice] == kp-49)
    indice++;
    else
    {
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1,6,txt2);
    }
    if(indice == 4)
    {
    indice=0;
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1,6,txt1);
    }

    }




    }[/CODE][/QUOTE]

  21. #20
    invite635643ae

    Re : probleme de programme en C!!!

    Pourquoi un OU ? cela signifie que si password[1]==1 et que password[2] différent de 2, on rentre dans la condition or il faudrait que les 4 conditions soient vérifiés pour que l'on puisse effectuer les instructions dans l'accolade?


    Citation Envoyé par freepicbasic Voir le message
    Avec un OU c est plus logique !
    Non ?

    Et aussi vérifie ce qui sort de ta routine clavier !
    Si c'est un chiffre binaire, de l'ASCII ou autre ?

    Avec autre, tu pourrais avoir sur un octet ; colonne , rangée chacun sur 4 bits ...


    Code:
         if (password[1]==1 || password[2]==2 || password[3]==3 || password[4]==4){
          Lcd_Cmd(_LCD_CLEAR);
          Lcd_Out(1,6,txt1);
          }

  22. #21
    invite635643ae

    Re : probleme de programme en C!!!

    je pense que son problème vient du fait que le clavier sort un chiffre binaire ou ascii et que la comparaison a faussement lieu

  23. #22
    Biname

    Re : probleme de programme en C!!!

    Citation Envoyé par paolo123 Voir le message
    je pense que son problème vient du fait que le clavier sort un chiffre binaire ou ascii et que la comparaison a faussement lieu
    Là, les debuggers aident beaucoup

  24. #23
    spown

    Re : probleme de programme en C!!!

    On est dans un "while" l'incrémentation ce fait à chaque fois qu'on appelle compare() jusqu’au l’atteint du chiffre 4 dans l'indice qui est une variable globale.Pour if(kp), c'est vrai quand un bouton est pressé . C'Est deja verifier avec un pic et un clavier . Mais comme tu disais, peut être une mauvaise lecture de format qui empêche la validation du password. C'est pour ça, il est primordial de tester physiquement sur la plateforme.

  25. #24
    invitef86a6203

    Re : probleme de programme en C!!!

    Dans ton code pasword sert à quoi ?

    Parceque tu met "1234" comme si c était le mot à trouver.
    Puis tu enregistre ce que tu as lu dedans tantot en direct puis en comparant avec -49 c est donc toujours faux...
    Enfin tu envois erreur a chaque mauvaise saisie , facile à trouver le bon code LOL
    Il faut envoyer erreur après 4 daisies ou alors rien du tout dans ce cas il faut mémoriser les 4 chiffres saisie ou tester à la volée une bonne suite de 4.
    Quand tu fais une comparaison de dépassement utilsie plutôt > que == , car si la variable est dans les choux il t aura qu'un tour de faux sinon on pédale pendant longtemps...

  26. #25
    spown

    Re : probleme de programme en C!!!

    C'est vrai tu as raison freepicbasic, ça sera facile de trouver le code, puisqu'il affichera ça dés le 1er caractère erroné. Il faut juste mettre for() avec quelques modification dans compare(). Mais l'auteur n'est plus là, et ce genre de projet demande des tests réel afin de s'avancer.

  27. #26
    invite764d6438

    Re : probleme de programme en C!!!

    Bonsoir,

    j'ai essayé tous vos programmes, ca ne marche pas voir même pire, alors effectivement je ne sais pas quel type de valeur la routine clavier sort, comment tester si c'est du décimal du binaire ou autre?? je suis sur mikroc


    merci

  28. #27
    invite7dc03981

    Re : probleme de programme en C!!!

    Salut a tous,

    j'ai enfin résolu le probleme,

    le programme ci dessous marche parfaitement, en simulation et en pratique, je vais maintenant l'évoluer et l"améliorer


    Code:
    unsigned short kp, cnt=0;
    unsigned char i=0;
    unsigned char indice;
    char comp[4] = {49, 50, 51, 52};               // Pas utilisé pour le moment
    char password[4];
    // Keypad module connections
    char  keypadPort at PORTD;
    // End Keypad module connections
    
    
    char txt1[] = "Code Bon";
    char txt2[] = "Erreur";
    
    // LCD module connections
    sbit LCD_RS at RB4_bit;
    sbit LCD_EN at RB5_bit;
    sbit LCD_D4 at RB0_bit;
    sbit LCD_D5 at RB1_bit;
    sbit LCD_D6 at RB2_bit;
    sbit LCD_D7 at RB3_bit;
    
    sbit LCD_RS_Direction at TRISB4_bit;
    sbit LCD_EN_Direction at TRISB5_bit;
    sbit LCD_D4_Direction at TRISB0_bit;
    sbit LCD_D5_Direction at TRISB1_bit;
    sbit LCD_D6_Direction at TRISB2_bit;
    sbit LCD_D7_Direction at TRISB3_bit;
    // End LCD module connections
    
    
    
    
    char compare(){
    
         if (password[0]==comp[0] && password[1]==comp[1] && password[2]==comp[2] && password[3]==comp[3]){
          Lcd_Cmd(_LCD_CLEAR);
          Lcd_Out(1,6,txt1);
          }
         else {
         Lcd_Cmd(_LCD_CLEAR);
         Lcd_Out(1,6,txt2);
         }
          }
    
    
    char affiche(){
    
            unsigned char i;
            for(i=0; i<4; i++){
            cnt++;
            Lcd_Chr(2, cnt, password[i]);
            }
    
            }
    
    
    void main() {                              // Reset counter
      Keypad_Init();                           // Initialize Keypad
      ANSEL  = 0;                              // Configure AN pins as digital I/O
      ANSELH = 0;
      Lcd_Init();                              // Initialize LCD
      Lcd_Cmd(_LCD_CLEAR);                     // Clear display
      Lcd_Cmd(_LCD_CURSOR_OFF);                // Cursor off
      do {
       kp = 0;                                // Reset key code variable
    
        // Wait for key to be pressed and released
        do
    
          kp = Keypad_Key_Click();             // Store key code in kp variable
        while (!kp);
    
        switch (kp) {
          case  1: kp = 49; break; // 1
          case  2: kp = 50; break; // 2
          case  3: kp = 51; break; // 3
          case  4: kp = 65; break; // A
          case  5: kp = 52; break; // 4
          case  6: kp = 53; break; // 5
          case  7: kp = 54; break; // 6
          case  8: kp = 66; break; // B
          case  9: kp = 55; break; // 7
          case 10: kp = 56; break; // 8
          case 11: kp = 57; break; // 9
          case 12: kp = 67; break; // C
          case 13: kp = 42; break; // *
          case 14: kp = 48; break; // 0
          case 15: kp = 35; break; // #
          case 16: kp = 68; break; // D
    
        }
    
    
         if (kp != 0){         // A chaque appui sur une touche
              cnt++;
              password[i]=kp;
              Lcd_Chr(1, cnt, password[i]);
              i++;
              if (cnt==4) compare();
              }
    
    
      } while (1);
    }

  29. #28
    invite82295142

    Re : probleme de programme en C!!!

    Salut !
    j'ai le même projet à réaliser et je suis un peu bloquée !!!
    Et je voulais savoir est ce que le type du clavier utilisé sur ISIS influence les résultats comme tu a cité ? si oui qu'est ce que tu a fait ?

Discussions similaires

  1. Probleme Programme PROTON+
    Par invite9fa3de28 dans le forum Électronique
    Réponses: 10
    Dernier message: 12/11/2008, 21h22
  2. [Blanc] probleme de programme
    Par invite23853c45 dans le forum Dépannage
    Réponses: 3
    Dernier message: 20/05/2008, 18h17
  3. ada95, probleme programme
    Par inviteb7283ac9 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 15/04/2008, 17h31
  4. problème programme
    Par invitea301fcd6 dans le forum Logiciel - Software - Open Source
    Réponses: 20
    Dernier message: 22/07/2005, 18h54
  5. Problème de programme.
    Par invite8d09e4b8 dans le forum Électronique
    Réponses: 3
    Dernier message: 11/07/2005, 16h56
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...