Auteur Sujet: Ecran Nokia 5110  (Lu 16956 fois)

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Ecran Nokia 5110
« le: décembre 26, 2014, 01:29:33 pm »
Bonjour,
j'ouvre le bal pour une question assez pointue. J'ai pu me débattre un peu avec mais impossible d'aller plus loin, je coince un peu.

Un peu cheap, c'est un composant qui peut nous aider. Je vais m'en servir pour avoir un écran sans shield pour une somme assez dérisoire ; une sorte de petit défi pour faire un cherche servo dans un premier temps.

Déjà la documentation est pléthore mais peu loquace sur certains points, un peu le souci des trucs d'ebay, est-ce que cela correspond de partout ? Le branchement est un peu problématique pour la lumière qui ne marche que si on branche light sur GND et non sur 3v3 comme dit sur pas mal de sites.

Le reste marche, mon problème est au niveau de la lisibilité du texte (et cella même sans rétro-éclairage).
J'ai trouvé déjà des codes sans librairie qui marche pas mal type :
    #define PIN_SCE   7
    #define PIN_RESET 6
    #define PIN_DC    5
    #define PIN_SDIN  4
    #define PIN_SCLK  3

    #define LCD_C     LOW
    #define LCD_D     HIGH

    #define LCD_X     84
    #define LCD_Y     48

    static const byte ASCII[][5] =
    {
     {0x00, 0x00, 0x00, 0x00, 0x00} // 20
    ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
    ,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
    ,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
    ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
    ,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
    ,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
    ,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
    ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
    ,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
    ,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
    ,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
    ,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
    ,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
    ,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
    ,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
    ,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
    ,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
    ,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
    ,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
    ,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
    ,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
    ,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
    ,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
    ,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
    ,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
    ,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
    ,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
    ,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <
    ,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
    ,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >
    ,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
    ,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
    ,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
    ,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
    ,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
    ,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
    ,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
    ,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
    ,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
    ,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
    ,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
    ,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
    ,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
    ,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
    ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
    ,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
    ,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
    ,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
    ,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
    ,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
    ,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
    ,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
    ,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
    ,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
    ,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
    ,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
    ,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
    ,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
    ,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
    ,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥
    ,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
    ,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
    ,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
    ,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
    ,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
    ,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
    ,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
    ,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
    ,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
    ,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
    ,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
    ,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
    ,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
    ,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j
    ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
    ,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
    ,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
    ,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
    ,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
    ,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
    ,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
    ,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
    ,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
    ,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
    ,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
    ,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
    ,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
    ,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
    ,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
    ,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
    ,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
    ,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
    ,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
    ,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ←
    ,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f →
    };

    void LcdCharacter(char character)
    {
      LcdWrite(LCD_D, 0x00);
      for (int index = 0; index < 5; index++)
      {
        LcdWrite(LCD_D, ASCII[character - 0x20][index]);
      }
      LcdWrite(LCD_D, 0x00);
    }

    void LcdClear(void)
    {
      for (int index = 0; index < LCD_X * LCD_Y / 8; index++)
      {
        LcdWrite(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);
      LcdWrite(LCD_C, 0x21 );  // LCD Extended Commands.
      LcdWrite(LCD_C, 0xB1 );  // Set LCD Vop (Contrast).
      LcdWrite(LCD_C, 0x04 );  // Set Temp coefficent. //0x04
      LcdWrite(LCD_C, 0x14 );  // LCD bias mode 1:48. //0x13
      LcdWrite(LCD_C, 0x0C );  // LCD in normal mode.
      LcdWrite(LCD_C, 0x20 );
      LcdWrite(LCD_C, 0x0C );
    }

    void LcdString(char *characters)
    {
      while (*characters)
      {
        LcdCharacter(*characters++);
      }
    }

    void LcdWrite(byte dc, byte data)
    {
      digitalWrite(PIN_DC, dc);
      digitalWrite(PIN_SCE, LOW);
      shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
      digitalWrite(PIN_SCE, HIGH);
    }

    void setup(void)
    {
      LcdInitialise();
      LcdClear();
      LcdString("Hello World! + ");
    }

    void loop(void)
    {
    }


G.

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Ecran Nokia 5110
« Réponse #1 le: décembre 26, 2014, 01:29:50 pm »
ou cela là
    // === Ecran LCD Nokia 5110 ============================
    //Exemple d'affichage d'image bitmap 84x48 pixels
    // tiptopboards.com
    // C ROLLAND 24 08 2013
    //=======================================================
    // Source d'inspiration de ce code :
    // 7-17-2011  Spark Fun Electronics 2011 Nathan Seidle
    // http://www.sparkfun.com/products/10168
    //=======================================================

    //Câblage de l'écran sur la carte Arduino (résistance en série)
    #define PIN_SCE   7 //Pin 3 on LCD Chip Select (1 k)
    #define PIN_RESET 6 //Pin 4 on LCD reset, active low (10 k)
    #define PIN_DC    5 //Pin 5 on LCD data/commande (10 k)
    #define PIN_SDIN  4 //Pin 6 on LCD SPI Mosi (10 k)
    #define PIN_SCLK  3 //Pin 7 on LCD SPI clk (10 k)

    //La pin DC indique au LCD si on envoie une donnée ou une commande
    #define LCD_COMMAND 0
    #define LCD_DATA  1

    //Notre écran fait 84 x 48 pixels (à modifier ici pour d'autres LCD)
    #define LCD_X     84
    #define LCD_Y     48

    long temps = 0;  //Pour chronométrer la vitesse de l'affichage

    //Ce tableau comporte les caractères Ascii codés en octets
    //Cette police de caractères fait 5 pixels (haut) x 8 (large)
    static const byte ASCII[][5] = {
      {0x00, 0x00, 0x00, 0x00, 0x00} // 20
      ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
      ,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
      ,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
      ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
      ,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
      ,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
      ,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
      ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
      ,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
      ,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
      ,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
      ,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
      ,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
      ,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
      ,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
      ,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
      ,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
      ,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
      ,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
      ,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
      ,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
      ,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
      ,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
      ,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
      ,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
      ,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
      ,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
      ,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <
      ,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
      ,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >
      ,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
      ,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
      ,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
      ,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
      ,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
      ,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
      ,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
      ,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
      ,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
      ,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
      ,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
      ,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
      ,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
      ,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
      ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
      ,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
      ,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
      ,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
      ,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
      ,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
      ,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
      ,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
      ,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
      ,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
      ,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
      ,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
      ,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
      ,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
      ,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
      ,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c antislash (bug ici dans le prg. d'origine; corrigé)
      ,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
      ,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
      ,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
      ,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
      ,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
      ,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
      ,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
      ,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
      ,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
      ,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
      ,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
      ,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
      ,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
      ,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j
      ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
      ,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
      ,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
      ,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
      ,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
      ,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
      ,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
      ,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
      ,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
      ,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
      ,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
      ,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
      ,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
      ,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
      ,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
      ,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
      ,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
      ,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
      ,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
      ,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ~
      ,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f DEL
    };


    //On peut aussi créer ses propres caractères à afficher

    //Petit dessin en bitmap d'un Smiley
    //504 octets codent 84 x 48 pixels
    // 1 octet = 8bits code  8 pixels (0/1) noir et blanc
    char awesome[] = {
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x1C,
      0x0C, 0x0C, 0x06, 0x06, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
      0x07, 0x07, 0x0E, 0x06, 0x1C, 0x1C, 0x38, 0x70, 0x70, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, 0x3C, 0xCE, 0x67, 0x33, 0x18, 0x08,
      0x08, 0xC8, 0xF8, 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
      0x70, 0x38, 0x18, 0x18, 0x08, 0x08, 0x08, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x01, 0x07,
      0x0F, 0x3C, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x0F, 0x00, 0x0C, 0x7F,
      0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x61, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x63,
      0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF,
      0xF0, 0x00, 0x00, 0x00, 0x08, 0x08, 0xFC, 0x8C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
      0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
      0x0C, 0x0C, 0x0C, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x3C, 0x70, 0xE0, 0x80, 0x00, 0x07, 0x0C, 0x38, 0x60, 0xC0,
      0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0,
      0xF0, 0xE0, 0xC0, 0x80, 0xC0, 0x30, 0x18, 0x0F, 0x00, 0x00, 0x80, 0xC0, 0x70, 0x3C, 0x1F, 0x07,
      0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06,
      0x0E, 0x1C, 0x18, 0x38, 0x31, 0x73, 0x62, 0x66, 0x64, 0xC7, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF,
      0xC7, 0xC7, 0xC7, 0x67, 0x63, 0x63, 0x71, 0x30, 0x38, 0x18, 0x1C, 0x0C, 0x06, 0x03, 0x03, 0x01,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    };

    // Mon exemple de logo TipTop avec dessin de montagne, rivière, et soleil
    char tiptop[] = {
    0x00, 0x54, 0x00, 0x30,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0xF0, 0xF0, 0x30, 0x30,
    0x30, 0x00, 0xD0, 0xD0, 0x00, 0x00, 0xC0, 0xC0, 0x80, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x30, 0x30,
    0x30, 0xF0, 0xF0, 0x30, 0x30, 0x30, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0xC0,
    0xC0, 0x80, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0,
    0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0xFF, 0xFF, 0x19, 0x30, 0x39, 0x1F,
    0x0F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x39, 0x30, 0x39, 0x1F,
    0x0F, 0x00, 0x00, 0xFF, 0xFF, 0x19, 0x30, 0x39, 0x1F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x03, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x83, 0x80, 0x80, 0x80, 0x80,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF8, 0x3E, 0x0E, 0x07,
    0x07, 0x07, 0x1E, 0x7C, 0xF0, 0xC0, 0xC0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0x7C, 0x3F,
    0x0F, 0x03, 0x07, 0x1F, 0x3C, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF8, 0x3E, 0x0F, 0x07, 0x0F, 0x7F,
    0x78, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0x7E, 0x1F, 0x03, 0x03,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x1E, 0x3C, 0x78, 0x60, 0x30,
    0x38, 0x3C, 0x1E, 0x0F, 0x03, 0x03, 0x0F, 0x3F, 0x7C, 0x70, 0x60, 0x70, 0x70, 0x70, 0x1E, 0x1F,
    0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x1F, 0x1C, 0x78,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xF0, 0xF8, 0x3E, 0x0F, 0x03, 0x03, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x0E, 0x1C, 0x7C, 0xF0, 0xE8, 0x7C, 0x1F, 0x07, 0x01,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0,
    0xF0, 0x70, 0xE0, 0xE0, 0x80, 0xC0, 0xE0, 0x70, 0x78, 0x1E, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0xC0, 0xE0, 0x70, 0x3C, 0x1E, 0x0C, 0x0E,
    0x0C, 0x06, 0x1E, 0x1C, 0x38, 0x38, 0x38, 0x30, 0x1F, 0x1F, 0x07, 0x0F, 0x1E, 0x1C, 0x38, 0x70,
    0x70, 0x70, 0x78, 0x1C, 0x1F, 0x07, 0x07, 0x07, 0x06, 0x0E, 0x1E, 0x0C, 0x0C, 0x1C, 0x0C, 0x1C,
    0x0E, 0x0E, 0x0F, 0x03, 0x01, 0x00, 0x00, 0x01,
    };


    void setup(void) {
      LCDInit(); //Initialisation du LCD
      Serial.begin(9600);
    }

    void loop(void) {
      LCDClear();   //Vider l'afficheur
      LCDBitmap(awesome);  //Afficher le Smiley
      delay(2000);   // 2 seconde de délai
     
      //temps =   millis()- temps;  //Pour chronométrer la vitesse de l'affichage
      //Serial.println(temps);
      //temps = millis();
     
      LCDClear();
      LCDBitmap(tiptop);  //mon logo Tiptop en image bitmap
      delay(2000);  //2 secondes

      LCDClear();  //une ligne de 12 caractères
      LCDString("TipTopBoards");
      LCDString("|...........");  //6 lignes par écran
      LCDString("            ");
      LCDString(" Bonjour    ");   //message de texte
      LCDString("Christian   ");
      LCDString("____________");
      delay(1000);  //2 sec
    }

    // Fonction gotoXY
    void gotoXY(int x, int y) {
      LCDWrite(0, 0x80 | x);  // Column.
      LCDWrite(0, 0x40 | y);  // Row.  ?
    }

    // Fonction LCDBitmap
    // Elle prend un gros tableau d'octets et l'envoie sur le LCD
    void LCDBitmap(char my_array[]){
      for (int index = 0 ; index < (LCD_X * LCD_Y / 8) ; index++)
        LCDWrite(LCD_DATA, my_array[index]);
    }

    // Fonction LCDCharacter
    // Elle prend un caractère, le cherche dans la tableau de fonte, l'écrit sur l'écran.
    // Un caractère fait 8 bits haut x 5 bits de large, espacés de une colonne vide par côté
    void LCDCharacter(char character) {
      LCDWrite(LCD_DATA, 0x00); //Colonne verticale vide gauche de séparation des lettres

      for (int index = 0 ; index < 5 ; index++)
        LCDWrite(LCD_DATA, ASCII[character - 0x20][index]);
        //0x20 est le code ASCII pour espace (' ').
        //La table de police de caractères débute par ce caratère

      LCDWrite(LCD_DATA, 0x00); //Colonne verticale vide droite de séparation des lettres
    }

    // Affiche une par une des lettres d'une chaine de caractères sur le LCD
    void LCDString(char *characters) {
      while (*characters)
        LCDCharacter(*characters++);
    }

    //Efface le LCD en écrivant des zéros partout
    void LCDClear(void) {
      for (int index = 0 ; index < (LCD_X * LCD_Y / 8) ; index++)
        LCDWrite(LCD_DATA, 0x00);
       
      gotoXY(0, 0); //Puis revenir en haut
    }

    //Envoi des commandes sur le PCD8544
    void LCDInit(void) {

      //Configure les Pins de controle
      pinMode(PIN_SCE, OUTPUT);
      pinMode(PIN_RESET, OUTPUT);
      pinMode(PIN_DC, OUTPUT);
      pinMode(PIN_SDIN, OUTPUT);
      pinMode(PIN_SCLK, OUTPUT);

      //Reset the LCD à un état connu
      digitalWrite(PIN_RESET, LOW);
      digitalWrite(PIN_RESET, HIGH);

      LCDWrite(LCD_COMMAND, 0x21); //Tell LCD that extended commands follow
      LCDWrite(LCD_COMMAND, 0xB0); //Set LCD Vop (Contrast): Try 0xB1(good @ 3.3V) or 0xBF if your display is too dark
      LCDWrite(LCD_COMMAND, 0x04); //Set Temp coefficent
      LCDWrite(LCD_COMMAND, 0x14); //LCD bias mode 1:48: Try 0x13 or 0x14

      LCDWrite(LCD_COMMAND, 0x20); //We must send 0x20 before modifying the display control mode
      LCDWrite(LCD_COMMAND, 0x0C); //Set display control, normal mode. 0x0D for inverse
    }

    // Il y a deux banques de mémoire sur le LCD, data/RAM ou commandes
    // Cette fonction met la Pin DC high ou low selon les cas, et envoie les octets de data
    void LCDWrite(byte data_or_command, byte data) {
      //Indiquer au LCD si on lui écrit soit des données soit une commande
      digitalWrite(PIN_DC, data_or_command);

      //Envoi des data
      digitalWrite(PIN_SCE, LOW);
      shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
      digitalWrite(PIN_SCE, HIGH);
    }

G.

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Ecran Nokia 5110
« Réponse #2 le: décembre 26, 2014, 01:30:15 pm »
Le suivant présente un problème, il grise l'écran empêchant une lecture correcte, un problème au niveau du contraste :
    /*
    This Code has extra features
    including a XY positioning function on Display
    and a Line Draw function on Nokia 3310 LCD
    It is modded from the original
    http://playground.arduino.cc/Code/PCD8544
    */
    // Mods by Jim Park
    // jim(^dOt^)buzz(^aT^)gmail(^dOt^)com
    // hope it works for you
    #define PIN_SCE   7  // LCD CS  .... Pin 3
    #define PIN_RESET 6  // LCD RST .... Pin 1
    #define PIN_DC    5  // LCD Dat/Com. Pin 5
    #define PIN_SDIN  4  // LCD SPIDat . Pin 6
    #define PIN_SCLK  3  // LCD SPIClk . Pin 4
                         // LCD Gnd .... Pin 2
                         // LCD Vcc .... Pin 8
                         // LCD Vlcd ... Pin 7

    #define LCD_C     LOW
    #define LCD_D     HIGH

    #define LCD_X     84
    #define LCD_Y     48
    #define LCD_CMD   0

    int a = 0;

    static const byte ASCII[][5] =
    {
     {0x00, 0x00, 0x00, 0x00, 0x00} // 20
    ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
    ,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
    ,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
    ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
    ,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
    ,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
    ,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
    ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
    ,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
    ,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
    ,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
    ,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
    ,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
    ,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
    ,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
    ,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
    ,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
    ,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
    ,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
    ,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
    ,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
    ,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
    ,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
    ,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
    ,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
    ,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
    ,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
    ,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <
    ,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
    ,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >
    ,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
    ,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
    ,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
    ,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
    ,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
    ,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
    ,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
    ,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
    ,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
    ,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
    ,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
    ,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
    ,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
    ,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
    ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
    ,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
    ,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
    ,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
    ,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
    ,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
    ,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
    ,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
    ,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
    ,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
    ,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
    ,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
    ,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
    ,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
    ,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
    ,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥
    ,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
    ,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
    ,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
    ,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
    ,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
    ,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
    ,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
    ,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
    ,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
    ,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
    ,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
    ,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
    ,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
    ,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j
    ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
    ,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
    ,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
    ,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
    ,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
    ,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
    ,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
    ,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
    ,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
    ,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
    ,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
    ,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
    ,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
    ,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
    ,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
    ,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
    ,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
    ,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
    ,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
    ,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ←
    ,{0x00, 0x06, 0x09, 0x09, 0x06} // 7f →
    };




    void LcdCharacter(char character)
    {
      LcdWrite(LCD_D, 0x00);
      for (int index = 0; index < 5; index++)
      {
        LcdWrite(LCD_D, ASCII[character - 0x20][index]);
      }
      LcdWrite(LCD_D, 0x00);
    }

    void LcdClear(void)
    {
      for (int index = 0; index < LCD_X * LCD_Y / 8; index++)
      {
        LcdWrite(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);
     // delay(1);
      digitalWrite(PIN_RESET, HIGH);

      LcdWrite( LCD_CMD, 0x21 );  // LCD Extended Commands.
      LcdWrite( LCD_CMD, 0xBf );  // Set LCD Vop (Contrast). //B1
      LcdWrite( LCD_CMD, 0x04 );  // Set Temp coefficent. //0x04
      LcdWrite( LCD_CMD, 0x14 );  // LCD bias mode 1:48. //0x13
      LcdWrite( LCD_CMD, 0x0C );  // LCD in normal mode. 0x0d for inverse
      LcdWrite(LCD_C, 0x20);
      LcdWrite(LCD_C, 0x0C);
    }

    void LcdString(char *characters)
    {
      while (*characters)
      {
        LcdCharacter(*characters++);
      }
    }

    void LcdWrite(byte dc, byte data)
    {
      digitalWrite(PIN_DC, dc);
      digitalWrite(PIN_SCE, LOW);
      shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
      digitalWrite(PIN_SCE, HIGH);
    }

    // gotoXY routine to position cursor
    // x - range: 0 to 84
    // y - range: 0 to 5

    void gotoXY(int x, int y)
    {
      LcdWrite( 0, 0x80 | x);  // Column.
      LcdWrite( 0, 0x40 | y);  // Row.

    }



    void drawLine(void)
    {
      unsigned char  j;
       for(j=0; j<84; j++) // top
       {
              gotoXY (j,0);
         LcdWrite (1,0x01);
      }   
      for(j=0; j<84; j++) //Bottom
       {
              gotoXY (j,5);
         LcdWrite (1,0x80);
      }   

      for(j=0; j<6; j++) // Right
       {
              gotoXY (83,j);
         LcdWrite (1,0xff);
      }   
       for(j=0; j<6; j++) // Left
       {
              gotoXY (0,j);
         LcdWrite (1,0xff);
      }

    }


    void setup(void)
    {

     LcdInitialise();
      LcdClear();

    }

    void loop(void)
    {
      // Display some simple character animation
      //
      int a,b;
      char Str[15];
      // Draw a Box
      for(b=1000; b>0; b--){
      drawLine();
      for(a=0; a<=5 ; a++){
      gotoXY(4,1);
      // Put text in Box
      LcdString ("TestDisplay");
      gotoXY(24,3);
      LcdCharacter('H');
      LcdCharacter('E');
      LcdCharacter('L');
      LcdCharacter('L');
      LcdCharacter('O');
      LcdCharacter(' ');
      LcdCharacter('=');
      // Draw + at this position
      gotoXY(10,3);
      LcdCharacter('=');
      delay(500);
      gotoXY(24,3);
      LcdCharacter('h');
      LcdCharacter('e');
      LcdCharacter('l');
      LcdCharacter('l');
      LcdCharacter('o');
      LcdCharacter(' ');
      LcdCharacter('-');
      // Draw - at this position
      gotoXY(10,3);
      LcdCharacter('-');
      delay(500);
      }
      }
    }

G.

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Ecran Nokia 5110
« Réponse #3 le: décembre 26, 2014, 01:30:40 pm »
Ce problème est résolu en changeant un paramètre (j'ai comparé par rapport aux autres codes) :
LcdWrite( LCD_CMD, 0xBf );  // Set LCD Vop (Contrast). //B1
au lieu de mettre Bf, j'ai mis B1 et cela rentre dans l'ordre.

Comme j'aimerai utiliser une librairie (pour avoir un programme moins fouilli, je me suis tourné vers https://github.com/carlosefr/pcd8544, mais elle a le même problème que le dernier programme, mais là je n'ai pas réussi à trouver une solution.
A noter que seul du texte m'intéresse, les images c'est trop gadget, pas besoin.

Mais sinon je peux toujours me dépatouiller avec les premiers, si vous ne trouvez pas rapidement.
G.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Ecran Nokia 5110
« Réponse #4 le: décembre 26, 2014, 06:32:57 pm »
Bonsoir Guillaume,

J'ai jeté un oeil à la datasheet du contrôleur. Je l'ai d'ailleurs mise ici : Datasheet du PCD8544

Le Vop est la tension d'utilisation du LCD qui visiblement est programmable. La commande correspondante est sur un octet :
1 Vop6 Vop5 Vop4 Vop3 Vop2 Vop1 Vop0

En mettant B1 : 10110001, soit Vop = 0110001

Dans la lib que tu pointes, lignes 84 à 108, l'init du LCD est comme suit :

    // Set the LCD parameters...
    this->send(PCD8544_CMD, 0x21);  // extended instruction set control (H=1)
    this->send(PCD8544_CMD, 0x13);  // bias system (1:48)

    if (model == CHIP_ST7576) {
        this->send(PCD8544_CMD, 0xe0);  // higher Vop, too faint at default
        this->send(PCD8544_CMD, 0x05);  // partial display mode
    } else {
        this->send(PCD8544_CMD, 0xc2);  // default Vop (3.06 + 66 * 0.06 = 7V)
    }

    this->send(PCD8544_CMD, 0x20);  // extended instruction set control (H=0)
    this->send(PCD8544_CMD, 0x09);  // all display segments on

    // Clear RAM contents...
    this->clear();

    // Activate LCD...
    this->send(PCD8544_CMD, 0x08);  // display blank
    this->send(PCD8544_CMD, 0x0c);  // normal mode (0x0d = inverse mode)
    delay(100);

    // Place the cursor at the origin...
    this->send(PCD8544_CMD, 0x80);
    this->send(PCD8544_CMD, 0x40);

Le jeu d'instructions du LCD est table 1, page 14 de la datasheet

La première instruction, 0x21, est le function set. On a donc PD=0 (le contrôleur est actif), V=0 (mode horizontal) et H=1 (jeu d'instructions étendu).
La deuxième instruction, 0x13, positionne le bias avec BS2 = 0, BS1=1 et BS0=1. Voir page 16 de la datasheet.

La 3e instructions est celle qui nous intéresse. Quand tu utilises la lib, tu ne passe aucun model à begin je pense. Donc le model de contrôleur n'est pas le CHIP_ST7576. Donc c'est le else qui est exécuté et le Vop est à 1000010. Essaye de mettre ton B1 au lieu de C2 ligne 92
« Modifié: décembre 26, 2014, 07:16:12 pm par Jean-Luc »
Cordialement

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Ecran Nokia 5110
« Réponse #5 le: décembre 26, 2014, 06:54:16 pm »
Et bé
j'en reste bouche bée
essayé, testé et approuvé

Tu pourrais employer la maxime de César
G.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Ecran Nokia 5110
« Réponse #6 le: décembre 26, 2014, 07:16:48 pm »
Use the datasheet Luke !  ;)
Cordialement

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Ecran Nokia 5110
« Réponse #7 le: décembre 26, 2014, 07:51:30 pm »
Oui alors tu vois déjà que ce que tu as écris j'ai du mal alors imagine ce document. Je l'ai ouvert, je n'arrive pas trop à exprimer mon sentiment, alors imagine ma tête devant ;)
G.

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 745
    • Voir le profil
Re : Ecran Nokia 5110
« Réponse #8 le: décembre 27, 2014, 10:47:49 am »
Ça pourrait même faire l'objet d'un article : 'Lecture d'un Datasheet' , ou mieux 'Décoder un Datasheet' !  :P :P

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Ecran Nokia 5110
« Réponse #9 le: décembre 27, 2014, 12:42:22 pm »
Je laisse cela aux pro ;)
G.

chris_bzg

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 310
    • Voir le profil
Re : Ecran Nokia 5110
« Réponse #10 le: janvier 17, 2015, 04:40:51 pm »
Bonjour Thierry et Guillaume,

Au sujet de l'article Lire une Datasheet, j'ai commencé ce genre de truc pour un projet de livre qui ne verra peut-être jamais le jour. Ce serait une bonne occasion de reprendre ce que j'ai fait et de compléter. Y aurait-il un de vous deux pour me relire et dire ce qu'il en pense ?

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Ecran Nokia 5110
« Réponse #11 le: janvier 17, 2015, 10:17:18 pm »
Ben pourquoi pas mais pas de suite en tout cas.
Sinon pourquoi ne pas poster sur locoduino et envoyer en attente de publi ou dans le cas où tu ne veux pas que tous les rédacteurs le voient tu ajoute des rédacteurs que tu veux ;)
G.