Aide calculatrice problème

Bonjour,je cherche a crée une calculatrice mais je ne comprends pas comment décale les chiffres pour
faire par exemple(un appui sur 1 sa fait 1 deuxième appui sa fait 10 etc),
merci :slight_smile: :slight_smile:

Bonjour,

Tu commences par entree=0
A chaque appui sur une touche entree=10*entree+touche

merci je vais tester tout cela :slight_smile: :slight_smile:

Tu n'as pas décrit quel matériel tu utilises donc je faire fonctionner ma boule de cristal en éspérant qu'elle voit clair.
Tu devrais lire le message : Bienvenue sur le forum.

Une idée parmis d'autres :
Tu utilises des afficheurs 7 segments, les segments de chaque afficheur sont gérés par un registre à décalage.
Tu crée un tableau d'octets pour définir les 10 chiffres.
On dit afficheur 7 segment mais en fait il y en a 8 avec le point décimal donc un octet c'est parfait.
Avec un octet tu dispose d'un bit par segment (repérés a,d,c,..).
Ex (au pif)
uint8_t chiffres[9];

chiffres[0] = 0b11001101; // --> toujours au pif c'est pour la démonstration.
chiffres[1] = 0b00001111; // --> toujours au pif c'est pour la démonstration.

uintX_t c'est une méthode de déclaration pour forcer "la taille" sinon c'est le compilateur qui décide.
uint8_t = un entier non signé (u = unsigned) de 8 bits.
int16_t = un entier signé de 16 bits.

Sinon par défaut le compilateur GCC prend deux octets pour un entier.
Il y a aussi une autre méthode qui date d'avant l'introduction des intX_t : c'est d'utiliser un char ou un unsigned char qui en fait est un octet, mais même si cela fonctionne bien si on est un peu rigoureux un char c'est pour un character ou caractère en français.

0b11110000 = notation binaire, 0xAA c'est la notation hexadécimale et 5 c'est la notation décimale.

Suposons que tu veuille écrire 103.
Quand tu tape "1" , la variable chiffre[1] est chargé dans le registre à décalage de droite
quand tu tape "0" tu envoie dans la chaine des registres les variables chiffre[1] suivi de chiffre[0] : le 1 sera décalé d'un registre vers la gauche et le "0" prend la place du 1.
et ainsi de suite.

Bibliothèque pour envoyer un octet dans un registre à décalage : Shiftout()
https://www.arduino.cc/en/Reference/ShiftOut

en bleu = : recherche conseillée dans un moteur de recherche exemple "arduino registre à décalage"

Normalement tu devrais pouvoir te débrouiller.

merci cela fonctionne

Et si tu nous en disais plus.
C'est un site de partage ici, avec renvoi d'ascenseur : ta réalisation peut intéresser d'autres membres de ce forum.
Au moins indique les grandes lignes.
Merci pour les débutants.

Bon voila le code pas encore terminer mais bon :frowning: Prototype

//PS : le programme n'est pas encore finalisé ceci est conçue pour un uno //
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
//déclaration des boutons pour composer les chiffres//
int bouton0=A0;
int bouton1=A1;     
int bouton2=A2;
int bouton3=A3;
int bouton4=A4;
int bouton5=A5;
int bouton6=6;
int bouton7=7;
int bouton8=8;
int bouton9=9;
//déclaration des boutons pour le mode(addition,Multiplication,division,moins)//
int boutonmode=10;
//déclaration d'affectation pour le chiffre1 et chiffre2//
int boutonchiffre=13;
//déclaration des chiffres pour le calcule//
unsigned long chiffre1=0;
unsigned long chiffre2=0;
unsigned long resultat;
//déclaration des valeur bouton mode//
int mode=0;
//déclaration des valeur bouton chiffre//
int modechiffre=0;
//temps pour les appuies sur les boutons//
unsigned long temps;
void setup() {
lcd.begin(16,2);
pinMode(bouton0,INPUT);
pinMode(bouton1,INPUT);
pinMode(bouton2,INPUT);
pinMode(bouton3,INPUT);
pinMode(bouton4,INPUT);
pinMode(bouton5,INPUT);
pinMode(bouton6,INPUT);
pinMode(bouton7,INPUT);
pinMode(bouton8,INPUT);
pinMode(bouton9,INPUT);
pinMode(boutonmode,INPUT);
pinMode(boutonchiffre,INPUT); 
}

void loop() {
if(millis()-temps>250){
if(digitalRead(boutonchiffre)==1){
  modechiffre++;
}
//affectation du chiffre1//
switch (modechiffre){
case 0:
if(digitalRead(bouton0)==1){
  chiffre1=10*chiffre1+0;
}
if(digitalRead(bouton1)==1){
  chiffre1=10*chiffre1+1;
}
if(digitalRead(bouton2)==1){
  chiffre1=10*chiffre1+2;
}
if(digitalRead(bouton3)==1){
  chiffre1=10*chiffre1+3;
}
if(digitalRead(bouton4)==1){
  chiffre1=10*chiffre1+4;
}
if(digitalRead(bouton5)==1){
  chiffre1=10*chiffre1+5;
}
if(digitalRead(bouton6)==1){
  chiffre1=10*chiffre1+6;
}
if(digitalRead(bouton7)==1){
  chiffre1=10*chiffre1+7;
}
if(digitalRead(bouton8)==1){
  chiffre1=10*chiffre1+8;
}
if(digitalRead(bouton9)==1){
  chiffre1=10*chiffre1+9;
}
//affichage du chiffre sur le lcd//
if(chiffre1>=0&&chiffre1<=9){
  lcd.setCursor(15,0);
  lcd.print(chiffre1);
  lcd.setCursor(14,0);
  lcd.print("0");
  lcd.setCursor(13,0);
  lcd.print("0");
  lcd.setCursor(12,0);
  lcd.print("0");
  lcd.setCursor(11,0);
  lcd.print("0");
}
if(chiffre1>=10&&chiffre1<=99){
  lcd.setCursor(14,0);
  lcd.print(chiffre1);
}
if(chiffre1>=100&&chiffre1<=999){
  lcd.setCursor(13,0);
  lcd.print(chiffre1);
}
if(chiffre1>=1000&&chiffre1<=9999){
  lcd.setCursor(12,0);
  lcd.print(chiffre1);
}
if(chiffre1>=10000&&chiffre1<=99999){
  lcd.setCursor(11,0);
  lcd.print(chiffre1);
}
break;
//affectation du chiffre2//
case 1:
if(digitalRead(bouton0)==1){
  chiffre2=10*chiffre2+0;
}
if(digitalRead(bouton1)==1){
  chiffre2=10*chiffre2+1;
}
if(digitalRead(bouton2)==1){
  chiffre2=10*chiffre2+2;
}
if(digitalRead(bouton3)==1){
  chiffre2=10*chiffre2+3;
}
if(digitalRead(bouton4)==1){
  chiffre2=10*chiffre2+4;
}
if(digitalRead(bouton5)==1){
  chiffre2=10*chiffre2+5;
}
if(digitalRead(bouton6)==1){
  chiffre2=10*chiffre2+6;
}
if(digitalRead(bouton7)==1){
  chiffre2=10*chiffre2+7;
}
if(digitalRead(bouton8)==1){
  chiffre2=10*chiffre2+8;
}
if(digitalRead(bouton9)==1){
  chiffre2=10*chiffre2+9;
}
//affichage du chiffre2 sur le lcd//
if(chiffre2>=0&&chiffre2<=9){
  lcd.setCursor(15,0);
  lcd.print(chiffre2);
  lcd.setCursor(14,0);
  lcd.print("0");
  lcd.setCursor(13,0);
  lcd.print("0");
  lcd.setCursor(12,0);
  lcd.print("0");
  lcd.setCursor(11,0);
  lcd.print("0");
}
if(chiffre2>=10&&chiffre2<=99){
  lcd.setCursor(14,0);
  lcd.print(chiffre2);
}
if(chiffre2>=100&&chiffre2<=999){
  lcd.setCursor(13,0);
  lcd.print(chiffre2);
}
if(chiffre2>=1000&&chiffre2<=9999){
  lcd.setCursor(12,0);
  lcd.print(chiffre2);
}
if(chiffre2>=10000&&chiffre2<=99999){
  lcd.setCursor(11,0);
  lcd.print(chiffre2);
}
break;
}   
//remise a zero du mode chiffre//
if(modechiffre>=2){
  modechiffre=0;
}
if(digitalRead(boutonmode)==1){
  mode++;
}
//mode d'operation//
switch (mode){
  case 1:
  resultat=chiffre1+chiffre2;
break;
case 2:
resultat=chiffre1-chiffre2;
break;
case 3:
resultat=chiffre1*chiffre2;
break;
case 4:
resultat=chiffre1/chiffre2;
}
if(mode>=5){
  mode=0;
}
}
//affichage du résultat//
if(resultat>=0&&resultat<=9){
  lcd.setCursor(15,1);
  lcd.print(resultat);
  lcd.setCursor(14,1);
  lcd.print("0");
  lcd.setCursor(13,1);
  lcd.print("0");
  lcd.setCursor(12,1);
  lcd.print("0");
  lcd.setCursor(11,1);
  lcd.print("0");
}
if(resultat>=10&&resultat<=99){
  lcd.setCursor(14,1);
  lcd.print(resultat);
}
if(resultat>=100&&resultat<=999){
  lcd.setCursor(13,1);
  lcd.print(resultat);
}
if(resultat>=1000&&resultat<=9999){
  lcd.setCursor(12,1);
  lcd.print(resultat);
}
if(resultat>=10000&&resultat<=99999){
  lcd.setCursor(11,1);
  lcd.print(resultat);
}
if(chiffre1>=99999){
  chiffre1=0;
}
if(chiffre2>=99999){
  chiffre2=0;
}
}

Pour dire ces remplient de buggggg!!!!!! :confused:

voici la version 0.02 qui fonctionne un peu mieux (je me suis aperçue que de mettre une résistance de plus de 10kohm a un bouton donne des bugs!!!)

//PS : le programme n'est pas encore finalisé//
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
//déclaration des boutons pour composer les chiffres//
int bouton0=A0;
int bouton1=A1;     
int bouton2=A2;
int bouton3=A3;
int bouton4=A4;
int bouton5=A5;
int bouton6=6;
int bouton7=7;
int bouton8=8;
int bouton9=9;
//déclaration des boutons pour le mode(addition,Multiplication,division,moins)//
int boutonmode=10;
//déclaration d'affectation pour le chiffre1 et chiffre2//
int boutonchiffre=13;
//déclaration des chiffres pour le calcule//
long chiffre1=0;
long chiffre2=0;
long resultat;
//déclaration des valeur bouton mode//
int mode=0;
//déclaration des valeur bouton chiffre//
int modechiffre=0;
//temps pour les appuies sur les boutons//
unsigned long temps;
void setup() {
lcd.begin(16,2);
pinMode(bouton0,INPUT);
pinMode(bouton1,INPUT);
pinMode(bouton2,INPUT);
pinMode(bouton3,INPUT);
pinMode(bouton4,INPUT);
pinMode(bouton5,INPUT);
pinMode(bouton6,INPUT);
pinMode(bouton7,INPUT);
pinMode(bouton8,INPUT);
pinMode(bouton9,INPUT);
pinMode(boutonmode,INPUT);
pinMode(boutonchiffre,INPUT); 

}

