LCD: Afficher les caractères en utilisant leur adresse dans la RAM

Bonjour, je découvre le LCD et le codage sur Arduino UNO. (réf.LCD inconnue du kit débutant Elegoo).

J’utilise les caractères - ; \ ; l ; / pour donner l’impression d’une barre qui tournoie en avançant. Ça marche impec sur simulateur. Quand je passe au montage, le LCD ne reconnaît pas le backslashe , il imprime le symbole du Yen de sa table de caractères.
Je peux créer mon propre caractère et l’enregistrer dans la CGRAM du LCD sous la forme d’une variable 8 bits mais du coup je n’arrive plus à l’intégrer dans mon

#include <LiquidCrystal.h>
//Librairie du LCD

LiquidCrystal lcd(8, 7, 5, 4, 3, 2); // RS, E, D4, D5, D6, D7
//Assignation des pins du LCD

byte backSlash[8] = {0b10000, 0b01000, 0b01000, 0b00100, 0b00100, 0b00010, 0b00010, 0b00001};
//Représentation binaire du symbole backslashe

void setup()
{
  lcd.begin(16,2);
  //Initialisation du LCD avec 2 lignes de 16 colonnes
  lcd.createChar(0, backSlash); 
  // Insertion du caractère dans le premier slot de la CGRAM
  //du micro controleur du LCD

  //////////////////////////////
  //-----INTRODUCTION LCD-----//
  //////////////////////////////

  int col = 15 ; int row = 1;
  //Déclaration des variables pour manipuler les 
  //colonnes et les lignes du LCD

  for (int step = 0 ; step <= 34; step++)
  //Séquence de 34 pas depuis la ligne du bas de la droite vers la gauche 
  //puis la ligne du haut de la gauche vers la droite
  //32 colonnes + 2 pas supplémentaires pour cacher le curseur en fin de ligne
  
  {
    char barre[5] = {'|', '\\', '-', '/'};
    //La barre qui va s'afficher suivant 4 positions selon la colonne du curseur 
    //Le backslahe (barre[2], est noté en double pour ne pas être
    //confondu avec une balise. Correctement affiché en simulation
    //mais affichage du symbole ¥ en IRL.
      
    float floatStep = step; 
    //Conversion de la variable step en float pour pouvoir être divisée
    
    int intStep = step%4;
    //Pour obtenir une séquence périodique de 4 (les barres). GG u/lesept


    if (col >= 0 && row == 1)
    //Première partie, les 15 premiers step sur la ligne du bas
    {
      lcd.setCursor(col, row);
      //Positionne le curseur à telles colonne et ligne
      
      lcd.print(barre[intStep]);
      //Affiche les caractères barre[] dont l'index dépend du numéro de colonne
      lcd.print(" ");
      //Efface le caractère précédent
      
      col -= 1;
      //Numéro de colonne décroit à chaque step
      if (col == 16)
      //Deuxième partie, les derniers step
      {
        row = 0;
        //On passe en ligne du haut
      }
    }
    else
    {
      lcd.setCursor(col, row);
      //Positionne le curseur à telles colonne et ligne
      lcd.print(barre[3 - intStep]);
      //Affiche les caractères barre[] dont l'index dépend du numéro de colonne
      lcd.setCursor(col - 1, row);
      lcd.print(" ");
      //Efface le dernier caractère à gauche
      col += 1;
      //Numéro de colonne croissant à chaque step
    }
    delay(200);
  }
  
  //////////////////////////////
  //---FIN INTRODUCTION LCD---//
  //////////////////////////////
  
}///End setup()

void loop()
{

}//End loop()

Je tente d’utiliser des pointeurs et déréférencements de l’adresse 0x40 + CGRAM du caractère créé sans succès, j’ai parcouru le forum, github et stackoverflow et quantité de tutos mais pas moyen de trouver une soluce pour mon petit truc. C’est pas que ce soit important mais j’aimerais bien comprendre. Merci d’avance si quelqu’un à des tuyaux.

Hello
je n'ai pas la réponse à ta question, n'utilisant pas ces écrans.
Mais tu peux remplacer tout ça

    float floatStep = step;
    //Conversion de la variable step en float pour pouvoir être divisée
   
    int intStep = int((floatStep / 4 - floor(floatStep / 4)) * 4);
    //Opération math pour obtenir une séquence périodique de 4 (les barres),
    //fonction de la colonne et reconversion en entier.

par

  int intStep = step % 4;

(% = opération modulo, reste de la division entière par 4) qui te donnera une suite 0 1 2 3 0 1 2 3 0 1 ...

lesept:
Hello
je n'ai pas la réponse à ta question, n'utilisant pas ces écrans.
Mais tu peux remplacer tout ça

    float floatStep = step;

//Conversion de la variable step en float pour pouvoir être divisée
 
   int intStep = int((floatStep / 4 - floor(floatStep / 4)) * 4);
   //Opération math pour obtenir une séquence périodique de 4 (les barres),
   //fonction de la colonne et reconversion en entier.




par 



int intStep = step % 4;




(% = opération modulo, reste de la division entière par 4) qui te donnera une suite 0 1 2 3 0 1 2 3 0 1 ...

lesept:
Hello
je n'ai pas la réponse à ta question, n'utilisant pas ces écrans.
Mais tu peux remplacer tout ça

    float floatStep = step;

//Conversion de la variable step en float pour pouvoir être divisée
 
   int intStep = int((floatStep / 4 - floor(floatStep / 4)) * 4);
   //Opération math pour obtenir une séquence périodique de 4 (les barres),
   //fonction de la colonne et reconversion en entier.




par 



int intStep = step % 4;




(% = opération modulo, reste de la division entière par 4) qui te donnera une suite 0 1 2 3 0 1 2 3 0 1 ...

Mais oui bien sûr :slight_smile: Je le savais que j'avais une usine à gaz. J'avais dans la tête que le modulo c'était la partie décimale. Merci pour les octets gagnés.

il suffit d’utiliser write() et le N° du caractère, donc mettre 0 dans votre tableau barre

avec un écran I2C vous pouvez tester cela.

#include <LiquidCrystal_I2C.h>    // https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
const byte nbCols = 20;
const byte nbLines = 4;
LiquidCrystal_I2C lcd( 0x3F, nbCols, nbLines); // my LCD is at I2C address 0x3F, 20 cols, 4 rows

uint8_t backSlash[8] = {0b10000, 0b01000, 0b01000, 0b00100, 0b00100, 0b00010, 0b00010, 0b00001};
const char animation[] = {'|', 0, '-', '/'};

void spin(const uint8_t colonne = 0, const uint8_t ligne = 0)
{
  for (uint8_t c = 0; c < sizeof animation; c++) {
    lcd.setCursor(colonne, ligne);
    lcd.write(animation[c]);
    delay(400);
  }
}

void setup() {
  lcd.begin();
  lcd.createChar(0, backSlash);
  lcd.backlight();
  lcd.clear();
}

void loop() {spin();}

ou avec votre écran sans I2C (je n’ai pas testé mais je suppose que ceci doit fonctionner)

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 7, 5, 4, 3, 2); // RS, E, D4, D5, D6, D7
uint8_t backSlash[8] = {0b10000, 0b01000, 0b01000, 0b00100, 0b00100, 0b00010, 0b00010, 0b00001};
const char animation[] = {'|', 0, '-', '/'};

void spin(const uint8_t colonne = 0, const uint8_t ligne = 0)
{
  for (uint8_t c = 0; c < sizeof animation; c++) {
    lcd.setCursor(colonne, ligne);
    lcd.write(animation[c]);
    delay(400);
  }
}

void setup() {
  lcd.begin(16, 2);
  lcd.createChar(0, backSlash);
  lcd.backlight();
  lcd.clear();
}

void loop() {
  spin();
}

J-M-L:
il suffit d’utiliser write() et le N° du caractère, donc mettre 0 dans votre tableau barre

avec un écran I2C vous pouvez tester cela.

#include <LiquidCrystal_I2C.h>    // https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

const byte nbCols = 20;
const byte nbLines = 4;
LiquidCrystal_I2C lcd( 0x3F, nbCols, nbLines); // my LCD is at I2C address 0x3F, 20 cols, 4 rows

uint8_t backSlash[8] = {0b10000, 0b01000, 0b01000, 0b00100, 0b00100, 0b00010, 0b00010, 0b00001};
const char animation = {’|’, 0, ‘-’, ‘/’};

void spin(const uint8_t colonne = 0, const uint8_t ligne = 0)
{
 for (uint8_t c = 0; c < sizeof animation; c++) {
   lcd.setCursor(colonne, ligne);
   lcd.write(animation[c]);
   delay(400);
 }
}

void setup() {
 lcd.begin();
 lcd.createChar(0, backSlash);
 lcd.backlight();
 lcd.clear();
}

void loop() {spin();}




ou avec votre écran sans I2C (je n'ai pas testé mais je suppose que ceci doit fonctionner)


#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 7, 5, 4, 3, 2); // RS, E, D4, D5, D6, D7
uint8_t backSlash[8] = {0b10000, 0b01000, 0b01000, 0b00100, 0b00100, 0b00010, 0b00010, 0b00001};
const char animation = {’|’, 0, ‘-’, ‘/’};

void spin(const uint8_t colonne = 0, const uint8_t ligne = 0)
{
 for (uint8_t c = 0; c < sizeof animation; c++) {
   lcd.setCursor(colonne, ligne);
   lcd.write(animation[c]);
   delay(400);
 }
}

void setup() {
 lcd.begin(16, 2);
 lcd.createChar(0, backSlash);
 lcd.backlight();
 lcd.clear();
}

void loop() {
 spin();
}

Super merci J-M-L! J’ai appris 2 trois trucs au passage. Par contre il n’y a pas de commande de backlight dans LiquidCrystal.h

Ok - virez juste cette ligne alors

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.