IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Affichage 7 segments avec clavierPS2


Sujet :

Arduino

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2022
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Affichage 7 segments avec clavierPS2
    Bonjour, j'ai crée un programme qui permet à l'aide d'un clavier de type PS2 d'afficher, et enregistré des chiffres sur mon afficheur 7 segments à l'aide d'un registre à décalage.
    Mais le problème est que le chiffre 1 et 4 ne s'affiche pas.
    Pourrais-je avoir de l'aide ?
    Registre à décalage : SN74HC595N
    Et j'utilise un arduino uno
    Et aussi je voudrais savoir comment je pourrais utilisé la touche contrôle de mon clavier.
    Merci d'avance .
    Voici le programme.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
     
     
    #include <PS2Keyboard.h>      // importation bibliotheque
    #include <EEPROM.h>
     
    #define DataPin 4    // pins de sortie pour registre à décalage
    #define WritePin 5
    #define ShiftPin 2
     
    const int data = 8;           // initialisation variable pour clavier
    const int pinClock = 3;
    PS2Keyboard keyboard;         // le clavier
    const int supprimer = 127;    // valeur ascii de la touche del
    bool valsave[8];       // tableau à enregistrer dans l' eeprom
     
    bool savetab;          // variable qui indique qu' on peut enregistrer
    bool savesup;          // variable qui indique qu'on peut supprimer tout l'eeprom à l'aide d'une combinaison
    int tour;   // nombre de fois que l'on appuie sur la touche tab
    bool demarrage;   // variable pour l'enregistrement au demarrage
    bool tabdemarrage[8];   // tableau pour l'enregistrement au demarrage
     
    int val;          // valeur pour fonction Affi7seg
    int S = 10;     // valeur correspondant à la ligne du tableau StAffi7 pour supprimer
    int F = 11;     // valeur correspondant à la ligne du tableau StAffi7 en cas d'erreur
    int PinIndex;   // variable pour fonction Affi7seg
     
    struct saveeeprom   // indique des valeurs à remplacer ou supprimer dans l'eeprom
    { int emplacement;
      bool donnee[8];
    };
     
    saveeeprom chiffre[27] // sert à la mise à jour de l'eeprom
    {
     
    };
     
    saveeeprom chiffrelue[27]   // sert à la lecture de l'eeprom
    {
     
    };
     
    struct StAffi7      // tableau structure pour la fonction Affi7seg
    { int Valeur;
      bool segment[8] ; //
    };
     
    StAffi7 ChiffreAffi7[12]
    {
      0, {1, 1, 1, 1, 1, 1, 0, 0},
      1, {0, 1, 1, 0, 0, 0, 0, 0},
      2, {1, 1, 0, 1, 1, 0, 1, 0},
      3, {1, 1, 1, 1, 0, 0, 1, 0},
      4, {0, 1, 1, 0, 0, 1, 1, 0},
      5, {1, 0, 1, 1, 0, 1, 1, 0},
      6, {1, 0, 1, 1, 1, 1, 1, 0},
      7, {1, 1, 1, 0, 0, 1, 0, 0},
      8, {1, 1, 1, 1, 1, 1, 1, 0},
      9, {1, 1, 1, 1, 0, 1, 1, 0},
      S, {0, 0, 0, 0, 0, 0, 0, 0},
      F, {1, 0, 0, 0, 1, 1, 1, 0},
    };
     
    void Affi7seg(int val) {    // fonction qui permet d'etablir la valeur des sorties en fonction des données sur le tableau
      for (PinIndex = 7; PinIndex >= 0; PinIndex--)
      {
        digitalWrite(DataPin, ChiffreAffi7[val - 48].segment[PinIndex]);
        digitalWrite(ShiftPin, HIGH);
        digitalWrite(ShiftPin, LOW);
      }
    }
     
    void afficher()
    {
      digitalWrite (WritePin, HIGH);   // afficher sur l'afficheur le chiffre
      digitalWrite (WritePin, LOW);
    }
     
    void tampon ( bool memo[8], int clavier)    // fonction tampon qui enregistre les valeurs des sorties pour chaque cycle
    {
      for (int index = 0; index <= 7; index ++)
      {
        memo[index] = ChiffreAffi7[clavier].segment[index];
      }
    }
     
    void setup() {
      delay(1000);    // mise en marche du clavier
      keyboard.begin(data, pinClock, PS2Keymap_French);
      Serial.begin(9600);
      Serial.println("----------------------------");
      Serial.println("Clavier pret pour la saisie");
      Serial.println("----------------------------\n");
     
      pinMode(DataPin, OUTPUT);   // donnee pour le registre
      pinMode(ShiftPin, OUTPUT);    // l'horloge du registre
      pinMode(WritePin, OUTPUT);    // activer les sorties du registre
     
      EEPROM.get (0, chiffrelue);   // mise à jour du programme pour savoir ce qu'il y a dans l'eeprom
     
      for (int Index = 0; Index < 27; Index ++)
      {
        for (int index = 0; index <= 7; index++)
        {
          chiffre[Index].donnee[index] = chiffrelue[Index].donnee[index];
        }
      }
      for (int Index2 = 7; Index2 >= 0; Index2--)  // afficher ce qu'il y avait avant
      {
        digitalWrite(DataPin, chiffrelue[26].donnee[Index2]);
        digitalWrite(ShiftPin, HIGH);
        digitalWrite(ShiftPin, LOW);
        tabdemarrage[Index2] = chiffre[26].donnee[Index2];
      }
      afficher();
      demarrage = true;
    }
     
    void loop() {
      if (keyboard.available()) {
        int entreeClavier = keyboard.read();
     
        switch (entreeClavier)
        {
     
          case 48: case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: // dans le cas ou on a un chiffre selon le code ascii
            Affi7seg(entreeClavier);    // envoie de la commande binaire pour l'affichage
            afficher();
            tampon (valsave, entreeClavier - 48);    // enregistrement dans la variable tampon
            demarrage = false;
            break;
     
          case (supprimer):    // dans le cas si la touche supprimer est pressé
     
            Affi7seg(S + 48);    //rien afficher sur l'afficheur
            afficher();
     
            tampon (valsave, S);   // enregistrement dans la variable tampon
            savesup = true;
            demarrage = false;
            break;
     
          case 9:    // dans le cas ou l'on a la touche d'enregistrement appuyé (tab)
            savetab = true;
     
            break;
     
     
          case 97: case 98: case 99: case 100: case 101: case 102: case 103: case 104: case 105: case 106: case 107: case 108: case 109: case 110:
          case 111: case 112: case 113: case 114: case 115: case 116: case 117: case 118: case 119: case 120: case 121: case 122: // dans le cas si on a une lettre de l'alphabet appuyée
     
            if (savetab)
            {
              for (int index = 0; index <= 7; index++)
              {
     
              }
            }
            else
            {
              demarrage = false;
            }
            EEPROM.get (0, chiffrelue);   // lire ce qui il y a d'enregistrer dans la touche et l'afficher
            for (int Index = 7; Index >= 0; Index--)
            {
              digitalWrite(DataPin, chiffrelue[entreeClavier - 97].donnee[Index]);
              digitalWrite(ShiftPin, HIGH);
              digitalWrite(ShiftPin, LOW);
            }
            afficher();
     
            for (int index = 0; index < 8; index ++)     // enregistrer pour afficher l'ancien chiffre lors de la mise en tension
            {
              chiffre[26].donnee[index] = chiffrelue[entreeClavier - 97].donnee[index];
            }
            EEPROM.put(0, chiffre);
            break;
     
          default:    // dans le cas si la touche ne correspond à rien
     
            Affi7seg(F + 48);
            afficher();
     
            tampon (valsave, F);
            demarrage = false;
            break;
        }
     
        if (entreeClavier != 9 and savetab and not 0 <= entreeClavier <= 47 and not 58 <= entreeClavier <= 96 and not 123 <= entreeClavier <= 126)  // dans le cas ou l'on veut enregistrer
        {
          if (demarrage)    // enregistre apres avoir redemmarer
          {
            for (int index = 0; index < 8; index ++)
            {
              chiffre[entreeClavier - 97].donnee[index] = tabdemarrage[index];    //enregistrer la première valeur afficher lors du demarrage
            }
            EEPROM.put(0, chiffre);
            demarrage = false;
            savetab = false;
            tour = 0;
          }
          else if (entreeClavier != supprimer)   // enregistrer dans une des touches qui correspondent à une lettre de l'alphabet
          {
            for (int index = 0; index <= 7; index ++)
            {
              chiffre[entreeClavier - 97].donnee[index] = valsave[index];
              chiffre[26].donnee[index] = valsave[index];   // enregistrer pour afficher l'ancien chiffre lors de la mise en tension
            }
            EEPROM.put(0, chiffre);    // on enregistre sur une des lettres de l'alphabet
            savetab = false;
            tour = 0;
          }
     
          else if (supprimer)   // on supprime tout les enregistrements
          {
            savetab = false;
            savesup = false;
            tour = 0;
            for (int Index = 0; Index < 26; Index ++)
            {
              for (int index = 7 ; index >= 0; index --)
              {
                chiffre[Index].donnee[index] = 0;
                chiffre[26].donnee[index] = 0;   // enregistrer pour afficher l'ancien chiffre lors de la mise en tension
              }
            }
            EEPROM.put(0, chiffre);
          }
        }
     
        if (entreeClavier == 9)
        {
          tour ++;
        }
     
        if (tour == 2)    // si touche tab appuyer 2 fois d'affiler arreter l'enregistrement
        {
          savetab = false;
          tour = 0;
        }
        if (not (entreeClavier >= 97 and entreeClavier <= 122))
        {
          for (int Index = 7; Index >= 0; Index --)    // enregistrer pour afficher l'ancien chiffre lors de la mise en tension
          {
            chiffre[26].donnee[Index] = valsave[Index];
          }
          EEPROM.put(0, chiffre);
        }
      }
    }

  2. #2
    Membre chevronné

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : mai 2013
    Messages : 743
    Points : 2 189
    Points
    2 189
    Par défaut
    Bonjour,

    Il faut revoir les tests.

    Comme la plupart des expressions ont une valeur, il y a des formes qui passent à la compilation sans correspondre à quelque chose de simple.

    Par exemple : 10 < x <40 ne retournera pas vrai ssi x est entre 10 et 40. Il sera interprété comme (10 < x) < 40. Si x vaut 8 par exemple, 10 < x est faux et vaut donc 0, mais comme 0 < 40 la condition sera satisfaite.

    Ajouter des not là dessus ne va pas améliorer les choses.

    Faire un test sur un constante ne sert à rien (if (supprimer) ).

    Mettre dans une structure un premier élément (Valeur) qui n'est autre que l'indice du tableau ne sert à rien (du reste ce champ n'est pas utilisé).

    Il aurait été plus judicieux de mettre les 8 bit d'un chiffre dans des bytes.

    Utilisez des indices ne se différenciant que par la casse d'une lettre me paraît assez suicidaire.

    Les ribambelles de case n'augmentent pas la lisibilité. Bien sûr la plupart des compilateurs les transformeront en tests de plages (x >= xmin && x <= xmax) mais c'est toujours gênant - et parfois risqué - de justifier une mauvaise écriture par l'intelligence supposée du compilateur. Par ailleurs un test de plage est lisible tandis qu'une liste doit être vérifiée pour s'assurer qu'il n'y a pas de trous.

    Je n'ai pas regardé le programme plus avant mais il me paraît inespéré qu'il n'y ait que les 2 problèmes signalés.

    En résumé, revoir le langage
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2022
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Donc pour résoudre mon problème il serait plus judicieux si je comprend bien pour l'exemple de 10<x<40 de mettre un and comme if (10<x and x<40).

    Pour le test avec la constante (if(supprimer)) serait t'il mieux de mettre juste un else ?

    Pour la structure vaut mieux enlever l'élément (Valeur) et juste se fier à l'indices et sa marchera si je comprend bien.

    Quand vous me dites de qu'il serait plus judicieux de mettre les 8 bits d'un chiffre dans des bytes pouvez vous me donnez donnez un exemple car je suis débutant, merci.

    Que voulez-vous dire par "Utilisez des indices ne se différenciant que par la casse d'une lettre me paraît assez suicidaire."

    Et pour les ribambelles de case vaut mieux donc que je fasse des plages comme (x >= xmin && x <= xmax).

  4. #4
    Membre expert

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    2 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : septembre 2019
    Messages : 2 071
    Points : 3 895
    Points
    3 895
    Par défaut
    Citation Envoyé par Cafélotus369 Voir le message
    Que voulez-vous dire par "Utilisez des indices ne se différenciant que par la casse d'une lettre me paraît assez suicidaire."
    je pense qu'il faisait référence à cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      for (int Index = 0; Index < 27; Index ++)
      {
        for (int index = 0; index <= 7; index++)
        {
          chiffre[Index].donnee[index] = chiffrelue[Index].donnee[index];
        }
      }
    ce sera assez facile de se tromper d'index

  5. #5
    Membre chevronné

    Homme Profil pro
    Directeur de projet
    Inscrit en
    mai 2013
    Messages
    743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : mai 2013
    Messages : 743
    Points : 2 189
    Points
    2 189
    Par défaut
    Bonjour,
    • if (10<x and x<40) ou if(x>0 && x<40)
    • Oui else suffit puisque le if est toujours vrai.
    • de 0 à 9 pour les chiffres et comme par hasard 10 et 11 pour les autres signes, c'est donc simplement l'indice. Quand on crée un élément dont on ne se sert pas, c'est qu'on peut le supprimer.
      Code ino : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      byte Digits[12] {
         0xFC, /* 1111 1100 */   0x60, /* 0110 0000 */   0xDA, /* 1101 1010 */   0xF2, /* 1111 0010 */
         0x66, /* 0110 0110 */   0xB6, /* 1011 0110 */   0xBE, /* 1011 1110 */   0xE4, /* 1110 0100 */
         0xFE, /* 1111 1110 */   0xF6, /* 1111 0110 */   0x00, /* 0000 0000 */   0x8E, /* 1000 1110 */
      }
       
      void ShowDigit(char c) {
         if(c < '0' || c > 59) return;                 // 59-48 = 11 = ';'-'0'
         byte m = Digits[c - '0'];
         for(int i = 7; i>= 0; --i) { 
            digitalWrite(DataPin, m & 1);              // HIGH si le bit de poids faible est à 1
            digitalWrite(ShiftPin, HIGH);              // Horloge front montant
            digitalWrite(ShiftPin, LOW);               // Horloge front descendant
            m >>= 1;                                   // Décalage à droite : prochain bit
         }
      }
    • C'est un problème de lisibilité. Quand on utilise Indice et indice très proches l'un de l'autre, il est aisé de se tromper. Il sera beaucoup moins aisé de trouver la source de l'erreur.
    • Là aussi, la multiplication des cases n'est pas un problème de légitimité mais de lisibilité. Par exemple, il n'est pas immédiat qu'il y a les 26 cases qui couvrent sans trou de 97 à 122.
      Code ino : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      void loop() {
         if(!keyboard.available()) {
            delay(80);
            return;
         }
         char C_in = char(keyboard.read() & 0xFF);     // les char sont en général des entiers signés
         bool isDigit = false, isAlpha = false, isUp127 = C_in < 0;
         if(C_in >= '0' && C_in <= '9') {
            isDigit = true;
            // ...
         } else if(C_in >= 'a' && C_in <= 'z') {
            isAlpha = true;
            // ...
         } else switch(C_in) {
            case supprimer :       // DEL == 127
               // ...
               break;
            case 9 :               // TAB
               // ...
               break;
            default:
               // ...
         }   
       
         if(savetab && C_in != 9 && (isAlpha || isDigit || isUp127)) { // A vérifier pour isUp127
            // ...
         }
         // ...
      }


    Il y a des questions en suspend dont :
    • quid des majuscules ?
    • qui des caractère au delà de 127 ? (en fait < 0 avec de char équivalents à des int8_t)
    • pourquoi on sauvegarde comme si ce n'était que des lettres ?
    • il est peu vraisemblable que EEPROM.put(0, chiffre); fasse ce qui semble être espéré (sauvegarde de bloc ?)

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

Discussions similaires

  1. Affichage caractères asiatique avec composants standard
    Par FransTreb dans le forum Composants VCL
    Réponses: 5
    Dernier message: 05/12/2005, 17h20
  2. PB affichage d'image avec IE
    Par arturo dans le forum Modules
    Réponses: 6
    Dernier message: 25/09/2003, 17h28
  3. PB : affichage de données avec accent sous delphi 6
    Par kinda dans le forum Débuter
    Réponses: 3
    Dernier message: 03/07/2003, 13h19
  4. Problème de déclaration de segment avec use32
    Par le mage tophinus dans le forum Assembleur
    Réponses: 2
    Dernier message: 10/01/2003, 10h17
  5. [VB6] Affichage d'image avec qlq contraintes
    Par youri dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo