et biglo pour sonner ...
pourtant chez moi ça fonctionnait. Ils ont peut-être changé les PCF8574
Ton lien instructable est bizarre ... son seul défaut est de fonctionner
Code: Select all
///**********************************************************************
//* Filename : I2CLCD1602.c
//* Description : Use the LCD display data
//* Author : freenove
//* modification: 2017/04/18
//**********************************************************************/
//compilation par
//gcc -o <sortie> <fichier.c> -lwiringPi -l WiringPiDev
//////////////////// adresse 0x38 //////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <wiringPi.h>
#include <pcf8574.h>
#include <lcd.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
//#define pcf8574_address 0x27 // default I2C address of Pcf8574 (CMS)
#define pcf8574_address 0x3F // default I2C address of Pcf8574A (DIL)
//#define pcf8574_address 0x38 // default I2C address of Pcf8574A
#define BASE 64 // BASE is not less than 64
//////// Define the output pins of the PCF8574, which are directly connected to the LCD1602 pin.
#define RS BASE+0
#define RW BASE+1
#define EN BASE+2
#define LED BASE+3
#define D4 BASE+4
#define D5 BASE+5
#define D6 BASE+6
#define D7 BASE+7
int lcdhd;// used to handle LCD
#define FILENAME "/tmp/LCD"
/*
* print_ligne_8:
* imprime une ligne sur l'afficheur 2*8 caracteres
*********************************************************************************
*/
void print_ligne_8 (char *chaine)
//imprimer une ligne en deux bouts
//afficheur en 2*8 caracteres
{
int i=0;
char ligne[]="01234567890123456789";
lcdHome(lcdhd);
usleep (20000);
strncpy(ligne, chaine,16);
ligne[16]=0 ;
lcdPosition(lcdhd,0,0);
while (ligne[i] !=0 )
{
if (i == 8)
{
lcdPosition(lcdhd,0,1);
}
lcdPutchar(lcdhd,ligne[i++]) ;
}
if (i < 16)
{
for( ; i<16 ; i++)
{
if (i == 8) lcdPosition(lcdhd,0,1);
lcdPutchar(lcdhd,' ');
}
}
}
/*
* print_ligne:
* imprime une ligne sur l'afficheur 2*16 caracteres (pas de decoupage de ligne)
*********************************************************************************
*********************************************************************************
*/
void print_ligne_16 (char *chaine)
//imprimer une ligne complete
//afficheur en 2x16 caracteres
//ne va que sur la premiere ligne
{
int i;
char ligne[]="012345678901234567";
i = 0 ;
//lcd_4_PutCommand (LCD_HOME) ;
//sleep (1);
strncpy(ligne, chaine,16);
ligne[strlen(chaine)]=0 ;
while (ligne[i])
lcdPutchar(lcdhd,ligne[i++]) ;
if (i < 16)
for( ; i<16 ; i++)
lcdPutchar (lcdhd,' ');
}
//***************************************************
// fichier tampon FILENAME
//un argument :
// pas de FILENAME -> c'est le premier appel de LCD
// - afficher argument ligne 1
// - sauver ligne 1 vide
// - sauver argument dans ligne 2
// FILENAME ligne 2 vide ("")
// - afficher sur ligne 2
// - sauver lige 1 vide
// - sauver argument dans ligne 2
// FILENAME 2 lignes pas vides
// - afficher ligne 2 sur ligne 1
// - sauver ligne 2 dans ligne 1
// - sauver argument dans ligne 2
//deux arguments (pas de lecture FILENAME)
// - afficher les 2 arguments
// - sauver les deux arguments
//***************************************************
int main(int argc, char* const argv[]){
int i;
FILE *prog;
char buf0[20], buf1[20];
if(wiringPiSetup() == -1){ //when initialize wiring failed,print messageto screen
printf("setup wiringPi failed !");
return 1;
}
pcf8574Setup(BASE,pcf8574_address);// initialize PCF8574
for(i=0;i<8;i++){
pinMode(BASE+i,OUTPUT); // set PCF8574 port to output mode
}
digitalWrite(LED,HIGH); // turn on LCD backlight
digitalWrite(RW,LOW); // allow writing to LCD
// initialize LCD and return “handle” used to handle LCD
lcdhd = lcdInit(2,16,4,RS,EN,D4,D5,D6,D7,0,0,0,0);
if(lcdhd == -1){
printf("lcdInit failed !");
return 1;
}
/////////////////////////////////////////////////
//traite les arguments
switch (argc - 1) {
case 0 :
//printf("pas d'argument\n");
//mode d'emploi
printf("afficheur LCD deux lignes \n");
printf("pour effacer l'afficheur mettre 2 arguments \"\" \"\"\n");
printf("l'adresse I2C du LCD est 0X%X\n",pcf8574_address);
return(0);
break;
case 1 : //décale la ligne 2 vers la 1 écrit l'argument en ligne 2;
{
printf("un argument d'entrée\n");
//lire ligne de FILENAME
if ((prog = fopen(FILENAME,"r"))!=NULL)
{
//printf ("%s\n",FILENAME);
fgets(buf0,20,prog);
fgets(buf1,20,prog);
printf("buf0-%d-->%s\n",strlen(buf0),buf0);
printf("buf1-%d-->%s\n",strlen(buf1),buf1);
//buf1[strlen(buf0)-1]=0;
print_ligne_16(buf0);
fclose(prog);
lcdPosition(lcdhd,0,0);
buf1[strlen(buf1)-1]=0;
print_ligne_16(buf1);
lcdPosition(lcdhd,0,1);
print_ligne_16(argv[1]);
//remplit fichier
printf("buf @%s@--@%s@\n",buf0,buf1);
printf("argument 1 %s\n",argv[1]);
prog = fopen(FILENAME,"w");
fprintf(prog,"%s\n",buf1);
fprintf(prog,"%s\n",argv[1]);
fclose(prog);
}
else
{
printf ("pas de /tmp/LCD : premier appel\n");
lcdPosition(lcdhd,0,0);
print_ligne_16(argv[1]);
//remplit fichier
prog = fopen(FILENAME,"w");
fprintf(prog,"\n");
fprintf(prog,"%s\n",argv[1]);
fclose(prog);
}
break;
}
case 2 : //écrit les 2 arguments et affiche
printf("deux arguments\n");
//arg 1 sur LCD
lcdPosition(lcdhd,0,0);
print_ligne_16(argv[1]);
//arg 2 sur LCD (va à la ligne)
lcdPosition(lcdhd,0,1);
//lcdSendCommand(lcdhd,0xC0);
print_ligne_16(argv[2]);
//ouvre /tmp/LCD écrit les arguments
//ferme /tmp/LCD
prog=fopen(FILENAME,"w");
fprintf(prog,"%s\n",argv[1]);
fprintf(prog,"%s\n",argv[2]);
fclose(prog);
break;
default : //pas correct
printf ("mauvais nombre d'arguments\n");
exit(1);
}
///////////////////// OLD ////////////////////
//affiche la ligne
// lcdHome(lcdhd);
// print_ligne_8(argv[1]);
return 0;
}