Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

[résolu]Keypad 4x4
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#21 Message par venom » dim. 28 avr. 2019 16:03 lien vers la Data-Sheet : Cliquez ici

Bon j'ai un peut regarder, comme le dit temps-x le -48 fonctionne que sur 1 seul chiffre. Comment je peux récupérer une suite de touche ??
Car la dans mon code ci-dessus kp renvoie la valeur ascii et le souci c'est que kp renvoie uniquement le dernier chiffre taper (normal) c'est la que je coince.

j'ai ajouter sa au code :

Code : Tout sélectionner

longToStr(kp-48,Resultat1);
    
I2C_LCD_Out(2,1,Resultat1); 


A chaque touche taper, j'ai bien le bon chiffre sauf +-*/ Mais 1 seul :mur: J'ai mal a la tête.






@++
Mon site web
Mon discord : venom#4888

[résolu]Keypad 4x4
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#22 Message par Jérémy » dim. 28 avr. 2019 16:16 lien vers la Data-Sheet : Cliquez ici

Yop c'est même un peu plus complexe que ça ! car imaginons que je souhaite entrer "1234" . Le premier chiffre taper sera les milliers puis les centaines les dizaines et enfin les unités.

Je te propose de faire un traitement après avoir valider la valeur rentrer par un signe . en fait les signes "+-*/" seront en quelques sorte un terminateur de ta chaine de chiffre .
Il faut donc tu stockes dans un tableau tes chiffres

Je te propose ceci :
Le premier sera le "1" . qui sera stocké dans ton tableau à l'emplacement Tableau[i], "i" étant un index qu'on va incrémenter en commençant par 0
- On incrémente i donc i vaut maintenant 1
Ensuite le "2" qui sera stocker à l'emplacement Tableau[i] etc ....

Quand on détecte un signe "+-*/" , le tableau est donc remplis. la valeur de i-1 nous donne le nombre de chiffres qui ont été rentrés. et donc on va pouvoir les multiplié par 10, 100, 1000 , 10000 ..... suivant la valeur de i.
ensuite on additionne tous ces chiffres et on obtiens notre valeur finale !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

[résolu]Keypad 4x4
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#23 Message par Gérard » dim. 28 avr. 2019 16:28 lien vers la Data-Sheet : Cliquez ici

Achtung Jérémy, c'est I + 1 qui sera le nombre total de chiffres entrés dans le tableau. Dans ton exemple (1234), en commençant par 0, on arrive à l'index 3 pour le 4e chiffre.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

[résolu]Keypad 4x4
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#24 Message par Jérémy » dim. 28 avr. 2019 16:58 lien vers la Data-Sheet : Cliquez ici

Bien vu Gérard , je suis allé un peu trop vite . :sifflotte:
C'est en faisant des erreurs, que l'on apprend le mieux !!!

[résolu]Keypad 4x4
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#25 Message par Temps-x » lun. 29 avr. 2019 20:34 lien vers la Data-Sheet : Cliquez ici

Bonjour venom, Jérémy, et tout le forum,

Alors tu t'en sors venom, :sifflotte:

Le signe * correspond au numéro 42
Le signe + correspond au numéro 43
Le signe - correspond au numéro 45
Le signe / correspond au numéro 47

Pour bien comprendre ton problème, il faut étudier la machine à calculer chinoise(le boulier), et ouais encore euh.......

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

[résolu]Keypad 4x4
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#26 Message par venom » mar. 30 avr. 2019 00:19 lien vers la Data-Sheet : Cliquez ici

Non,
J'ai mal a la tête.(je vais surement faire une petite pose a ce sujet, repartir avec un esprit saint) puis ta vidéo viens de me finir les quelques neurones qu'ils me restaient. :? :wink:
Je dois approfondir mes connaissances avec ce qui concerne les tableaux, les conversions etc... Le problème, c'est que j’exécute trop comme en programmation informatique, mais tout ne se passent pas de la même façon que sur un ordi en électronique :sifflotte: :-D

Au dodo pour aujourd’hui... Image
Merci de vous souciez de ma santé :bravo:






@++
Mon site web
Mon discord : venom#4888

[résolu]Keypad 4x4
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#27 Message par Temps-x » mar. 30 avr. 2019 00:48 lien vers la Data-Sheet : Cliquez ici

Bonsoir venom,

Je crois que beaucoup de personne sur ce forum pourrais faire ce que tu demandes, mais ça t'aiderais pas, comme le dit le
proverbe chinois,

Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours. :wink:

Reste juste à espérer qu'il aime le poisson. :sifflotte:

Repose toi bien, et revient nous en pleine forme.

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

[résolu]Keypad 4x4
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#28 Message par venom » mar. 30 avr. 2019 09:18 lien vers la Data-Sheet : Cliquez ici

Salut Temps-X,

Entièrement d'accord avec toi. C'est d'ailleurs pour ça que je n'ai pas dit "auriez vous un code de calculatrice tout fait s'il vous plaît ?" :langue:

Mais la le boulier a 0h00 trop fort pour moi pu assez frais humour!!







@++
Mon site web
Mon discord : venom#4888

[résolu]Keypad 4x4
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#29 Message par venom » jeu. 2 mai 2019 10:24 lien vers la Data-Sheet : Cliquez ici

Bonjour a tous,

Bon ça avance :-) J'ai mis une led pour avoir un visuel plus parlant. D’après ma led, je suis capable maintenant de savoir quel touche est appuyer notamment +-*/= Et quand je fait égale, je sais dire si l’opération est un addition, soustraction, multiplication ou division. C'est déjà sa :-D
Aller j'y retourne...






@++
Mon site web
Mon discord : venom#4888

[résolu]Keypad 4x4
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#30 Message par venom » jeu. 2 mai 2019 11:48 lien vers la Data-Sheet : Cliquez ici

Bon voici mon code actuel :

Pensez vous que je pars sur la bonne piste pour essayé de récupérer les valeurs pour ensuite les additionnées ? Ça se situe au niveau des lignes 228 - 234 dans la procedure Resultat_Calcul()
Est-ce que Premiere_Valeur et Deuxieme_Valeur on bien les bonnes valeurs ?

Code : Tout sélectionner

///////////////////////////////
//    name : CALCULATERICE   //
//    create : venom         //
//    date : 23/04/2019      //
//    pic : 16f887 4MHz      //
///////////////////////////////





// LCD Definitions
#define _LCD_CLEAR              0x01        //vide l'ecran
#define _LCD_CURSOR_OFF         0x0C        //cache le curseur
#define _LCD_UNDERLINE_ON       0x0E        //Underline cursor on


// I2C adresse
#define LCD_ADDR 0x7E                       // adresse du PCF8574A = 0x7E. adresse du PCF8574 = 0x4E


// initialisation des varialbes etc...
unsigned short kp = 0;


char code1[15];
int i = 0;

int Type_Operation = 0;

int Longeur_Premiere_Valeur = 0;
int Longeur_Deuxieme_Valeur = 0;

int Premiere_Valeur = 0;
int Deuxieme_Valeur = 0;

int Longeur_Operation = 0;

int j = 0;
int k = 0;
int l = 0;



// Keypad module connections
char  keypadPort at PORTD;


// textes constants
char txt1[] = "CALCULATRICE";
char txt2[] = "BY VENOM";
char txt3[] = "ENTREZ VOTRE";
char txt4[] = "OPERATION";
char txt5[] = "ERREUR";


// procedure I2C_LCD_Cmd By paulfjujo
void I2C_LCD_Cmd(char out_char) {

    char hi_n, lo_n;
    char rs = 0x00;

    hi_n = out_char & 0xF0;
    lo_n = (out_char << 4) & 0xF0;

    I2C1_Start();
    I2C1_Is_Idle();
    I2C1_Wr(LCD_ADDR);
    I2C1_Is_Idle();
    I2C1_Wr(hi_n | rs | 0x04 | 0x08);
    I2C1_Is_Idle();
    Delay_us(50);
    I2C1_Wr(hi_n | rs | 0x00 | 0x08);
    I2C1_Is_Idle();
    Delay_us(100);
    I2C1_Wr(lo_n | rs | 0x04 | 0x08);
    I2C1_Is_Idle();
    Delay_us(50);
    I2C1_Wr(lo_n | rs | 0x00 | 0x08);
    I2C1_Is_Idle();
    I2C1_stop();

    if(out_char == 0x01)Delay_ms(2);
}


// procedure I2C_LCD_Chr By paulfjujo
void I2C_LCD_Chr(char row, char column, char out_char) {

    char hi_n, lo_n;
    char rs = 0x01;

    switch(row){

        case 1:
        I2C_LCD_Cmd(0x80 + (column - 1));
       break;
        case 2:
        I2C_LCD_Cmd(0xC0 + (column - 1));
        break;
    };

    hi_n = out_char & 0xF0;
    lo_n = (out_char << 4) & 0xF0;

    I2C1_Start();
    I2C1_Is_Idle();
    I2C1_Wr(LCD_ADDR);
    I2C1_Is_Idle();
    I2C1_Wr(hi_n | rs | 0x04 | 0x08);
    I2C1_Is_Idle();
    Delay_us(50);
    I2C1_Wr(hi_n | rs | 0x00 | 0x08);
    I2C1_Is_Idle();
    Delay_us(100);
    I2C1_Wr(lo_n | rs | 0x04 | 0x08);
    I2C1_Is_Idle();
    Delay_us(50);
    I2C1_Wr(lo_n | rs | 0x00 | 0x08);
    I2C1_Is_Idle();
    I2C1_stop();
}


// procedure I2C_LCD_Init By paulfjujo
void I2C_LCD_Init() {

    char rs = 0x00;

    Delay_ms(100);                          // laisser le temps au LCD de s'alimenter correctement

    I2C1_Start();
    I2C1_Is_Idle();
    I2C1_Wr(LCD_ADDR);
    I2C1_Is_Idle();

    Delay_ms(30); //30 // laisser le temps au LCD de s'alimenter correctement

    I2C1_Wr(0x30 | rs | 0x04 | 0x08);
    I2C1_Is_Idle();
    Delay_us(50);
    I2C1_Wr(0x30 | rs | 0x00 | 0x08);
    I2C1_Is_Idle();

    Delay_ms(10); //10 // laisser le temps au LCD de s'alimenter correctement

    I2C1_Wr(0x30 | rs | 0x04 | 0x08);
    I2C1_Is_Idle();
    Delay_us(50);
    I2C1_Wr(0x30 | rs | 0x00 | 0x08);
    I2C1_Is_Idle();

    Delay_ms(10); //10 // laisser le temps au LCD de s'alimenter correctement

    I2C1_Wr(0x30 | rs | 0x04 | 0x08);
    I2C1_Is_Idle();
    Delay_us(50);
    I2C1_Wr(0x30 | rs | 0x00 | 0x08);
    I2C1_Is_Idle();

    Delay_ms(10); //10 // laisser le temps au LCD de s'alimenter correctement

    I2C1_Wr(0x20 | rs | 0x04 | 0x08);
    I2C1_Is_Idle();
    Delay_us(50);
    I2C1_Wr(0x20 | rs | 0x00 | 0x08);
    I2C1_Is_Idle();
    I2C1_Stop();

    Delay_ms(100); //100 // laisser le temps au LCD de s'alimenter correctement

    I2C_LCD_Cmd(0x28);
    I2C_LCD_Cmd(0x06);
}


// procedure I2C_LCD_Out By paulfjujo
void I2C_LCD_Out(char row, char col, char *text) {
    while(*text)
         I2C_LCD_Chr(row, col++, *text++);
}


// procedure texte au demarrage
void Welcome() {
  I2C_LCD_Cmd(_LCD_CURSOR_OFF);             // supprime le curseur
  I2C_LCD_Cmd(_LCD_CLEAR);                  // vide l'ecran
   delay_ms(100);                           // attend 100ms

    I2C_Lcd_Out(1,3,txt1);                  // affiche le texte CALCULATRICE en 1ere ligne
    I2C_Lcd_Out(2,5,txt2);                  // affiche le texte BY VENOM en 2eme ligne
     delay_ms(3000);                         // attend 2 secondes

  I2C_LCD_Cmd(_LCD_CURSOR_OFF);             // supprime le curseur
  I2C_LCD_Cmd(_LCD_CLEAR);                  // vide l'ecran
    I2C_Lcd_Out(1,3,txt3);                  // affiche le texte ENTREZ VOTRE en 1ere ligne
    I2C_Lcd_Out(2,4,txt4);                  // affiche le texte OPERATION en 2eme ligne
     delay_ms(3000);                         // attend 2 secondes
     
  I2C_LCD_Cmd
(_LCD_CURSOR_OFF);             // supprime le curseur
  I2C_LCD_Cmd(_LCD_CLEAR);                  // vide l'ecran
   delay_ms(100);
   
     RA0_bit 
= 1;                           // allume led RA0
     delay_ms(500);
     RA0_bit = 0;                           // eteint led RA0
}

// procedure annulation de l'operation (touche *)
void Annulation(){
  I2C_LCD_Cmd(_LCD_CURSOR_OFF);             // supprime le curseur
  I2C_LCD_Cmd(_LCD_CLEAR);                  // vide l'ecran
  kp = 0;                                   // reset de la variable kp
  i = 0;
   delay_ms(10);                            // attend 10ms

}


// procedure qui calcul l'operation
void Resultat_Calcul(){

if(
Type_Operation == 1)                     // si l'operation est une addition
{
 for (j=0; j<Longeur_Premiere_Valeur; j++)
 {
  //I2C_LCD_Chr(2,1+j,code1[j]);
  Premiere_Valeur = code1[j]-48;            // recupere la valeur de la premiere partie de l'operation
 }

 for (k=Longeur_Premiere_Valeur; k<Longeur_operation; k++)
 {
  //I2C_LCD_Chr(2,1+k,code1[k]);
  Deuxieme_Valeur = code1[k]-48;            // recupere la valeur de la deuxieme partie de l'operation
 }
 
}

else if(Type_Operation == 2)                // si l'operation est une soustraction
{

}

else if(Type_Operation == 3)                // si l'operation est une multiplication
{

}

else if(Type_Operation == 4)                // si l'operation est une division
{

}
 
}


// procedure recupere la touche appuyer et l'affichea l'ecran
void Touche_Clavier() {
  do {
    kp = 0;                                // Reset key code variable

    // Wait for key to be pressed and released
    do
      
// kp = Keypad_Key_Press();          // Store key code in kp variable
      kp = Keypad_Key_Click();             // Store key code in kp variable
    while (!kp);
   // Prepare value for output, transform key to it's ASCII value
    switch (kp) {
      case  1: kp = 49; break; // 1
      case  2: kp = 50; break; // 2
      case  3: kp = 51; break; // 3
      case  4: kp = 43; break; // +
      case  5: kp = 52; break; // 4
      case  6: kp = 53; break; // 5
      case  7: kp = 54; break; // 6
      case  8: kp = 45; break; // -
      case  9: kp = 55; break; // 7
      case 10: kp = 56; break; // 8
      case 11: kp = 57; break; // 9
      case 12: kp = 120; break; // x
      case 13: kp = 42; break; // *
      case 14: kp = 48; break; // 0
      case 15: kp = 61; break; // =
      case 16: kp = 47; break; // /

    }

    code1[i] = kp;
    I2C_LCD_Chr(1,1+i,code1[i]);            // affiche les touches presser sur la 1ere ligne

    i++;
    
    
    if
(kp == 43)                            // si on appuie sur +
    {
     Type_Operation = 1;                    // Type_Operation prend la valeur 1 qui correspond a une addition
     Longeur_Premiere_Valeur = i-1;         // longeur de la premiere valeur
     delay_ms(50);
    }

    if(kp == 45)                            // si on appuie sur -
    {
     Type_Operation = 2;                    // Type_Operation prend la valeur 2 qui correspond a une soustraction
     Longeur_Premiere_Valeur = i-1;         // longeur de la premiere valeur
     delay_ms(50);
    }

    if(kp == 120)                           // si on appuie sur x
    {
     Type_Operation = 3;                    // Type_Operation prend la valeur 3 qui correspond a une multiplication
     Longeur_Premiere_Valeur = i-1;         // longeur de la premiere valeur
     delay_ms(50);
    }

    if(kp == 47)                            // si on appuie sur /
    {
     Type_Operation = 4;                    // Type_Operation prend la valeur 4 qui correspond a une division
     Longeur_Premiere_Valeur = i-1;         // longeur de la premiere valeur
     delay_ms(50);
    }

    if(kp == 42)                            // si on appuie sur * (etoile)
    {
     Annulation();                          // on appele la procedure Annulation()
     delay_ms(50);
    }

    if(kp == 61)                            // si on appuie sur =
    {
     Longeur_Deuxieme_Valeur = Longeur_Operation-Longeur_Premiere_Valeur-1; // longeur de la deuxieme valeur
     Resultat_Calcul();                     // on appele la procedure Resultat_Calcul()
     delay_ms(50);
    }

    if(> 16)                              // si i est plus grand que 16 caracteres
    {
     Annulation();                          // on appele la procedure Annulation()
     delay_ms(50);
    }


    Longeur_Operation = i;                  // longeur de l'operation
    
  
} while (1);

}




void main() {
    OSCCON = 0b01101000;                   // configuration OSCCON interne 4mhz
                                           // 0b01110000 oscillateur 8 Mhz
                                           // 0b01101000 oscillateur 4 Mhz
                                           // 0b01011000 oscillateur 2 Mhz
                                           // 0b01001000 oscillateur 1 Mhz
                                           // 0b00111000 oscillateur 500 Khz
                                           // 0b00101000 oscillateur 250 Khz
                                           // 0b00011000 oscillateur 125 Khz
                                           // 0b00001000 oscillateur 31 kHz

    while(OSCCON.HTS==0);                  // boucle en attendant de voir le flag à 1

    C1ON_bit = 0;                          // Disable comparators             // Fill data buffer

    ANSEL  = 0;                            // Configure AN pins as digital I/O
    ANSELH = 0;

    TRISA = 0x00;                          // en sortie par defaut
    TRISC = 0xFE;                          // en entree par defaut sauf RC0


    Keypad_Init();                         // Initialize Keypad
     delay_ms(100);

    I2C1_Init(100000);                     // initialisation de l'I2C
     delay_ms(100);

    I2C_LCD_Init();
     delay_ms(100);

    I2C_LCD_Cmd(_LCD_CURSOR_OFF);
    

    Welcome
();                                // appele la procedure Welcome

    Touche_Clavier();
     

    while
(1); {                             // boucle infini

    }


D'avance merci.






@++
Mon site web
Mon discord : venom#4888


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 44 invités