crono de 0 à 59min 59sec

Bonjour à tous,
je suis assez novice en la matière et j'ai commencé par m'attaquer à un affichage LCD(IC2) que je ne suis toujours pas arrivé à lui faire afficher quoi que ce soit.
Suite à ma déception je me sui attaqué à mon affichage de 4 digits a 7 segments avec anodes communes.
j'ai voulu réaliser l'affichage d'un crono allant de 0 seconde à 59min 59sec avec la meilleures précision possible.
je vous avoue que j'y ai passer quelques heures lol. mais voilà le résultat.
Ma question est, s'il y en a parmi vous qui on le temps d'analyser mon code, y a t'il un moyen encore plus simple d'y arriver?
Merci d'avance et bonne journée

#define c1 10  // anode Commun 1 premier digit depuis la droite
#define c2 11  // anode Commun 2
#define c3 12  // anode Commun 3
#define c4 13  // anode Commun 3
#define led1 2  // segment a
#define led2 3  // segment b
#define led3 4  // segment c
#define led4 5  // segment d
#define led5 6  // segment e
#define led6 7  // segment f
#define led7 8  // segment g
#define led8 9  // segment point

int digits[10][7] =
{ { 0, 0, 0, 0, 0, 0, 1 },   // = 0
  { 1, 0, 0, 1, 1, 1, 1 },   // = 1
  { 0, 0, 1, 0, 0, 1, 0 },   // = 2
  { 0, 0, 0, 0, 1, 1, 0 },   // = 3
  { 1, 0, 0, 1, 1, 0, 0 },   // = 4
  { 0, 1, 0, 0, 1, 0, 0 },   // = 5
  { 0, 1, 0, 0, 0, 0, 0 },   // = 6
  { 0, 0, 0, 1, 1, 1, 1 },   // = 7
  { 0, 0, 0, 0, 0, 0, 0 },   // = 8
  { 0, 0, 0, 0, 1, 0, 0 }    // = 9
};

unsigned long duree;  // controle des secondes
unsigned long durees; // controle des minutes

// d est le digit a afficher: 0..9
void digit(int d) // d canche avec éa fonction Affiche
{
  digitalWrite(led1, digits[d][0]);
  digitalWrite(led2, digits[d][1]);
  digitalWrite(led3, digits[d][2]);
  digitalWrite(led4, digits[d][3]);
  digitalWrite(led5, digits[d][4]);
  digitalWrite(led6, digits[d][5]);
  digitalWrite(led7, digits[d][6]);
}

// fonction qui affiche les quatre digits en alternance entre les unités et les decimal
void Affiche(int dec, int unit, int minute, int dminute) 
{
  digit(unit); // Affiche les secondes
  digitalWrite(led8, HIGH);
  digitalWrite(c1, HIGH);
  delay(5);
  digitalWrite(c1, LOW);
  digit(dec); // Affiche les dizaines de seconde
  digitalWrite(c2, HIGH);
  delay(5);
  digitalWrite(c2, LOW);
  digit(minute); // Affiche les minutes
  digitalWrite(led8, LOW); //alume le point séparation min sec
  digitalWrite(c3, HIGH);
  delay (5);
  digitalWrite(led8, HIGH);
 digitalWrite(c3, LOW);
 digit(dminute); // affiche les dizaine de minute
  digitalWrite(c4, HIGH);
  delay (5);
 digitalWrite(c4, LOW);
}

void setup() // ouvre les ports en output
{
      Serial.begin(9600); 
  int i=2;
  for(i=2;i<14;i++)
  {
   pinMode(i,OUTPUT);
   digitalWrite(i,LOW);
      
  } 
}
void loop() {
int a=0;
int b=0;
int c=0;
int e=0;
for(e=0;e<6;e++) // incrément des dizaines de minute
{
   for(c=0;c<10;c++) // incrément des minutes
   {
 durees = millis();

    for(b=0;b<6;b++) // incrément des dizaines de seconde
    {
         for(a=0;a<10;a++)   // incrément secondes
         {  duree = millis();
         delayMicroseconds(6880);
         while ( (millis() - duree) < 990)
         Affiche(b, a, c, e);  // affichage pendans une seconde.
    //    Serial.println (millis()-duree); pour controler que 1 sec. dure 1000msec
         } // Fin incrément secondes
         
     } // Fin icrément dizaines de seconde
//Serial.println (millis()-durees);  pour ajuster durée de la minute 
while ( (millis() - durees) < 59900) 
Affiche(b-1, a-1, c, e);  // affichage avec rattrapage du temps.
     delay(9);
//Serial.println (millis()-durees); // controle que 1min dure 60000 msec
    } // Fin incrément minutes
    
} // Fin icrément dizaines de minute
}// Fin de boucle

tien voila un lien pour t'aider a structurer ton code...

http://www.fred-j.org/?p=362

Par que

int a=0;
int b=0;
int c=0;
int e=0;

désolé mais c'est imbuvable... c'est quoi a, b, c ect...
essaye de renommer tes variables, pour pouvoir bien comprendre...