void loop() {
if(millis()-temps>250){
temps=millis();

if(digitalRead(boutonchiffre)==1){
  modechiffre++;
}
//affectation du chiffre1//
if(modechiffre==0){
if(digitalRead(bouton0)==1){
  chiffre1=10*chiffre1+0;
}
if(digitalRead(bouton1)==1){
  chiffre1=10*chiffre1+1;
}
if(digitalRead(bouton2)==1){
  chiffre1=10*chiffre1+2;
}
if(digitalRead(bouton3)==1){
  chiffre1=10*chiffre1+3;
}
if(digitalRead(bouton4)==1){
  chiffre1=10*chiffre1+4;
}
if(digitalRead(bouton5)==1){
  chiffre1=10*chiffre1+5;
}
if(digitalRead(bouton6)==1){
  chiffre1=10*chiffre1+6;
}
if(digitalRead(bouton7)==1){
  chiffre1=10*chiffre1+7;
}
if(digitalRead(bouton8)==1){
  chiffre1=10*chiffre1+8;
}
if(digitalRead(bouton9)==1){
  chiffre1=10*chiffre1+9;
}
//affichage du chiffre sur le lcd//
if(chiffre1>=0&&chiffre1<=9){
  lcd.setCursor(15,0);
  lcd.print(chiffre1);
  lcd.setCursor(14,0);
  lcd.print("0");
  lcd.setCursor(13,0);
  lcd.print("0");
  lcd.setCursor(12,0);
  lcd.print("0");
  lcd.setCursor(11,0);
  lcd.print("0");
}
if(chiffre1>=10&&chiffre1<=99){
  lcd.setCursor(14,0);
  lcd.print(chiffre1);
}
if(chiffre1>=100&&chiffre1<=999){
  lcd.setCursor(13,0);
  lcd.print(chiffre1);
}
if(chiffre1>=1000&&chiffre1<=9999){
  lcd.setCursor(12,0);
  lcd.print(chiffre1);
}
if(chiffre1>=10000&&chiffre1<=99999){
  lcd.setCursor(11,0);
  lcd.print(chiffre1);
}
}
//affectation du chiffre2//
if(modechiffre==1){
if(digitalRead(bouton0)==1){
  chiffre2=10*chiffre2+0;
}
if(digitalRead(bouton1)==1){
  chiffre2=10*chiffre2+1;
}
if(digitalRead(bouton2)==1){
  chiffre2=10*chiffre2+2;
}
if(digitalRead(bouton3)==1){
  chiffre2=10*chiffre2+3;
}
if(digitalRead(bouton4)==1){
  chiffre2=10*chiffre2+4;
}
if(digitalRead(bouton5)==1){
  chiffre2=10*chiffre2+5;
}
if(digitalRead(bouton6)==1){
  chiffre2=10*chiffre2+6;
}
if(digitalRead(bouton7)==1){
  chiffre2=10*chiffre2+7;
}
if(digitalRead(bouton8)==1){
  chiffre2=10*chiffre2+8;
}
if(digitalRead(bouton9)==1){
  chiffre2=10*chiffre2+9;
}
//affichage du chiffre2 sur le lcd//
if(chiffre2>=0&&chiffre2<=9){
  lcd.setCursor(15,0);
  lcd.print(chiffre2);
  lcd.setCursor(14,0);
  lcd.print("0");
  lcd.setCursor(13,0);
  lcd.print("0");
  lcd.setCursor(12,0);
  lcd.print("0");
  lcd.setCursor(11,0);
  lcd.print("0");
}
if(chiffre2>=10&&chiffre2<=99){
  lcd.setCursor(14,0);
  lcd.print(chiffre2);
}
if(chiffre2>=100&&chiffre2<=999){
  lcd.setCursor(13,0);
  lcd.print(chiffre2);
}
if(chiffre2>=1000&&chiffre2<=9999){
  lcd.setCursor(12,0);
  lcd.print(chiffre2);
}
if(chiffre2>=10000&&chiffre2<=99999){
  lcd.setCursor(11,0);
  lcd.print(chiffre2);
}

}   
//remise a zero du mode chiffre//
if(modechiffre>=2){
  modechiffre=0;
}
if(digitalRead(boutonmode)==1){
  mode++;
}
//mode d'operation//
switch (mode){
  case 1:
  resultat=chiffre1+chiffre2;
lcd.setCursor(1,1);
lcd.print("+");
break;
case 2:
resultat=chiffre1-chiffre2;
lcd.setCursor(1,1);
lcd.print("-");
break;
case 3:
resultat=chiffre1*chiffre2;
lcd.setCursor(1,1);
lcd.print("*");
break;
case 4:
resultat=chiffre1/chiffre2;
lcd.setCursor(1,1);
lcd.print("/");
break;
}
if(mode>=5){
  mode=0;
}
}
//affichage du résultat//
if(resultat>=0&&resultat<=9){
  lcd.setCursor(15,1);
  lcd.print(resultat);
  lcd.setCursor(14,1);
  lcd.print("0");
  lcd.setCursor(13,1);
  lcd.print("0");
  lcd.setCursor(12,1);
  lcd.print("0");
  lcd.setCursor(11,1);
  lcd.print("0");
lcd.setCursor(10,1);
lcd.print("0");
}


if(resultat>=10&&resultat<=99){
  lcd.setCursor(14,1);
  lcd.print(resultat);
}
if(resultat>=100&&resultat<=999){
  lcd.setCursor(13,1);
  lcd.print(resultat);
}
if(resultat>=1000&&resultat<=9999){
  lcd.setCursor(12,1);
  lcd.print(resultat);
}
if(resultat>=10000&&resultat<=99999){
  lcd.setCursor(11,1);
  lcd.print(resultat);
}
if(resultat>=100000&&resultat<=999999){
  lcd.setCursor(10,1);
  lcd.print(resultat);
}
if(chiffre1>=9999){
  chiffre1=0;
}
if(chiffre2>=9999){
  chiffre2=0;
}

}

