[Programmation] PIC18F4520 pour afficher sur un écran 16x2
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

PIC18F4520 pour afficher sur un écran 16x2



  1. #1
    Spitfire17

    PIC18F4520 pour afficher sur un écran 16x2


    ------

    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 :
    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();	
    	}
    }
    Mon compilateur est le C18 sur MPLAB et je programme avec un PicKit3.
    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)

    -----

  2. #2
    vincent66

    Re : PIC18F4520 pour afficher sur un écran 16x2

    Bonjour,
    Dans la routine d'écriture essaie de mettre E à 1 juste avant PORTD=d ...
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  3. #3
    James072

    Re : PIC18F4520 pour afficher sur un écran 16x2

    Bonjour,
    Tu n'as l'impression qu'il manque une déclaration dans void init(void) ?

  4. #4
    paulfjujo

    Re : PIC18F4520 pour afficher sur un écran 16x2

    Bonjour,

    Code:
    		PORTBbits.RB5=1;
    		PORTBbits.RB4=0;
    		PORTBbits.RB3=0;
    utilise plutot LATBbits.RB5=1 ... etc LAT au lieu de PORT pour activer des sorties sur les 18F

    idem pour les declaration
    Code:
    #define E PORTBbits.RB2                        <- LAT au lieu de PORT
    #define RS PORTBbits.RB0 
    #define RW PORTBbits.RB1
    Dernière modification par paulfjujo ; 30/03/2016 à 16h56.

  5. A voir en vidéo sur Futura
  6. #5
    Spitfire17

    Re : PIC18F4520 pour afficher sur un écran 16x2

    Déjà merci à tous pour vos réponses.

    J'ai essayé de mettre E=1 avant le PORTD=d, mais ça n'a pas fonctionné, toujours rien à l'écran.
    J'ai aussi essayé LAT au lieu de PORT mais le compileur refuse de build. Il me dit
    Code:
    c:145:Error [1205] unknown member 'RB5' in '__tag_28'
    Et je vois pas ce qu'il manque, peux tu m'en dire plus ?

  7. #6
    RISC

    Re : PIC18F4520 pour afficher sur un écran 16x2

    Salut

    Si tu utilises LATB (sorties) il faut alors utiliser LATBbits.LATB5 (pas RB5)

    a+

Discussions similaires

  1. HTML code pour afficher un petit écran dans le même onglet
    Par enzyox dans le forum Programmation et langages, Algorithmique
    Réponses: 10
    Dernier message: 14/01/2013, 11h21
  2. pic18f4520 et ecran lcd ...
    Par invite898d521c dans le forum Électronique
    Réponses: 1
    Dernier message: 03/09/2012, 14h29
  3. Ecran LCD en VGA devant afficher du CGA
    Par invite993bc5cf dans le forum Électronique
    Réponses: 2
    Dernier message: 21/04/2008, 21h18
  4. afficher une croix à l'écran
    Par wopl_a dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 29/09/2007, 20h32
  5. Afficher une image sur un écran LCD
    Par invite1f3675f2 dans le forum Électronique
    Réponses: 5
    Dernier message: 05/06/2007, 21h28
Découvrez nos comparatifs produits sur l'informatique et les technologies.