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);
    }
  }
}