Bonjour à tous,
J'ai un projet d'enceinte USB/Bluetooth/Jack qui nécessite d'afficher sur un écran LCD alphanumérique (un LCM1602C) à l'aide d'un PIC18F4520. Je veux afficher la source audio actuelle, le volume, et si on est en USB, le titre de la musique.
Je communique avec l'écran via une interface 8 bits sur le PORTD du PIC (RD0-RD7 -> DB0-DB7). J'ai choisi comme autres pins : E -> RB1, RW -> RB0 et RS -> RB2. Le contraste est géré via un potentiomètre.
Voici le code que j'utilise :
Mon compilateur est le C18 sur MPLAB et je programme avec un PicKit3.Code:#include <p18f4520.h>//inclus la librairie contenant les d?finitions des bits et des registres #include <delays.h> #define E PORTBbits.RB2 #define RS PORTBbits.RB0 #define RW PORTBbits.RB1 #define SRC PORTAbits.RA4 #define PLAY PORTAbits.RA3 #define STOP PORTAbits.RA2 #define PREV PORTAbits.RA1 #define SUIV PORTAbits.RA0 #define VOL PORTEbits.RE1 //AN6 page 227 #pragma config OSC = XT // oscillatateur ext?rieur #pragma config WDT = OFF // pas de chien de garde void traiter_it(void);// declaration programme gestion interruption void init (void); void source(void); void play(void); void stop(void); void suivante(void); void precedente(void); void appairage(void); void volume(void); void ecritureLCD(char,char); char lectureLCD(char); void busy(void); void main(void); void tempo(void); // d?clarer vos variables et constantes int srce=1; #pragma code it=0x08 //adresse interruption haute void saut_sur_spit(void){_asm goto traiter_it _endasm } #pragma code // Sous programmes //pour chaque sous programme commenter fonction void tempo(){//Fait une tempo pour l'affichage int i; for(i=0;i<100;i++){}; } //programme qui traite les interruptions #pragma interrupt traiter_it void traiter_it(void){ } char lectureLCD(char p){ char valeur=0; RW=1; switch(p){ case 0 : RS=0; break; case 1 : RS=1; break; } TRISD=0xff; E=1; E=1; valeur=PORTD; E=0; E=0; return valeur; } void busy(){ while(lectureLCD(0x00)>=0b10000000){ } } void ecrireLCD(char d,char p){ E=0; switch(p){ case 0 : busy(); RS=0; break; case 1 : busy(); RS=1; break; case 2 : RS=0; break; } RW=0; TRISD=0x00; PORTD=d; E=1; E=1; E=1; E=1; E=1; E=1; E=0; } //programme d'initialisation void init(void){ TRISB=0b00000000; TRISA=0b11111100; ecrireLCD(0b00111100,2);//Set function ecrireLCD(0b00001111,0);//Display ON ecrireLCD(0b00000001,0);//Clear display ecrireLCD(0b00000111,0);//Entry mode set } void source(){//Fonction qui switch entre les sources srce++; if(srce>3)srce=0; if(srce==1){//Jack PORTBbits.RB5=1; PORTBbits.RB4=0; PORTBbits.RB3=0; ecrireLCD('S',1); ecrireLCD('o',1); ecrireLCD('u',1); ecrireLCD('r',1); ecrireLCD('c',1); ecrireLCD('e',1); ecrireLCD(' ',1); ecrireLCD(':',1); ecrireLCD(' ',1); ecrireLCD('J',1); ecrireLCD('a',1); ecrireLCD('c',1); ecrireLCD('k',1); }else if(srce==2){//USB PORTBbits.RB5=0; PORTBbits.RB4=1; PORTBbits.RB3=0; ecrireLCD('S',1); ecrireLCD('o',1); ecrireLCD('u',1); ecrireLCD('r',1); ecrireLCD('c',1); ecrireLCD('e',1); ecrireLCD(' ',1); ecrireLCD(':',1); ecrireLCD(' ',1); ecrireLCD('U',1); ecrireLCD('S',1); ecrireLCD('B',1); }else if(srce==3){//Bluetooth PORTBbits.RB5=0; PORTBbits.RB4=0; PORTBbits.RB3=1; ecrireLCD('S',1); ecrireLCD('o',1); ecrireLCD('u',1); ecrireLCD('r',1); ecrireLCD('c',1); ecrireLCD('e',1); ecrireLCD(' ',1); ecrireLCD(':',1); ecrireLCD(' ',1); ecrireLCD('B',1); ecrireLCD('T',1); } } void play(){ } void stop(){ } void suivante(){ } void precedente(){ } void appairage(){ PORTAbits.RA5=1; } void volume(){ int volume=PORTEbits.RE1;//Récupérer valeur dans ADCON } #pragma code // programme principal void main(){ init(); source(); for(;;){ if(SRC==1) source(); if(PLAY==1 && srce==2)//USB & Bouton play play(); if(STOP==1 && srce==2)//USB & Bouton stop stop(); if(SUIV==1 && srce==2)//USB & Bouton suivant suivante(); if(PREV==1 && srce==2)//USB & Bouton precedent precedente(); if(PLAY==1 && srce==3)//USB & Bouton play appairage(); volume();//Récupère la valeur du volume et l'affiche tempo(); } }
Cela fait maintenant plusieurs jours que je suis sur ce problème, j'ai vérifié plusieurs fois chaque branchement, tous sont bons.
J'ai également testé l'écran que j'utilise sur Arduino, il fonctionne parfaitement.
Je ne sais vraiment plus quoi faire pour faire fonctionner cet écran LCD, toute aide serait appréciée. C'est peut-être/sûrement un problème à la con que je ne vois pas mais alors aucune idée.
Donc voilà, toute aide ou toute idée sur ce qui peut dysfonctionner serait vraiment utile. Merci d'avance à tous ceux qui réfléchiront à mon problème.
(La doc de l'écran : Datasheet LCD)
(La doc du PIC : Datasheet PIC)
-----