Commande d'un LCD avec le port série

Bonjours à tous !

J'ai adpaté les prog. que j'ai vu dans le Playground pour faire fonctionner mon LCD 1x16 (qui marche en 2x8) sur 4 bits. Ensuite j'ai rajouté un petit bout pour le commander avec le port série en passant par le Serial Monitor, mais quand je tape un mot de 6 caractères par exemple, il y a 10 cases qui sont noires, alors qu'elles devraient êtres vides. Je voudrais donc savoir comment résoudre ce probléme ? et comment indiquer au programme qu'il n'y a en entrée que 6 caractéres, c'est à dire quel est l'équivalent de 'NULL' pour l'entrée série ? :-/

Merci

int DI = 12;
int RW = 11;
int DB[] = {
  7, 8, 9, 10};
int Enable = 2;

int count = 0;

char texte[16] = {
  ' ',  ' ', 'A', 'r', 'd', 'u', 'i', 'n', 'o', 'B', 'o', ' a', 'r', 'd', ' ', ' '};

int a = 0;
int i;

int decalageLettre = 0;


void LcdCommandWrite(int value) {
  int i = 0;
  int value1 = 0;
  value1 = value;

  value1 >>= 4;        
  for (i=DB[0]; i <= DI; i++) {
    digitalWrite(i,value1 & 01);
    value1 >>= 1;
  }
  digitalWrite(Enable,LOW); 
  delayMicroseconds(1);
  digitalWrite(Enable,HIGH);
  delayMicroseconds(1);
  digitalWrite(Enable,LOW);
  delayMicroseconds(1); 
  delay(1);

  for (i=DB[0]; i <= DB[3]; i++) { 
    digitalWrite(i,value & 01);
    value >>= 1; 
  }
  value >>= 4;                
  for (i=RW; i <= DI; i++) {
    digitalWrite(i,value & 01);
    value >>= 1;
  }
  digitalWrite(Enable,LOW);
  delayMicroseconds(1);
  digitalWrite(Enable,HIGH);
  delayMicroseconds(1);
  digitalWrite(Enable,LOW);
  delayMicroseconds(1);
}

void LcdDataWrite(int value) {
  int i = 0;
  int value1 = 0;
  digitalWrite(DI, HIGH);
  digitalWrite(RW, LOW);
  value1 =value;
  value1 >>= 4;                     
  for (i=DB[0]; i <= DB[3]; i++) {
    digitalWrite(i,value1 & 01);
    value1 >>= 1;
  }
  digitalWrite(Enable,LOW);  
  delayMicroseconds(1);
  digitalWrite(Enable,HIGH);
  delayMicroseconds(1);
  digitalWrite(Enable,LOW);
  delayMicroseconds(1);  
  delay(1);
  digitalWrite(DI, HIGH);
  digitalWrite(RW, LOW);
  for (i=DB[0]; i <= DB[3]; i++) {
    digitalWrite(i,value & 01);
    value >>= 1;
  }
  digitalWrite(Enable,LOW);   
  delayMicroseconds(1);
  digitalWrite(Enable,HIGH);
  delayMicroseconds(1);
  digitalWrite(Enable,LOW);
  delayMicroseconds(1); 
}


void setup (void) {

  int i = 0;
  for (i=Enable; i <= DI; i++) {
    pinMode(i,OUTPUT);
  }
  delay(100);

  LcdCommandWrite(0x03);
  delay(64);
  LcdCommandWrite(0x03);
  delay(50);
  LcdCommandWrite(0x03);
  delay(50);
  LcdCommandWrite(0x02);
  delay(50);
  LcdCommandWrite(0x28);

  delay(20);
  LcdCommandWrite(0x06);
  delay(20);
  LcdCommandWrite(0x0E);
  delay(20);
  LcdCommandWrite(0x01); 
  delay(100);

  LcdCommandWrite(0x80);
  delay(20);

  LcdCommandWrite(0x0E);
  delay(10);


  Serial.begin(9600);


}

void serialInput() {

  for(a=0; a<16; a++) {
    texte[a] = Serial.read();
  }

}

void loop (void) {

  if(Serial.available() > 0) {
    serialInput();
  }
  
  LcdCommandWrite(0x02);
  delay(10);

  for(i=0; i<8; i++) {
    LcdDataWrite(texte[i]); 
    delay(decalageLettre);
  }

  LcdCommandWrite(0xC0);
  delay(10);

  for(i=8; i<16; i++) {
    LcdDataWrite(texte[i]);
    delay(decalageLettre);
  }
  
  delay(1000);

}

Bonsoir,

Je ne sais pas si j'ai bien comprit le problème, mais je tente une réponse.

Donc, c'est simplement parce que les codes des caractères envoyés sur le port série ne sont pas ceux à envoyer au port série. Par exemple quand dans le erminal tu frappe la barre espace, l'Arduino recoit le nombre 32 qui n'est pas forçément le code du caractère à envoyer au lcd.

Autre possibilité, ton terminal envoie des caractères sur deux octets genre UTF8, ... auquel cas un carctère sur 2 est en vrac.

J'aurais essayé, dis moi si cela t'aide...

Oui en effet ça pourrait marcher, il suffirait en fait de regarder le code caractére pour l'espace et de complèter l'écran avec. Par exemple, un mot de 5 lettres, on rajoute 11 espace ... ça vaut le coup d'essayer :smiley:
Merci, je te dit si ça marche dés que possible. :wink:
a+