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 : 622
Âge : 33
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#1 Message par venom » ven. 19 avr. 2019 10:27 lien vers la Data-Sheet : Cliquez ici

Bonjour a tous,

Voilà je viens de recevoir mon keypad 4x4. J'ai donc voulu faire mumuse avec, mais forcement si je viens vers vous c'est que ça ne fonctionne pas. :sifflotte:

Le hic c'est que je souhaite simplement afficher la touche appuyé sur un LCD 16x2. Sous mikroc il y a bien un exemple. Mais le souci, c'est que je souhaite afficher sur un LCD I2C comme paulfjujo m'a déjà montrer ici.

J'ai donc repris le code LCD I2C (schema compris) a l'identique et ajouter au code les options concertants le keypad de l'exemple de mikroc. Forcement ça ne fonctionne pas. :mur:


EDIT :
Code et schéma fonctionnel après rectification.
Voici le code :

Code : Tout sélectionner

///////////////////////////////
//    name : KEYPAD LCDI2C   //
//    create : venom         //
//    date : 18/04/2019      //
//    pic : 16f887 4MHz      //
///////////////////////////////




#define _LCD_FIRST_ROW          0x80     //Move cursor to the 1st row
#define _LCD_SECOND_ROW         0xC0     //Move cursor to the 2nd row
#define _LCD_THIRD_ROW          0x94     //Move cursor to the 3rd row
#define _LCD_FOURTH_ROW         0xD4     //Move cursor to the 4th row
#define _LCD_CLEAR              0x01     //Clear display
#define _LCD_RETURN_HOME        0x02     //Return cursor to home position, returns a shifted display to
                                         //its original position. Display data RAM is unaffected.
#define _LCD_CURSOR_OFF         0x0C     //Turn off cursor
#define _LCD_UNDERLINE_ON       0x0E     //Underline cursor on
#define _LCD_BLINK_CURSOR_ON    0x0F     //Blink cursor on
#define _LCD_MOVE_CURSOR_LEFT   0x10     //Move cursor left without changing display data RAM
#define _LCD_MOVE_CURSOR_RIGHT  0x14     //Move cursor right without changing display data RAM
#define _LCD_TURN_ON            0x0C     //Turn Lcd display on
#define _LCD_TURN_OFF           0x08     //Turn Lcd display off
#define _LCD_SHIFT_LEFT         0x18     //Shift display left without changing display data RAM
#define _LCD_SHIFT_RIGHT        0x1E     //Shift display right without changing display data RAM

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


unsigned short kp;

// Keypad module connections
char  keypadPort at PORTD;


// Lcd constants
char txt1[] = "Bouton presser :";
char txt2[] = "";


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

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

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

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





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


    Keypad_Init();                         // Initialize Keypad
  
    C1ON_bit 
= 0;                          // Disable comparators
    C2ON_bit = 0;

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

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

    I2C_LCD_Init();
    I2C_LCD_Cmd(_LCD_CURSOR_OFF);
    I2C_LCD_Cmd(_LCD_CLEAR);
    I2C_Lcd_Out(1,1,txt1);                 // affiche le texte en 1ere ligne
    I2C_Lcd_Out(2,1,txt2);                 // affiche le texte en 2eme ligne

    do {
     kp = 0;                               // reset de la variable kp

    
     do
      kp 
= Keypad_Key_Click();             // Mémoriser le code clé dans la variable kp
    
     while 
(!kp);
     // Préparer la valeur de sortie, transformer la clé en sa valeur ASCII
     switch (kp) {
      case  1: kp = 49; break; // 1
      case  2: kp = 50; break; // 2
      case  3: kp = 51; break; // 3
      case  4: kp = 65; break; // A
      case  5: kp = 52; break; // 4
      case  6: kp = 53; break; // 5
      case  7: kp = 54; break; // 6
      case  8: kp = 66; break; // B
      case  9: kp = 55; break; // 7
      case 10: kp = 56; break; // 8
      case 11: kp = 57; break; // 9
      case 12: kp = 67; break; // C
      case 13: kp = 42; break; // *
      case 14: kp = 48; break; // 0
      case 15: kp = 35; break; // #
      case 16: kp = 68; break; // D

     }
    
    I2C_LCD_Chr
(2,1,kp);                   // affiche la touche sur la 2eme ligne
    }
    
    while
(1); {                            // boucle infini

    }
}


Ainsi qu'une photo du schéma :
schema.png


Merci a tous. Je précise que pour le moment mes tests sont uniquement en simulation.

Vidéo du montage sur breadbord





@++
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par venom le mar. 23 avr. 2019 21:57, modifié 4 fois.
En fait tout est une question de BIT ? :-D

Keypad 4x4
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 622
Âge : 33
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#2 Message par venom » ven. 19 avr. 2019 12:53 lien vers la Data-Sheet : Cliquez ici

Oops autant pour moi, je viens de m'apercevoir que mon branchement est erroné. :oops: Je retourne sous simulation corriger tout ça exit
Je vous tiens au courant






@++
En fait tout est une question de BIT ? :-D

Keypad 4x4
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1253
Enregistré en : juillet 2016
Localisation : Terre

#3 Message par Temps-x » ven. 19 avr. 2019 13:02 lien vers la Data-Sheet : Cliquez ici

Bonjour venom, et tout le forum,

Qu'est ce qui fonction pas ? le LCD, ou le clavier.

As tu essayé d'afficher du texte dessus ton LCD, si oui est ce que cela fonctionne ?

Pour ton clavier numérique c'est pas compliqué, car tu as 4 fils, ce qui te fais 16 possibilités avec le zéro:

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

Avant de te servir de ton écran LCD, essai de brancher 16 LED avec résistance de 470 ohms pour chaque LED sur ton PIC,
et appui sur une touche est regarde si ça corresponds

Regarde tes branchements :wink:

==> A+
Modifié en dernier par Temps-x le ven. 19 avr. 2019 14:25, modifié 1 fois.
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

Keypad 4x4
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 622
Âge : 33
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#4 Message par venom » ven. 19 avr. 2019 13:50 lien vers la Data-Sheet : Cliquez ici

Salut Temps-X

C'est bon ça fonctionne sous simu et breadbord. 8-) Je remet tout ça au propre et je vous partage sa :wink:
Encore merci

Edit :
Voilà c'est fait au 1er post :wink:

Et une petite vidéo pour le fun :langue:





@++
En fait tout est une question de BIT ? :-D

Keypad 4x4
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1253
Enregistré en : juillet 2016
Localisation : Terre

#5 Message par Temps-x » ven. 19 avr. 2019 14:45 lien vers la Data-Sheet : Cliquez ici

:bravo: pour ta ténacité, Hum ... la vidéo est à l'envers, j'ai corrigé le défauts,

En téléchargement dans le bon sens :sifflotte: : https://drive.google.com/open?id=1f-KC9 ... Mt0P7GWJSP

==> A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

Keypad 4x4
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 622
Âge : 33
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#6 Message par venom » ven. 19 avr. 2019 15:06 lien vers la Data-Sheet : Cliquez ici

Étrange. Chez moi c'est a l’endroit :-D
Peut être que depuis le début je tiens mes ordinateurs portables a l'envers alors... :?
dehors!!






@++
En fait tout est une question de BIT ? :-D

Keypad 4x4
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1253
Enregistré en : juillet 2016
Localisation : Terre

#7 Message par Temps-x » ven. 19 avr. 2019 19:18 lien vers la Data-Sheet : Cliquez ici

Tu dois être à l'opposé de l'orientation de la terre, ce qui explique le sens de la vidéo .... :sifflotte: exit dehors!!

==> A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

Keypad 4x4
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 622
Âge : 33
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#8 Message par venom » ven. 19 avr. 2019 21:16 lien vers la Data-Sheet : Cliquez ici

Ah !!! ceci explique cela :roll:

Je continue ma quête de ce pad pour pouvoir y ajouter un password et voir si ce dernier est le bon ou non. Je sent que je vais avoir mal a la tête :mur: :-D






@++
En fait tout est une question de BIT ? :-D

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

#9 Message par venom » jeu. 25 avr. 2019 20:21 lien vers la Data-Sheet : Cliquez ici

Bonjour a tous,

Bon j'ai avancer de mon côté. J'arrive a écrire les touches pressé a la suite sur mon LCD et a effacer la ligne quand sa dépasse 16 caractères 8-)

Code : Tout sélectionner

For (i=1;i<16;i++);
 I2C_LCD_Chr(2,1+i,kp);


Par contre j'en appelle aux pro du forum ou a ceux qui savent m'aiguiller :sifflotte: je cherche le moyen de récupérer ces caractère pour les exploité. J'entends par là les couper.
Exemple si je tape 123456 comment récupérer les chiffres puis découper genre "123" "456" ?

C'est faisable ça avec mikroc ??? Où sa n'est pas de mon niveau ???
D'avance merci.







@++
En fait tout est une question de BIT ? :-D

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

#10 Message par Jérémy » ven. 26 avr. 2019 07:32 lien vers la Data-Sheet : Cliquez ici

Hello venom et à tous,

Si j'ai bien compris ton soucis j'entrevois 2 solutions potentielles.

1) Tu affectes une touche pour faire comme un "entrée" sur un clavier d'ordinateur par exemple le "égal". Quand tu appuies sur cette touche, cela enregistre dans un tableau les valeurs affichées puis les convertis en un chiffre par exemple.
2) tu fais des gabarits de chiffres. genre tu sais par exemple que tu n'utilise que des chiffres de trois caractères, alors arrivé à 3 caractères tu enregistres et convertis en chiffre .

Voila en gros , soit tu fais un "entrée" pour pour dire que tu passes au chiffre suivant , soit tu passes au suivant automatiquement avec un gabarit
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

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