Aide Code en C Pic 16F88 - LCD HD44780
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Aide Code en C Pic 16F88 - LCD HD44780



  1. #1
    invitec1a2f24b

    Aide Code en C Pic 16F88 - LCD HD44780


    ------

    Bonjour,
    Il y a quelques mois je me suis lancé dans l'aventure des PICs.

    Après quelques réussites en C et ASM, j'ai décidé de m'attaquer à un écran LCD avec un contrôleur Hitachi HD44780 (utilisation en mode 4 bits).

    Après divers essais peu concluants, j'ai trouvé un code en C sur internet que je souhaiterais adapter à mon PIC (un 16F88).

    J'ai donc adapté le code au 16F88 et à mon compilateur CC5X.
    BUILD SUCCEEDED !

    Certes, ça ne veut pas dire que le code est juste, mais bon...

    Après câblage : RIEN ! Pas de caractère d'affiché, le LCD se comporte comme si il n'était pas connecté au PIC.
    Première ligne noire, seconde rien...

    Je joint le code modifié, si vous avez des suggestions je suis prenant !

    Merci à tous pour votre aide


    Programme principale :

    Code:
    /***********************
         projet Lcd HD 44780      
             QUARTZ 4Mhz  
            1cycle -> 1µs    
    ************************/
    
    #pragma chip PIC16F88
    #include "lcdspi.h"  // fichier du lcd HD 44780 
    
     void Message_Lcd(const char* texte); // fonction de transfert, d'un message vers lcd 
    
     /************* debut du main *************************/
     void main()
    	{     			 
    	TRISB=0;			// portB Output pour lcd 44780
    	ANSEL=0x00;         // Sortie numériques
    	OPTION_REG=0b10000101;		// initialise TMR0, prédiviseur 64 : 1 cycle -> 64µs
    
    	Ini_Lcd();			// Initialisation lcd    
    	    
    	Efface_LCD();
    	Ligne_LCD(1); 
    	Message_Lcd("Ceci est un test");
    	Ligne_LCD(2);
    	Message_Lcd("Oui, un test...");
    	while(1); 			// le cours du programme se termine ici
    	
    }
    /********** fin du main *******************************/ 
     
     void Message_Lcd(const char* texte)    // écriture d'une chaine de caractère
    	{
    	char cCount=0;
    	while (texte[cCount] != 0 )     
    	wr_Lcd(texte[cCount++],1);
    	}

    Fonction du LCD

    Code:
    /*   lcdspi.h		*/
    
    #define pins PORTB
    #define Lcd_E PORTB.3=1; nop(); nop(); PORTB.3=0;
    #define Lcd_RS PORTB.2
    
    unsigned char cL;
    
    void Efface_LCD(void);
    void Ligne_LCD(char cLigne);
    void Efface_LigneLCD(char cEff);
    void wr_Lcd(unsigned char cVar,unsigned char cLcd_RS);
    void Ini_Lcd(void);
    void Tempo(char ti);	// tempo
    
    void Ini_Lcd(void) 
    	{
      	// ****   initialisation LCD *****
      	PORTB=0;
      	Lcd_RS=0;
      	for(cL=0;cL<2;cL++) {TMR0=1; while(TMR0 != 0);} //32ms  afficheur
       
      	pins=0x30;
      	Tempo(189); // 4,3ms E inclus
      	Tempo(254); // 150µs  
      	pins=0x20;
      	Tempo(254); // 150µs  
    
      	//**** initialisation paramètres LCD **********************************
      	wr_Lcd(0x28,0);  // 2 lignes
     	wr_Lcd(1,0);     // Efface l'affichage initialisation  DD-ram
      	wr_Lcd(0x0C,0);  // Affichage des caractères 
      	wr_Lcd(6,0);     // Déplacement vers la droite 
    	} 
     
     void wr_Lcd(unsigned char cVar,unsigned char cLcd_RS)    
    	{	
    	char b3;
    	Lcd_RS=cLcd_RS;
    
    	b3=cVar & 0xF0;   // envoi 4 bit poids fort
    	pins=pins & 4;    // copie du bit lcd_E
    	pins=pins | b3; 
    
    	Tempo(255);
        	  	    
    	pins=pins & 4;   // envoi 4 bits poids faible
    	b3=(cVar<<4);
    	pins=pins | b3;
    	
    	Lcd_E;
    	if((cVar>2) && (Lcd_RS==0)) TMR0=255; // tempo 86µs
    	else TMR0=228;                         // tempo 1,7ms  
    	while(TMR0 != 0);	  
      	}
    
     void Tempo(char ti)
    	{
    	Lcd_E;
    	TMR0=ti;
    	while(TMR0 != 0);
    	}
    
     void Ligne_LCD(char cLigne)
    	{ 
    	if(cLigne==1) wr_Lcd(0x80,0); // afficheur se cale sur ligne 1
    	else if (cLigne==2) wr_Lcd(0xC0,0); // afficheur se cale sur ligne 2
    	}
    	
     void Efface_LigneLCD(char cEff)
    	{	
    	if(cEff==1)
    		{			
    		wr_Lcd(0x80,0);      // set DDRAM passe 1 ere ligne
    		for(cL=0;cL<=15;cL++)wr_Lcd(0x20,1);  // affiche des espaces (ascii): 0x20
    		}
    	     
    	if(cEff==2)
    		{			
    		wr_Lcd(0xC0,0);      // set DDRAM passe 2 eme ligne 
    		for(cL=0;cL<=15;cL++)wr_Lcd(0x20,1);  // affiche des espaces
    		} 	  	 
    	}
    	
    void Efface_LCD(void) {wr_Lcd(1,0);}

    -----

  2. #2
    invitec1a2f24b

    Re : Aide Code en C Pic 16F88 - LCD HD44780

    Voici le cablage (j'avais oublié...)

    image hébergée sur serveur externe supprimée
    Dernière modification par Jack ; 26/10/2010 à 20h34.

  3. #3
    Jack
    Modérateur

    Re : Aide Code en C Pic 16F88 - LCD HD44780

    trop petit pour moi ton schéma.

    Tu es sûr de bien avoir réglé le contraste?

    A+

  4. #4
    invitec1a2f24b

    Re : Aide Code en C Pic 16F88 - LCD HD44780

    En effet, il faut cliquer sur le schéma pour l'agrandir dans une nouvelle fenêtre...

    Concernant le contraste, il fonctionne. Je l'ai connecté à un potentiomètre de 10k...

    Merci de votre aide !!!

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : Aide Code en C Pic 16F88 - LCD HD44780

    En effet, il faut cliquer sur le schéma pour l'agrandir dans une nouvelle fenêtre...
    Aucun résultat sous firefox et ie.
    de toutes manières, la politique du forum est la suivante:
    http://forums.futura-sciences.com/el...-sabonner.html

    J'ai donc supprimé l'image hébergée. Reposte-la en pièce jointe.

    A+

  7. #6
    invitec1a2f24b

    Re : Aide Code en C Pic 16F88 - LCD HD44780

    Voici donc le schéma ! désolé, je poste pas souvent sur des forums...
    Images attachées Images attachées  

  8. #7
    Jack
    Modérateur

    Re : Aide Code en C Pic 16F88 - LCD HD44780

    Pas de problème, c'est bien mieux comme çà

    C'est un programme que tu as adapté car cette ligne par exemple m'interpelle?
    Code:
        pins=pins & 4;    // copie du bit lcd_E
    Ce qui voudrait dire que le signal E est sur le bit 2. Or, il est sur le bit 3

    A+

Discussions similaires

  1. Petite question sur LCD 2*16 Chipset HD44780
    Par invitea682ef93 dans le forum Électronique
    Réponses: 6
    Dernier message: 26/06/2010, 13h06
  2. Pb avec LCD 20x2 GB-1494-0 (HD44780+T6961A)
    Par invite6cb8b74b dans le forum Électronique
    Réponses: 13
    Dernier message: 13/07/2009, 13h49
  3. LCD hd44780
    Par invite310d6b50 dans le forum Électronique
    Réponses: 7
    Dernier message: 06/12/2007, 08h06
  4. lcd HD44780 4x20
    Par sdow dans le forum Électronique
    Réponses: 11
    Dernier message: 27/11/2006, 10h50
  5. LCD HD44780 ---> programme C
    Par invitea093086b dans le forum Électronique
    Réponses: 3
    Dernier message: 16/02/2005, 14h24
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...