voila version 0.03 :slight_smile: bon ces vrai ces assez simple comme calculatrice mais il faut bien débuter par quelque chose

//PS : le programme n'est pas encore finalisé//
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
//déclaration des boutons pour composer les chiffres//
int bouton0=A0;
int bouton1=A1;     
int bouton2=A2;
int bouton3=A3;
int bouton4=A4;
int bouton5=A5;
int bouton6=6;
int bouton7=7;
int bouton8=8;
int bouton9=9;
//déclaration des boutons pour le mode(addition,Multiplication,division,moins)//
int boutonmode=10;
//déclaration d'affectation pour le chiffre1 et chiffre2//
int boutonchiffre=13;
//déclaration des chiffres pour le calcule//
long chiffre1=0;
long chiffre2=0;
long resultat;
//déclaration des valeur bouton mode//
int mode=0;
//déclaration des valeur bouton chiffre//
int modechiffre=0;
//temps pour les appuies sur les boutons//
unsigned long temps;
void setup() {
lcd.begin(16,2);
pinMode(bouton0,INPUT);
pinMode(bouton1,INPUT);
pinMode(bouton2,INPUT);
pinMode(bouton3,INPUT);
pinMode(bouton4,INPUT);
pinMode(bouton5,INPUT);
pinMode(bouton6,INPUT);
pinMode(bouton7,INPUT);
pinMode(bouton8,INPUT);
pinMode(bouton9,INPUT);
pinMode(boutonmode,INPUT);
pinMode(boutonchiffre,INPUT); 

}

void loop() {
if(millis()-temps>250){
temps=millis();

if(digitalRead(boutonchiffre)==1){
  modechiffre++;
}
//affectation du chiffre1//
if(modechiffre==0){
if(digitalRead(bouton0)==1){
  chiffre1=10*chiffre1+0;
}
if(digitalRead(bouton1)==1){
  chiffre1=10*chiffre1+1;
}
if(digitalRead(bouton2)==1){
  chiffre1=10*chiffre1+2;
}
if(digitalRead(bouton3)==1){
  chiffre1=10*chiffre1+3;
}
if(digitalRead(bouton4)==1){
  chiffre1=10*chiffre1+4;
}
if(digitalRead(bouton5)==1){
  chiffre1=10*chiffre1+5;
}
if(digitalRead(bouton6)==1){
  chiffre1=10*chiffre1+6;
}
if(digitalRead(bouton7)==1){
  chiffre1=10*chiffre1+7;
}
if(digitalRead(bouton8)==1){
  chiffre1=10*chiffre1+8;
}
if(digitalRead(bouton9)==1){
  chiffre1=10*chiffre1+9;
}
//affichage du chiffre sur le lcd//
if(chiffre1>=0&&chiffre1<=9){
  lcd.setCursor(15,0);
  lcd.print(chiffre1);
  lcd.setCursor(14,0);
  lcd.print("0");
  lcd.setCursor(13,0);
  lcd.print("0");
  lcd.setCursor(12,0);
  lcd.print("0");
  lcd.setCursor(11,0);
  lcd.print("0");
}
if(chiffre1>=10&&chiffre1<=99){
  lcd.setCursor(14,0);
  lcd.print(chiffre1);
}
if(chiffre1>=100&&chiffre1<=999){
  lcd.setCursor(13,0);
  lcd.print(chiffre1);
}
if(chiffre1>=1000&&chiffre1<=9999){
  lcd.setCursor(12,0);
  lcd.print(chiffre1);
}
if(chiffre1>=10000&&chiffre1<=99999){
  lcd.setCursor(11,0);
  lcd.print(chiffre1);
}
}
//affectation du chiffre2//
if(modechiffre==1){
if(digitalRead(bouton0)==1){
  chiffre2=10*chiffre2+0;
}
if(digitalRead(bouton1)==1){
  chiffre2=10*chiffre2+1;
}
if(digitalRead(bouton2)==1){
  chiffre2=10*chiffre2+2;
}
if(digitalRead(bouton3)==1){
  chiffre2=10*chiffre2+3;
}
if(digitalRead(bouton4)==1){
  chiffre2=10*chiffre2+4;
}
if(digitalRead(bouton5)==1){
  chiffre2=10*chiffre2+5;
}
if(digitalRead(bouton6)==1){
  chiffre2=10*chiffre2+6;
}
if(digitalRead(bouton7)==1){
  chiffre2=10*chiffre2+7;
}
if(digitalRead(bouton8)==1){
  chiffre2=10*chiffre2+8;
}
if(digitalRead(bouton9)==1){
  chiffre2=10*chiffre2+9;
}
//affichage du chiffre2 sur le lcd//
if(chiffre2>=0&&chiffre2<=9){
  lcd.setCursor(15,0);
  lcd.print(chiffre2);
  lcd.setCursor(14,0);
  lcd.print("0");
  lcd.setCursor(13,0);
  lcd.print("0");
  lcd.setCursor(12,0);
  lcd.print("0");
  lcd.setCursor(11,0);
  lcd.print("0");
}
if(chiffre2>=10&&chiffre2<=99){
  lcd.setCursor(14,0);
  lcd.print(chiffre2);
}
if(chiffre2>=100&&chiffre2<=999){
  lcd.setCursor(13,0);
  lcd.print(chiffre2);
}
if(chiffre2>=1000&&chiffre2<=9999){
  lcd.setCursor(12,0);
  lcd.print(chiffre2);
}
if(chiffre2>=10000&&chiffre2<=99999){
  lcd.setCursor(11,0);
  lcd.print(chiffre2);
}

}   
if(modechiffre==2){
  chiffre1=0;
  chiffre2=0;
}
//remise a zero du mode chiffre//
if(modechiffre>=3){
  modechiffre=0;
}
if(digitalRead(boutonmode)==1){
  mode++;
}
//mode d'operation//
switch (mode){
 case 0:
 lcd.setCursor(1,1);
lcd.print(" ");
break;
  case 1:
  resultat=chiffre1+chiffre2;
lcd.setCursor(1,1);
lcd.print("+");
break;
case 2:
resultat=chiffre1-chiffre2;
lcd.setCursor(1,1);
lcd.print("-");
break;
case 3:
resultat=chiffre1*chiffre2;
lcd.setCursor(1,1);
lcd.print("*");
break;
case 4:
resultat=chiffre1/chiffre2;
lcd.setCursor(1,1);
lcd.print("/");
break;
}
if(mode>=5){
  mode=0;
}
}
//affichage du résultat//
if(resultat>=0&&resultat<=9){
  lcd.setCursor(15,1);
  lcd.print(resultat);
  lcd.setCursor(14,1);
  lcd.print("0");
  lcd.setCursor(13,1);
  lcd.print("0");
  lcd.setCursor(12,1);
  lcd.print("0");
  lcd.setCursor(11,1);
  lcd.print("0");
lcd.setCursor(10,1);
lcd.print("0");
}


if(resultat>=10&&resultat<=99){
  lcd.setCursor(14,1);
  lcd.print(resultat);
}
if(resultat>=100&&resultat<=999){
  lcd.setCursor(13,1);
  lcd.print(resultat);
}
if(resultat>=1000&&resultat<=9999){
  lcd.setCursor(12,1);
  lcd.print(resultat);
}
if(resultat>=10000&&resultat<=99999){
  lcd.setCursor(11,1);
  lcd.print(resultat);
}
if(resultat>=100000&&resultat<=999999){
  lcd.setCursor(10,1);
  lcd.print(resultat);
}
if(chiffre1>=99999){
  chiffre1=0;
}
if(chiffre2>=99999){
  chiffre2=0;
}

}