Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

LCD Nokia 3310 et Arduino



  1. #1
    dedenast

    Lightbulb LCD Nokia 3310 et Arduino


    ------

    Bonjour,
    Je commence à prendre en main l'utilisation d'un afficheur LCD Nokia 3310 et je tombe sur quelques problèmes.
    J'ai vu plusieurs librairies sur internet -> très complètes mais assez difficiles à comprendre et très lourdes.
    Je suis donc parti pour adapter une librairie très basique que j'ai vu sur le site officiel d'arduino, pour l'adapter à mes envies.
    Voici ce que ça donne:

    Code:
    /* LIBRAIRIE LCD 3310 POUR ARDUINO
    
    => Liste des fonctions:
        LCDInitialise(void)                 -> Initialise l'afficheur
        LCDClear(void)                      -> Efface l'affichage
        LCDWriteCMD(byte dc, byte data)     -> Envoye une commande à l'afficheur: dc-> Data/Command ; data-> données en hexadécimal
        LCDGotoXY(int x, int y)             -> Positionne le curseur: x->[0 à 6] , y->[0 à 84]
        LCDCharacter(char character)        -> Envoie un symbole
        LCDString(char *characters)         -> Envoie un texte, entre ""
    
    
    
    */
    
    
    // Configuration du brochage:
    //      Exemple: PIN_RESET (LCD) -> PIN 2 ARDUINO
    #define PIN_RESET   2
    #define PIN_SCE		3
    #define PIN_DC		4
    #define PIN_SDIN	5
    #define PIN_SCLK    6
    
    // Configuration afficheur LCD
    #define LCD_C       LOW
    #define LCD_D       HIGH
    #define LCD_X       84
    #define LCD_Y       48
    #define LCD_CMD     0
    
    void LCDCharacter(char character);
    void LCDClear(void);
    void LCDInitialise(void);
    void LCDString(char *characters);
    void LCDWriteCMD(byte dc, byte data);
    void LCDGotoXY(int x, int y);
    
    // Caractères afficheur LCD
    unsigned int ASCII[][5] =
    {
        {0x00, 0x00, 0x00, 0x00, 0x00} // 0
        ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 1 !
        ,{0x00, 0x07, 0x00, 0x07, 0x00} // 2 "
        ,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 3 #
        ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 4 $
        ,{0x23, 0x13, 0x08, 0x64, 0x62} // 5 %
        ,{0x36, 0x49, 0x55, 0x22, 0x50} // 6 &
        ,{0x00, 0x05, 0x03, 0x00, 0x00} // 7 '
        ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 8 (
        ,{0x00, 0x41, 0x22, 0x1c, 0x00} // 9 )
        ,{0x14, 0x08, 0x3e, 0x08, 0x14} // 10 *
        ,{0x08, 0x08, 0x3e, 0x08, 0x08} // 11 +
        ,{0x00, 0x50, 0x30, 0x00, 0x00} // 12 ,
        ,{0x08, 0x08, 0x08, 0x08, 0x08} // 13 -
        ,{0x00, 0x60, 0x60, 0x00, 0x00} // 14 .
        ,{0x20, 0x10, 0x08, 0x04, 0x02} // 15 /
        ,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 16 0
        ,{0x00, 0x42, 0x7f, 0x40, 0x00} // 17 1
        ,{0x42, 0x61, 0x51, 0x49, 0x46} // 18 2
        ,{0x21, 0x41, 0x45, 0x4b, 0x31} // 19 3
        ,{0x18, 0x14, 0x12, 0x7f, 0x10} // 20 4
        ,{0x27, 0x45, 0x45, 0x45, 0x39} // 21 5
        ,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 22 6
        ,{0x01, 0x71, 0x09, 0x05, 0x03} // 23 7
        ,{0x36, 0x49, 0x49, 0x49, 0x36} // 24 8
        ,{0x06, 0x49, 0x49, 0x29, 0x1e} // 25 9
        ,{0x00, 0x36, 0x36, 0x00, 0x00} // 26 :
        ,{0x00, 0x56, 0x36, 0x00, 0x00} // 27 ;
        ,{0x08, 0x14, 0x22, 0x41, 0x00} // 28 <
        ,{0x14, 0x14, 0x14, 0x14, 0x14} // 29 =
        ,{0x00, 0x41, 0x22, 0x14, 0x08} // 30 >
        ,{0x02, 0x01, 0x51, 0x09, 0x06} // 31 ?
        ,{0x32, 0x49, 0x79, 0x41, 0x3e} // 32 @
        ,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 33 A
        ,{0x7f, 0x49, 0x49, 0x49, 0x36} // 34 B
        ,{0x3e, 0x41, 0x41, 0x41, 0x22} // 35 C
        ,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 36 D
        ,{0x7f, 0x49, 0x49, 0x49, 0x41} // 37 E
        ,{0x7f, 0x09, 0x09, 0x09, 0x01} // 38 F
        ,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 39 G
        ,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 40 H
        ,{0x00, 0x41, 0x7f, 0x41, 0x00} // 41 I
        ,{0x20, 0x40, 0x41, 0x3f, 0x01} // 42 J
        ,{0x7f, 0x08, 0x14, 0x22, 0x41} // 43 K
        ,{0x7f, 0x40, 0x40, 0x40, 0x40} // 44 L
        ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 45 M
        ,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 46 N
        ,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 47 O
        ,{0x7f, 0x09, 0x09, 0x09, 0x06} // 48 P
        ,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 49 Q
        ,{0x7f, 0x09, 0x19, 0x29, 0x46} // 50 R
        ,{0x46, 0x49, 0x49, 0x49, 0x31} // 51 S
        ,{0x01, 0x01, 0x7f, 0x01, 0x01} // 52 T
        ,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 53 U
        ,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 54 V
        ,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 55 W
        ,{0x63, 0x14, 0x08, 0x14, 0x63} // 56 X
        ,{0x07, 0x08, 0x70, 0x08, 0x07} // 57 Y
        ,{0x61, 0x51, 0x49, 0x45, 0x43} // 58 Z
        ,{0x00, 0x7f, 0x41, 0x41, 0x00} // 59 [
        ,{0x02, 0x04, 0x08, 0x10, 0x20} // 60 ¥
        ,{0x00, 0x41, 0x41, 0x7f, 0x00} // 61 ]
        ,{0x04, 0x02, 0x01, 0x02, 0x04} // 62 ^
        ,{0x40, 0x40, 0x40, 0x40, 0x40} // 63 _
        ,{0x00, 0x01, 0x02, 0x04, 0x00} // 64 `
        ,{0x20, 0x54, 0x54, 0x54, 0x78} // 65 a
        ,{0x7f, 0x48, 0x44, 0x44, 0x38} // 66 b
        ,{0x38, 0x44, 0x44, 0x44, 0x20} // 67 c
        ,{0x38, 0x44, 0x44, 0x48, 0x7f} // 68 d
        ,{0x38, 0x54, 0x54, 0x54, 0x18} // 69 e
        ,{0x08, 0x7e, 0x09, 0x01, 0x02} // 70 f
        ,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 71 g
        ,{0x7f, 0x08, 0x04, 0x04, 0x78} // 72 h
        ,{0x00, 0x44, 0x7d, 0x40, 0x00} // 73 i
        ,{0x20, 0x40, 0x44, 0x3d, 0x00} // 74 j
        ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 75 k
        ,{0x00, 0x41, 0x7f, 0x40, 0x00} // 76 l
        ,{0x7c, 0x04, 0x18, 0x04, 0x78} // 77 m
        ,{0x7c, 0x08, 0x04, 0x04, 0x78} // 78 n
        ,{0x38, 0x44, 0x44, 0x44, 0x38} // 79 o
        ,{0x7c, 0x14, 0x14, 0x14, 0x08} // 80 p
        ,{0x08, 0x14, 0x14, 0x18, 0x7c} // 81 q
        ,{0x7c, 0x08, 0x04, 0x04, 0x08} // 82 r
        ,{0x48, 0x54, 0x54, 0x54, 0x20} // 83 s
        ,{0x04, 0x3f, 0x44, 0x40, 0x20} // 84 t
        ,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 85 u
        ,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 86 v
        ,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 87 w
        ,{0x44, 0x28, 0x10, 0x28, 0x44} // 88 x
        ,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 89 y
        ,{0x44, 0x64, 0x54, 0x4c, 0x44} // 90 z
        ,{0x00, 0x08, 0x36, 0x41, 0x00} // 91 {
        ,{0x00, 0x00, 0x7f, 0x00, 0x00} // 92 |
        ,{0x00, 0x41, 0x36, 0x08, 0x00} // 93 }
        ,{0x10, 0x08, 0x08, 0x10, 0x08} // 94 ←
        ,{0x00, 0x06, 0x09, 0x09, 0x06} // 95 →
        ,{0x55, 0xaa, 0x55, 0xaa, 0x55} // 96  rectangle a moitié rempli
        ,{0xff, 0xff, 0xe7, 0xff, 0xff} // 97  rectangle rempli
        ,{0xff, 0x01, 0xfd, 0x05, 0x05} // 98  coin haut gauche double
        ,{0x05, 0x05, 0xfd, 0x01, 0xff} // 99  coin haut droit double
        ,{0xff, 0x80, 0xbf, 0xa0, 0xa0} // 100  coin bas gauche double
        ,{0xa0, 0xa0, 0xbf, 0x80, 0xff} // 101 coin bas droit double
        ,{0x05, 0x05, 0x05, 0x05, 0x05} // 102 ligne haut horizontal double
        ,{0xa0, 0xa0, 0xa0, 0xa0, 0xa0} // 103 ligne bas horizontal double
        ,{0xff, 0x00, 0xff, 0x00, 0x00} // 104 ligne gauche vertical double
        ,{0x00, 0x00, 0xff, 0x00, 0xff} // 105 ligne droit vertical double
        ,{0x7e, 0xdb, 0xdf, 0xdb, 0x7e} // 106 smiley plein
        ,{0x66, 0xef, 0xfb, 0x7e, 0x34} // 107 piaf
        ,{0x00, 0x18, 0x3c, 0x18, 0x00} // 108 piece plein
        ,{0x00, 0x18, 0x24, 0x18, 0x00} // 109 piece vide
        ,{0x18, 0x24, 0x48, 0x24, 0x18} // 110 coeur vide
        ,{0x18, 0x3c, 0x78, 0x3c, 0x18} // 111 coeur plein
        ,{0x80, 0x00, 0x00, 0x00, 0x00} // 112 pixel haut gauche
    };
    void LCDCharacter(char character)
    {
        LCDWriteCMD(LCD_D, 0x00);
        for (int index = 0; index < 5; index++)
        {
            LCDWriteCMD(LCD_D, ASCII[character][index]);
        }
        LCDWriteCMD(LCD_D, 0x00);
    }
    void LCDClear(void)
    {
        for (int index = 0; index < LCD_X * LCD_Y / 8; index++)
        {
            LCDWriteCMD(LCD_D, 0x00);
        }
    }
    void LCDInitialise(void)
    {
        pinMode(PIN_SCE,        OUTPUT);
        pinMode(PIN_RESET,      OUTPUT);
        pinMode(PIN_DC,         OUTPUT);
        pinMode(PIN_SDIN,       OUTPUT);
        pinMode(PIN_SCLK,       OUTPUT);
    
        digitalWrite(PIN_RESET, LOW);
        digitalWrite(PIN_RESET, HIGH);
    
        LCDWriteCMD(LCD_CMD,   0x21);	// LCD Extended Commands.
        LCDWriteCMD(LCD_CMD,   0xB1);	// Set LCD Vop (Contrast). //B1
        LCDWriteCMD(LCD_CMD,   0x04);	// Set Temp coefficent. //0x04
        LCDWriteCMD(LCD_CMD,   0x14);	// LCD bias mode 1:48. //0x13
        LCDWriteCMD(LCD_CMD,   0x0C);	// LCD in normal mode. 0x0d for inverse
        LCDWriteCMD(LCD_C,     0x20);
        LCDWriteCMD(LCD_C,     0x0C);
    }
    void LCDString(char *characters)
    {
        while (*characters)
        {
            LCDCharacter((*characters++)-0x20);
        }
    }
    void LCDWriteCMD(byte dc, byte data)
    {
        digitalWrite(PIN_DC, dc);
        digitalWrite(PIN_SCE, LOW);
        shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
        digitalWrite(PIN_SCE, HIGH);
    }
    void LCDGotoXY(int x, int y)
    {
        LCDWriteCMD( 0, 0x80 | x);	// Column.
        LCDWriteCMD( 0, 0x40 | y);	// Row.
        delay(1);
    }
    void LCDDrawPixel(int x, int y)
    {
        LCDGotoXY(x, y);
        LCDCharacter(112);
    }
    Mes soucis, sont pour le moment la fonction LCDDrawPixel et la LCDGotoXY.
    La fonction LCDGotoXY a seulement une portée de 0 à 6 en vertical, et moi je voudrais avoir une portée de 0 à 48, vu qu'il y a 48px sur l'axe Y.
    La fonction LCDDrawPixel ne fonctionne pas comme je voudrais, vu que ça saute plusieurs pixels à cause de la fonction LCDGotoXY.

    Du coup ce que je voudrais savoir, c'est à quoi correspondent les lignes suivantes:
    Code:
        LCDWriteCMD( 0, 0x80 | x);	// Column.
        LCDWriteCMD( 0, 0x40 | y);	// Row.
    Surtout le "0x80 |x" et "0x40 | y".

    Comment modifier la fonction LCDGotoXY afin de pouvoir déplacer le curseur de 0 à 84 sur l'axe X et 0 à 48 sur l'axe Y?
    Comment réécrire le plus simplement possible la fonction LCDDrawPixel afin de pouvoir afficher un seul pixel et ne pas utiliser un caractère entier (cèest a dire que dans le code ci-dessus le pixel utilise un caractère complet de 5x8 pixels au lieu d'en utiliser qu'un seul).

    Merci d'avance

    -----

  2. #2
    paulfjujo

    Re : LCD Nokia 3310 et Arduino

    bonsoir,

    Surtout le "0x80 |x" et "0x40 | y".
    cela revient à ajouter un offset de deplacement sur la ligne ou la colonne
    un OU logique, equivalent à une addition
    0x80+x
    0x40+y

  3. #3
    dedenast

    Re : LCD Nokia 3310 et Arduino

    D'acc merci

Discussions similaires

  1. Arduino anti rebond avec arduino
    Par sari12 dans le forum Électronique
    Réponses: 13
    Dernier message: 23/10/2014, 17h04
  2. comment faire l’interfaçage entre pic 16f877 et nokia 3310
    Par aymengeii dans le forum Électronique
    Réponses: 1
    Dernier message: 22/04/2014, 02h29
  3. Communication arduino-arduino avec module Xbee
    Par TPESI22012 dans le forum Électronique
    Réponses: 2
    Dernier message: 23/12/2013, 17h24
  4. tv nokia
    Par chauffeurtele dans le forum Dépannage
    Réponses: 13
    Dernier message: 22/12/2006, 20h09
  5. librairie pour LCD nokia 3310
    Par vavoum dans le forum Électronique
    Réponses: 3
    Dernier message: 30/05/2006, 20h18
Découvrez nos comparatifs produits sur l'informatique et les technologies.