Bonjour
J'ai récupéré par hasard un écran LCD piloté par un CI PCF8576T.
J'ai eu la drole d'idée de vouloire le faire fonctionner, et malgré beaucoup de temps passé dessus, je n'arrive pas à avoir un résultat satisfaisant.
Voilà où j'en suis :
L'écran LCD comporte deux lignes, avec un total de 71 segments (10 caractères et un point décimal). D'après la doc du PCF8576, cela correspond à un écran multiplexé à deux backpanes, et cela concorde avec ce que je vois sur le circuit : les broches 14 et 16 (BP2 et BP3) ne sont pas connectées.
La doc du PCF 8576 est disponible par exemple ici : PCF8576T datasheet(1/40 Pages) PHILIPS | Universal LCD driver for low multiplex rates
Je crois me cOnformer strictement à la doc, j'ai essayé plusieurs valeurs, et le meilleur résultat que j'ai obtenu est de pouvoir afficher les 7 segments du caractère droit de la ligne supérieure. Dès l'envoi du premier bit du seocnd octet, les segments ne s'affichent plus dans l'ordre.
Je me pose ces questions :
-Qu'est ce que j'ai raté ou mal compris avec le I2C, ou dans la prog du PCF8576 ?
-Pourquoi suis-je obligé de commencer avec le DATA POINTER à 3 pour avoir un résultat à peu près cohérent ?
-Dois je obligatoirement avoir la doc de l'écran LCD pour pouvoir l'utiliser ? (il s'agissait d'un compteur journalier/kilométrique de 406 peugeot).
Qui pourrait m'aider ?
Merci.
Voilà le code, dans son expression la plus simple :
/*
Affichage LCD contrôllé opar PCF8576 chips sur bus I2C.
*/
#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
int set_modeset = MODESET | MODE_POWERSAVING | 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
int set_blink = BLINK | BLINKING_NORMAL | BLINK_FREQUENCY_OFF; //
//LOADDATAPOINTER
#define LOADDATAPOINTER 0
int set_datapointer = LOADDATAPOINTER | 3; //3 pour le départ.
//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
int set_bankselect = BANKSELECT | BANKSELECT_O1_RAM0 | BANKSELECT_O2_RAM0;
#define PCF8576 B111000
#include <Wire.h>
void setup(){
Wire.begin();
delay(1000); //allow lcd to wake up.
}
void loop(){
Wire.beginTransmission(PCF8576);
//COMMAND
Wire.write(LIAISON | set_modeset); //MODE SET
Wire.write(LIAISON | set_bankselect); //BANK SELECT
Wire.write(LIAISON | set_blink); //BLINK
Wire.write(NOLIAISON | set_datapointer); //LOAD DATA POINTER
//DATA
Wire.write(B11111110); //affiche les 7 premiers segments, dans l'ordre dbcagfe (voir doc PCF8576 page 18).
//Wire.write(B1001); //L'envoi de cet octet n'affiche plus les segments dans leur suite 'logique'. Why ?
Wire.endTransmission();
delay(1000);
}
IMAGES :
http://img96.xooimage.com/views/5/b/f/dscf0397-42ec4fc.jpg/
http://img98.xooimage.com/views/b/5/f/dscf0340-42ec4e7.jpg/