Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : Jérémy
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
paulfjujo a écrit :Source du message extended mode ...
Code : Tout sélectionner
I2C1_Wr(0b00100100); // =0x24 .... was 0x34 !
Oups ,erreur de commentaire . Il faut bien le mettre en 0x34 . Je fais tellement de test que je ne sais plus si j'ai essayé en mettant extended_mode ... . Ça ferais un 0x35 .
Erreur corrigé dans le code .
A essayé, ce soir on ne sait jamais ! , je suis prêt a tout essayer au point oui j'en suis !
LCD en I²C
inspire toi de ce code trouvé sur le net !
Code : Tout sélectionner
Fichier http://www.jacquet80.eu/pic/prgm/lcd_i2c.c, affiché grâce au splendide SyntaxHighlighter d'Alex Gorbatchev.
view source
print
?
001 /*
002 Programme de démonstration de pilotage d'un afficheur LCD I2C avec un
003 PIC 18F2455. Pour le schéma et les explications, voir :
004
005 <http://www.jacquet80.eu/pic/>
006
007 L'afficheur LCD I2C utilisé était le BTHQ 21605AV-YETF-LED04-I2C-5V de
008 Batron. Le programme et/ou le schéma sera à adapter pour un autre modèle
009 d'afficheur (brochage différent, timing différent, etc.)
010
011 Copyright (C) 2009 Christophe Jacquet <http://www.jacquet80.eu/>
012
013 This program is free software: you can redistribute it and/or modify
014 it under the terms of the GNU General Public License as published by
015 the Free Software Foundation, either version 3 of the License, or
016 (at your option) any later version.
017
018 This program is distributed in the hope that it will be useful,
019 but WITHOUT ANY WARRANTY; without even the implied warranty of
020 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
021 GNU General Public License for more details.
022
023 You should have received a copy of the GNU General Public License
024 along with this program. If not, see <http://www.gnu.org/licenses/>.
025 */
026
027
028 #include <p18f4550.h>
029 #include <i2c.h>
030
031 #pragma config FOSC = HSPLL_HS // mode oscillateur extérieur HS, PLL activée, HS utilisé pour l'USB ;
032 #pragma config PLLDIV = 5 // division par 5 de la fréquence avant la PLL (prescaler) car il FAUT TOUJOURS du 4 MHz. Quartz à 20 MHz => PLLDIV = 5
033 #pragma config CPUDIV = OSC4_PLL6 // division par 4 de la fréquence en sortie de la PLL (postscaler).
034
035 #pragma config MCLRE = OFF
036 #pragma config WDT = OFF
037 #pragma config LVP = OFF
038
039
040 // Adresse I2C standard des afficheurs LCD
041 #define LCDADDR 0x76
042
043 // Redéfinition des trois fonctions write(), stop() et start()
044 // pour qu'elles fassent d'abord un idle()
045 void iic_write(unsigned char c) {
046 IdleI2C();
047 WriteI2C(c);
048 }
049
050 void iic_stop(void) {
051 IdleI2C();
052 StopI2C();
053 }
054
055 void iic_start(void) {
056 IdleI2C();
057 StartI2C();
058 }
059
060 void Display_init(void);
061 void Write_text(void);
062
063
064 // Initialise le LCD
065 void Display_init(void) {
066 iic_start();
067 iic_write(LCDADDR); // LCD's I2C slave address
068 iic_write(0x00); // Control byte for instruction
069 iic_write(0x34); // DL: 8 bits, M: 16 by two line display, SL: 1:18, H: normal instruction set
070 iic_write(0x0C); // D: Display on, C: curser off, B: blink off
071 iic_write(0x06); // I/D: increment, S: no shift
072
073 iic_write(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
074 iic_write(0x04); // P: left to right, Q: top to bottom
075 iic_write(0x10); // TC1: 0, TC2: 0
076 iic_write(0x42); // HV Stages 3
077 iic_write(0x9f); // set Vlcd, store to VA
078 iic_write(0x34); // DL: 8 bits, M: two line, SL: 1:18, H: normal instruction set
079
080 iic_write(0x80); // DDRAM Address set to 00hex
081 iic_write(0x02); // return home
082 iic_stop();
083 }
084
085
086 // Affiche des caractères
087 void Write_text(void) {
088 int i;
089 iic_start();
090 iic_write(LCDADDR); // I2C slave Address
091 iic_write(0x00); // Control byte for Instruction
092 iic_write(0x80); // DDRAM Address set to 00hex
093 iic_stop();
094
095 iic_start();
096 iic_write(LCDADDR); // I2C slave Adress
097 iic_write(0x40); // Control byte for Data
098 for (i=1;i<=16;i++) {
099 iic_write(0xC0+i); // Write ABCDE....
100 }
101 iic_stop();
102
103 iic_start();
104 iic_write(LCDADDR); // I2C slave Adress
105 iic_write(0x00); // Control byte for Instruction
106 iic_write(0xc0); // DDRAM Address set to 10hex
107 iic_stop();
108
109 iic_start();
110 iic_write(LCDADDR); // I2C slave Address
111 iic_write(0x40); // Control byte for Data
112 for (i=1;i<=16;i++) {
113 iic_write(0xe0+i); // Write abcde....
114 }
115 iic_stop();
116 }
117
118
119 // Affiche deux lignes de texte
120 void Write_2lines(const rom char* t, const rom char*b) {
121 int i;
122 iic_start();
123 iic_write(LCDADDR); // LCD's I2C slave Address
124 iic_write(0x00); // Control byte for Instruction
125 iic_write(0x80); // DDRAM Address set to 00hex
126 iic_stop();
127
128 iic_start();
129 iic_write(LCDADDR); // I2C slave Adress
130 iic_write(0x40); // Control byte for Data
131 for (i=0;i<16 && t[i] !=0;i++) {
132 iic_write(0x80+t[i]); // Write ABCDE....
133 }
134 iic_stop();
135
136 iic_start();
137 iic_write(LCDADDR); // I2C slave Adress
138 iic_write(0x00); // Control byte for Instruction
139 iic_write(0xc0); // DDRAM Address set to 10hex
140 iic_stop();
141
142 iic_start();
143 iic_write(LCDADDR); // I2C slave Address
144 iic_write(0x40); // Control byte for Data
145 for (i=0;i<16 && b[i] != 0;i++) {
146 iic_write(0x80+b[i]); // Write abcde....
147 }
148 iic_stop();
149 }
150
151
152 void main(void)
153 {
154 // PORTB en entrée numérique
155 TRISB = 0xFF;
156 ADCON1 = 0xE;
157
158 // En mode I2C Master, SSPADD contient la valeur de configuration
159 // du générateur de débit binaire (baud rate generator). La valeur
160 // suivante donne de bons résultats
161 SSPADD = 0x27;
162
163 OpenI2C(MASTER, SLEW_OFF);
164
165 Display_init();
166 //Write_text();
167 Write_2lines("I2C LCD Display ", "www.jacquet80.eu");
168
169 for(;;) {}
170 }
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonsoir,
Merci Pat pour le lien . Je l'avais déjà essayé, mais par acquis de conscience, j’ai ré-essayé ce soir. Toujours rien, cet écran reste inexorablement vide!
J'ai bien évidemment essayé en changeant des variables entre chaque test . genre 0x00 en 0x80 . 0x34 en 0x35 etc ... toutes les variables qui pouvaient être ambiguë je les ai modifier .
Je crois que je suis obligé de poster sur futura , voir si quelqu'un connait ce module PCF2119 . Ça m’embête un peu de créer un forum , et d'aller cherche les soluces ailleurs
Mais vraiment la je sèche ! ca même avoir de caractères , je devrais voir le curseur à minima !
Merci Pat pour le lien . Je l'avais déjà essayé, mais par acquis de conscience, j’ai ré-essayé ce soir. Toujours rien, cet écran reste inexorablement vide!
Code : Tout sélectionner
#define LCD_ADDR 0x74 // 0b0111 0100
#define LCD_CLEAR 0x01 // 0b0000 0001
/*################################################################################*/
/*######################### INITIALISATION ###############################*/
/*################################################################################*/
void Ecran_init() // routine d'initialisation page 64 de la DS
{
I2C1_Start();
I2C1_Wr(LCD_ADDR); // Envoie l'adresse de l'esclave 0b0111 0100 = 0x74
// Envoi CONTROL_Mode // bit7 -> 0=last control byte, 1=another control byte
// bit6 -> 0=registre inst , 1=registre Data
I2C1_Wr(0b00000000); // bit5à0 -> 0
// 0b00000000 = 0x00
// Envoi d'un function_set // bit7à5 valeurs fixes : 001
// bit4: 0:2x4bit, 1:8 bits
I2C1_Wr(0b00110100); // bit3: 0 Non utilisé
// bit2: 0: 1ligne/32char, 1: 2lignes/16char
// bit1: 0: 1/18 multiplex, 1: 1/9 multiplex
// bit0: 0: standard instr., 1: extended instr.
// 0b00110100 = 0x34
// Envoi d'un display_ctl // bit7à3: valeur fixe : 00001
// bit2: 0:display off, 1:display On
I2C1_Wr(0b00001100); // bit1: 0:cursor off, 1:cursor On
// bit0: 0:clignotement off, 1:On
// 0b00001110 = 0x0C
// Envoi Entry_mode_set // bit7à2: valeur fixe : 000001
// bit1: 0:Decremente l'adresse , 1:Incremente (curseur vers la droite)
I2C1_Wr(0b00000110); // bit0: 0:No shift , 1: Shift display
// 0b00000110 = 0x06
I2C1_Wr(0x35);
I2C1_Wr(0x04);
I2C1_Wr(0x10);
I2C1_Wr(0x42);
I2C1_Wr(0x9f);
I2C1_Wr(0x34);
I2C1_Wr(0x80);
I2C1_Wr(0x02);
I2C1_Stop(); // Fin de l'I2C
}
/*################################################################################*/
/*###################### PROGRAMME PRINCIPAL #############################*/
/*################################################################################*/
void main()
{
ANSELD = 0;
PORTD = 0;
TRISD = 0;
Delay_ms(100); // Attente pour stabilisation apres l'allumage
I2C1_Init(100000); // Initialisation de l'I2C
LATD = 1; // Allume une led pour declenchement analyseur logique
Ecran_init(); // On va initialiser notre écran
/*################################################################################*/
/*######################### BOUCLE INFINIE ###############################*/
/*################################################################################*/
while(1)
{
// Affiche des caractères
int i;
I2C1_Start();
I2C1_Wr(LCD_ADDR); // I2C slave Address
I2C1_Wr(0x00); // Control byte for Instruction
I2C1_Wr(0x80); // DDRAM Address set to 00hex
I2C1_Stop();
I2C1_Start();
I2C1_Wr(LCD_ADDR); // I2C slave Adress
I2C1_Wr(0x40); // Control byte for Data
for (i=1;i<=16;i++) {
I2C1_Wr(0xC0+i); // Write ABCDE....
}
I2C1_Stop();
I2C1_Start();
I2C1_Wr(LCD_ADDR); // I2C slave Adress
I2C1_Wr(0x00); // Control byte for Instruction
I2C1_Wr(0xc0); // DDRAM Address set to 10hex
I2C1_Stop();
I2C1_Start();
I2C1_Wr(LCD_ADDR); // I2C slave Address
I2C1_Wr(0x40); // Control byte for Data
for (i=1;i<=16;i++) {
I2C1_Wr(0xe0+i); // Write abcde....
}
I2C1_Stop();
/* //------------------ INSTRUCTION POUR EFFACER L'ECRAN --------------------------
I2C1_Start();
I2C1_Wr(LCD_ADDR); // Adresse esclave
I2C1_Wr(0b10000000); // on passe en mode Control pour envoyer des instructions
I2C1_Wr(LCD_CLEAR); // Efface l'écran
I2C1_Wr(LCD_HOME); // replace le curseur au début
I2C1_Stop();
//------------------ ENVOI DES DATAS POUR AFFICHAGE --------------------------
I2C1_Start();
I2C1_Wr( LCD_ADDR ); // Envoie l'adresse de l'esclave 0b01110100 = 0x74
// Envoi DATA_Mode // bit7 -> 0=last control byte, 1=another control byte
// bit6 -> 0=registre inst , 1=registre Data
I2C1_Wr( 0b01000000 ); // bit5à0 -> 0
// 0b01000000 = 0x40
I2C1_Wr(0x50 ); // Affiche la lettre "P"
I2C1_Wr(0x48 ); // Affiche la lettre "H"
I2C1_Wr(0x53 ); // Affiche la lettre "S"
I2C1_Stop();
//------------------ VERIFIE QUE LE PROGRAMME TOUNE --------------------------
LATD = 1; // Allume une led test
delay_ms(150);
LATD = 0; // Pour verifier que le programme tourne
delay_ms(150); // Je fais clignoter une led */
}
} J'ai bien évidemment essayé en changeant des variables entre chaque test . genre 0x00 en 0x80 . 0x34 en 0x35 etc ... toutes les variables qui pouvaient être ambiguë je les ai modifier .
Je crois que je suis obligé de poster sur futura , voir si quelqu'un connait ce module PCF2119 . Ça m’embête un peu de créer un forum , et d'aller cherche les soluces ailleurs
Mais vraiment la je sèche ! ca même avoir de caractères , je devrais voir le curseur à minima !
LCD en I²C
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Test 0x76 à la place de 0x74 , si ça séquence est bonne il y plus que ça qui peut changer.
Oui j'ai essayé . RIEN !!!!
Quand je mets 0x76 en adresse slave, les accusés de réception ne se font pas à l'analyseur ( No ACK) . Je suis quasiment sur que mon adresse est 0x74 .
Tu es sur de ton câblage et des résistances de rappel ?
Je pense qu'en ayant ma trame I²C a l'analyseur , il n'y as pas de problème avec le hard . De plus je me sert des connectiques déjà existante sur ma plaque d'essai , à la place de l'eeprom j'ai branché l’écran pour me servir des R de pull up et de la tension !
Vraiment je sais plus quoi faire
LCD en I²C
temps de réponse 250ms
tu devrais attendre plusieurs secondes entre chaque boucle
tension d'alime 4V
max 4.2V !!
http://www.farnell.com/datasheets/1722538.pdf
tu devrais attendre plusieurs secondes entre chaque boucle
tension d'alime 4V
max 4.2V !!
http://www.farnell.com/datasheets/1722538.pdf
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour Pat, et merci encore de continuer a m'aider en tout cas
J'en ai acheté 5 de ces écrans , ca m’embête de baisser les bras . Mais bon, j'ai posté sur FUTURA pour essayer de trouver des gens qui connaissent ce driver "particulier".
Je ne suis pas certain à 100% de mon montage hard. C'est possible mais ça me parait quand même peu probable . Je vais vous faire une photo + un schéma de ce que j'ai fait . exactement .
J'alim tout en 3.3V sur ma carte . Schéma à suivre .
D'accord je mettrais une seconde de 1 delay pour le clignotement . c'est une bonne idée
J'en ai acheté 5 de ces écrans , ca m’embête de baisser les bras . Mais bon, j'ai posté sur FUTURA pour essayer de trouver des gens qui connaissent ce driver "particulier".
Je ne suis pas certain à 100% de mon montage hard. C'est possible mais ça me parait quand même peu probable . Je vais vous faire une photo + un schéma de ce que j'ai fait . exactement .
tension d'alime 4V
max 4.2V !!
J'alim tout en 3.3V sur ma carte . Schéma à suivre .
temps de réponse 250ms
tu devrais attendre plusieurs secondes entre chaque boucle
D'accord je mettrais une seconde de 1 delay pour le clignotement . c'est une bonne idée
LCD en I²C
LCD en I²C
- paulfjujo

Maître- Messages : 3260
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour,
j'ai trouvé un fil sur un LCD similaire BATRON
le probleme serait sur un decalage de 0xC0 des caracteres ! pour afficher 'A'
en fait le decalage de base serait plutot de 127
127 + 65 (code de A) =192 = 0xC0
j'ai trouvé un fil sur un LCD similaire BATRON
le probleme serait sur un decalage de 0xC0 des caracteres ! pour afficher 'A'
en fait le decalage de base serait plutot de 127
127 + 65 (code de A) =192 = 0xC0
Code : Tout sélectionner
The LCD display is working.
There is indeed a difference in the Batron LCD display used in Avr Applnote AVR155, and the batron that i used.
AVR155 uses Batron BT21605V-SRE-I2C-COG
I Use BATRON BTHQ 21605AV-YETF-LED04-I2C-5V
The ..COG type means Chip-On-Glas. While
mine is an LCD mounted on a PCB.
The contrast LCD reset and the Contrast steering signals are brought outside on the COG type. On the PCB version these features have to be set via I2C commands.
So the fact that my LCD screen stayed BLANK was due to a contrast problem.
After initialising the constrast Values the LCD worked.
You can find a list of initialisation command on the website DATA-MODULE AG
www.data-module.de Click further on
- Support
- Driver
- PCF2119 BT21605
Here they are anyhow.
//Initialisation sample and Ram writing routine for PCF2119
void Display_init(void)
{
Reset=1;
delay_ms(5);
Reset=0;
delay_ms(5000);
iic_start();
iic_write(0x76); // i2c slave Address
iic_write(0x00); // Control byte for Instruction
iic_write(0x34); // DL: 8 bits, M: 16 by two line display, SL: 1:18, H: normal instruction set
iic_write(0x0C); // D: Display on, C: curser off, B: blink off
iic_write(0x06); // I/D: increment, S: no shift
iic_write(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
iic_write(0x04); // P: left to right, Q: top to bottom
iic_write(0x10); // TC1: 0, TC2: 0
iic_write(0x42); // HV Stages 3
iic_write(0x9f); // set Vlcd, store to VA
iic_write(0x34); // DL: 8 bits, M: two line, SL: 1:18, H: normal instruction set
iic_write(0x80); // DDRAM Address set to 00hex
iic_write(0x02); // return home
iic_stop();
}
void Write_text(void)
{
int i;
iic_start();
iic_write(0x76); // i2c slave Address
iic_write(0x00); // Control byte for Instruction
iic_write(0x80); // DDRAM Address set to 00hex
iic_stop();
iic_start();
iic_write(0x76); // i2c slave Adress
iic_write(0x40); // Control byte for Data
for (i=1;i<=16;i++)
{
iic_write(0xC0+i); // Write ABCDE....
}
iic_stop();
iic_start();
iic_write(0x76); // i2c slave Adress
iic_write(0x00); // Control byte for Instruction
iic_write(0xc0); // DDRAM Address set to 10hex
iic_stop();
iic_start();
iic_write(0x76); // i2c slave Address
iic_write(0x40); // Control byte for Data
for (i=1;i<=16;i++)
{
iic_write(0xe0+i); // Write abcde....
}
iic_stop();
}
void upside_down(void)
{
iic_start();
iic_write(0x76);
iic_write(0x00); // Control byte for Instruction
iic_write(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
iic_write(0x07); // P=1; Q=1;
iic_stop();
}
void normal(void)
{
iic_start();
iic_write(0x76);
iic_write(0x00); // Control byte for Instruction
iic_write(0x35); // DL: 8 bits, M: 16 by two line, SL: 1:18, H: extended instruction set
iic_write(0x04); // P=0; Q=0;
iic_stop();
}
Thanks for all reply's
Fabrizio
LCD en I²C
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Merci aussi paulfjujo ,
j'ai essayé ce code aussi, en le modifiant pour mikroC . Je reste persuadé qu'une fois qu'on aura réussit à afficher ( donc initialiser) le curseur ce sera bon.
Je crois que j’ai essayé tout les codes du net, en fait !
Je me dis que ça ne peut etre qu'un probléme hard du coup . mes trames I2C ça c'est une certitude, elle partent bien, et comme j'ai l'ACK, normalement c'est quelle sont bien reçu ! donc je ne vois vraiment pas a part le contraste . Mais j’ai essayé d'incliner l’écran pour avoir un autre angle de vision , histoire de voir si je ne voyais pas un petit quelques choses s'affiché . Rien du tout sur tous les essais que j'ai fais .
PS : sur futura mon post a été fermé
, je m'en doutais un peu !
j'ai essayé ce code aussi, en le modifiant pour mikroC . Je reste persuadé qu'une fois qu'on aura réussit à afficher ( donc initialiser) le curseur ce sera bon.
Je crois que j’ai essayé tout les codes du net, en fait !
Je me dis que ça ne peut etre qu'un probléme hard du coup . mes trames I2C ça c'est une certitude, elle partent bien, et comme j'ai l'ACK, normalement c'est quelle sont bien reçu ! donc je ne vois vraiment pas a part le contraste . Mais j’ai essayé d'incliner l’écran pour avoir un autre angle de vision , histoire de voir si je ne voyais pas un petit quelques choses s'affiché . Rien du tout sur tous les essais que j'ai fais .
PS : sur futura mon post a été fermé
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités

