[Resolu] affichage LCD par PCF8576 sur I2C

Bonjour

Effectivement, tu avais raison : le pointeur s'incrémente tout seul à chaque octet envoyé. Le PCF8576 possède deux banques, lors d'un multiplexage 1:2, seule une banque de 20 octets est utilisée.
Donc, en écrivant successivement 20 octets, on "fait la boucle".

Voilà ci-dessous mon code, modifié pour envoyer successivement les 20 octets, avec chaque fois un bit supplémentaire. Cela pour voir l'ordre d'affichage des segments.

Comme tu pourras voir sur la vidéo, l'ordre d'affichage des segments n'est pas "naturel" et je ne vois pas d'autre solution que de mapper chaque segments afin d'écrire à quoi correspond chaque chiffre selon sa position. Ca parait quand même curieux comme conception, mais peut être que les contraintes de câblage empechaient de les relier d'une façon plus logique. (c'est la seule explication que j'ai trouvé).

Voilà la vidéo, on voit sur l'écran, derrière, les octest/bits envoyés.

Le code :

#define LIAISON 128
#define NOLIAISON 0

//MODE SET
#define MODESET 64

#define MODE_NORMAL 0
#define MODE_POWERSAVING 16

#define DISPLAY_DISABLED 0
#define DISPLAY_ENABLED 8

#define BIAS_THIRD 0
#define BIAS_HALF 4

#define DRIVE_STATIC 1
#define DRIVE_2 2
#define DRIVE_3 3
#define DRIVE_4 0

byte set_modeset = MODESET | MODE_NORMAL | DISPLAY_ENABLED | BIAS_HALF | DRIVE_2; //

//BLINK
#define BLINK  112

#define BLINKING_NORMAL 0
#define BLINKING_ALTERNATION 4

#define BLINK_FREQUENCY_OFF 0
#define BLINK_FREQUENCY2 1
#define BLINK_FREQUENCY1 2
#define BLINK_FREQUENCY05 3

byte set_blink = BLINK | BLINKING_ALTERNATION | BLINK_FREQUENCY_OFF; //

//LOADDATAPOINTER
#define LOADDATAPOINTER  0

byte set_datapointer = LOADDATAPOINTER | 0; //11 pour le départ. 15 max : 63 (58?)


//BANK SELECT
#define BANKSELECT 120

#define BANKSELECT_O1_RAM0 0
#define BANKSELECT_O1_RAM2 2

#define BANKSELECT_O2_RAM0 0
#define BANKSELECT_O2_RAM2 1

byte set_bankselect = BANKSELECT | BANKSELECT_O1_RAM0 | BANKSELECT_O2_RAM0;

#define DEVICE_SELECT 96
byte set_deviceselect = DEVICE_SELECT;

#define PCF8576 B111000

#include <Wire.h>

void setup(){
  Serial.begin(9600);
  Wire.begin();
  delay(1000); //allow lcd to wake up.

  //COMMANDS
  Wire.beginTransmission(PCF8576);
  Wire.write(LIAISON | set_modeset); //MODE SET 
  Wire.write(LIAISON | set_deviceselect); //DEVICE SELECT
  Wire.write(LIAISON | set_bankselect); //BANK SELECT 1
  Wire.write(NOLIAISON | set_blink); //BLINK
  Wire.endTransmission();  
}

void loop(){
    //Envoi de 10 octets
    for (byte j = 0; j < 10; j++){
      
      byte envoi = 1;
      //8 bits / octets 
      for (byte i = 0; i < 8; i++){   
        
        //Monitoring
        Serial.print ("Envoi ");
        Serial.print (j+1);
        Serial.print (" octet(s) : ");
        for (byte k = 0; k <= j-1; k++){  Serial.print ("11111111 "); }
        Serial.println (envoi,BIN);
               
        //Envoi       
        Wire.beginTransmission(PCF8576);
        Wire.write(NOLIAISON | set_deviceselect);
        //datas
        for (byte k = 0; k <= j-1; k++){  Wire.write(0xFF); }
        Wire.write(envoi);
        for (byte k = j; k <= 8; k++){  Wire.write(0); }
        Wire.endTransmission();
        
        envoi = envoi << 1 | 1; //rotation à gauche et ajout d'un bit  (ou * 2 + 1;)
        delay(250);
      }
    }
}