Salut hazerty565,
Toutes mes excuses pour mon ignorance en programmation,
a, b, c, e, ne serve que pour incrémenter avec for(a=0;a<10;a++) // incrément secondes et ainsi de suite avec for(b=0;b<6;b++) // incrément des dizaines de seconde, for(c=0;c<10;c++) // incrément des minutes et enfin for(e=0;e<6;e++) // incrément des dizaines de minute.

comment aurais-tu nommé ce genre de variable?

merci quand même pour ta remrque

int millieme;
int centaine;
int dizaine;
int unite;
int seconde;
int minutes;

Enfin tu les nommes comme tu veux, mais faut etre logique...

Bonsoir à tous,
Voilà, après quelques recherche j'ai fait une deuxième version de mon afficheur de 0 à 59min 59 seconde
sur 4 digits de 7 segments.
Si cela peut servir j'en à quelqu'un serais ravis. Pour trouver la valeur à afficher je me suis remis aux math et j'ai utilisé la fonction mathematique "modulo"
J'ai aussi essayé de tenir compte de la remarque de hazerty565 en utilisant des variables explicites et en mettant le plus de commentaire possible.

Merci pour l'aide que l'on peut trouver sur le forum et tout commentaire sur mon code est apprécié car c'est comme cela que l'on progresse.

 #define c1 10  // anode Commun 1 premier digit depuis la droite
#define c2 11  // anode Commun 2
#define c3 12  // anode Commun 3
#define c4 13  // anode Commun 3
#define led1 2  // segment a
#define led2 3  // segment b
#define led3 4  // segment c
#define led4 5  // segment d
#define led5 6  // segment e
#define led6 7  // segment f
#define led7 8  // segment g
#define led8 9  // segment point

int digits[10][7] = //tableau des chiffres de 0 à 9 des segments à allumer
//si cathod commun inverser la valeur des segments
{ { 0, 0, 0, 0, 0, 0, 1 },   // = 0
  { 1, 0, 0, 1, 1, 1, 1 },   // = 1
  { 0, 0, 1, 0, 0, 1, 0 },   // = 2
  { 0, 0, 0, 0, 1, 1, 0 },   // = 3
  { 1, 0, 0, 1, 1, 0, 0 },   // = 4
  { 0, 1, 0, 0, 1, 0, 0 },   // = 5
  { 0, 1, 0, 0, 0, 0, 0 },   // = 6
  { 0, 0, 0, 1, 1, 1, 1 },   // = 7
  { 0, 0, 0, 0, 0, 0, 0 },   // = 8
  { 0, 0, 0, 0, 1, 0, 0 }    // = 9
};

// d est le digit a afficher: 0..9
void digit(int d) //  la valeur d change avec la fonction Affiche
{
  digitalWrite(led1, digits[d][0]);
  digitalWrite(led2, digits[d][1]);
  digitalWrite(led3, digits[d][2]);
  digitalWrite(led4, digits[d][3]);
  digitalWrite(led5, digits[d][4]);
  digitalWrite(led6, digits[d][5]);
  digitalWrite(led7, digits[d][6]);
}

// fonction qui affiche les quatre digits en alternance entre les unités et les decimal
void Affiche(int dec, int unit, int minute, int dminute) 
{
 digit(unit); // Affiche les secondes
  digitalWrite(led8, HIGH);
  digitalWrite(c1, HIGH);
  delay(5);
 
 digitalWrite(c1, LOW);
  digit(dec); // Affiche les dizaines de seconde
  digitalWrite(c2, HIGH);
  delay(5);
  digitalWrite(c2, LOW);

 digit(minute); // Affiche les minutes
  digitalWrite(led8, LOW); //alume le point séparation min sec
  digitalWrite(c3, HIGH);
  delay (5);
  digitalWrite(led8, HIGH);
  digitalWrite(c3, LOW);

digit(dminute); // affiche les dizaine de minute
  digitalWrite(c4, HIGH);
  delay (5);
  digitalWrite(c4, LOW);
}
unsigned long duree;  // controle des secondes
unsigned long durees; // controle de la durée du cicle de 60min. 

void setup() {

Serial.begin(9600); 
int i=2;
  for(i=2;i<14;i++)
  {
   pinMode(i,OUTPUT); //assigne les sorties
   digitalWrite(i,LOW);
  }
}

void loop() {

int temp=0;
 durees=millis(); 
    for(temp=0;temp<3600;temp++)   // incrément secondes
{
     
duree=millis();
int secs=temp%60; //calcul le soldes des secondes de la valeur "temp"
int mins=temp/60; //calcul les minutes de la valeur "temp"
int secunit=secs%10;     // calcul unités de seconde
int secdiz=(secs/10)%10; // calcul dizaines de seconde
int minunit=mins%10;     // calcul unités de minute
int mindiz=(mins/10)%10; // calcul dizaines de minute
while ( (millis() - duree) < 991) // durée de la seconde
Affiche(secunit,secdiz, minunit, mindiz);  // affichage pendans une seconde.
delayMicroseconds(6960); //ajustement de la durée de la seconde

}
Serial.println (millis()-durees); //affiche le temps réel après 60min.
}