Problème affichage ecran LCD JHD162A et PIC16f877a avec mikroC
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Problème affichage ecran LCD JHD162A et PIC16f877a avec mikroC



  1. #1
    dragonfly56360

    Problème affichage ecran LCD JHD162A et PIC16f877a avec mikroC


    ------

    Bonjour à tous,

    Je viens de m'acheter la carte de dev ql200 avec un bel écran LCD et un pic16f877a.
    Alors je ne connaissais pas du tout les écrans LCD et je me lance dans la création d'un petit chronomètre avec cet écran.
    Alors j'opte pour mikroC pour que l'affichage soit plus aisé à réaliser.

    J'ai donc un petit problème, j'ai réalisé ce petit programme pour afficher quelque chose :
    Code:
    sbit LCD_RS at RA1_bit;
    sbit LCD_EN at RA3_bit;
    sbit LCD_D7 at RD7_bit;
    sbit LCD_D6 at RD6_bit;
    sbit LCD_D5 at RD5_bit;
    sbit LCD_D4 at RD4_bit;
    
    
    
    sbit LCD_RS_Direction at TRISA1_bit;
    sbit LCD_EN_Direction at TRISA3_bit;
    sbit LCD_D7_Direction at TRISD7_bit;
    sbit LCD_D6_Direction at TRISD6_bit;
    sbit LCD_D5_Direction at TRISD5_bit;
    sbit LCD_D4_Direction at TRISD4_bit;
    
    
    
    
    void main(){
               
    
        CMCON=0x07;                    // désactive les comparateurs
    
        ADCON1=0X07;               //a port as ordinary i/o.
        TRISA=0X00;                //a port as output.
        TRISD=0X00;                //d port as output.
    
        Lcd_Init();
    
    
    
    do{
    Lcd_Out(1,2,"Premier Projet");
    Lcd_Out(2,2,"Avec ecran LCD");
    
    delay_ms(1000);
    
    Lcd_cmd(_LCD_CLEAR);
    
    Delay_ms(1000);
    }while(1);
    }
    Je pense que le code est bon et de plus il compile bien.
    Malheureuseument je n'obtiens rien sur l'écran LCD (ou plutôt que des carrés noirs sur la première ligne).

    J'ai vérifié le brochage sur la carte de développement et je pense que c'est bon

    Voilà le brochage : Nom : LCD.jpg
Affichages : 282
Taille : 53,2 Ko


    Est ce que vous avez une idée du problème qui se passe. Faut il initialiser l'écran à part? (
    PORTD=0b00000101100;//0x38; //4 bits 2 lines 5*7 mode.
    PORTD=0b0000001100;//0X0e; //display on,cursor on,blink on.
    PORTD=0X06; //character not move,cursor rotate right.)

    Finalement, que faut il faire de plus?

    Merci d'avance.

    -----

  2. #2
    paulfjujo

    Re : Problème affichage ecran LCD JHD162A et PIC16f877a avec mikroC

    bonsoir,


    Tu as 2 ecran LCD connectés en parrallele ?
    Quelle est FOSC ?

    Pour un mode LCD 4 bits, il faut mettre D0-D3 du LCD au 0V
    Mettre aussi un delai de 500mS avant le LCDinit();
    ... et ensuite regler le contraste

    Je ne sais pas trop ce que fait LCDInit dans le detail
    sinon re ecrit la procedure d'init en la decomposant..
    En principe on l'initialise en mode 8 bits avant de le reconfigurer en mode 4 bits
    meme si que 4 bits utilises..
    nota: certains LCD sont plus lents que d'autre => ajustage des tempos

    exemple en C18 :
    Code:
    
    void Init_LCD_2X16(void)
    {
    	Byte Cde;
    
    	LCD_E  = 0;
    	LCD_RW = 0;
    	LCD_RS = 0;
    	Cde= 0x30; 			// Mode 8 bit
    	LCD_Cmd(Cde);
    	DELAY_15MS;
    
    	Cde= 0x30; 			// Mode 8 bit
    	LCD_Cmd(Cde);		// MSB
    	Delay_2Ms;
    	LCD_Cmd(Cde);		// MSB
    	Delay_2Ms;
    	LCD_Cmd(Cde);		// MSB
    	Delay_2Ms;
    
    	Cde= 0x20;			// mode 4 bit sur B4..B7
    	LCD_Cmd(Cde);			
    
    
    	// 2 lignes , carac 5x7  =0x28
    	Cde= 0x20;						
    	LCD_Cmd(Cde);	
    	Cde= 0x80;							
    	LCD_Cmd(Cde);					
    	Delay_2Ms;
    	// no cursor
        Cde= 0x00;
    	LCD_Cmd(Cde);
    	Cde = 0x0C;					
    	LCD_Cmd(Cde);
    	Delay_2Ms;	// delais de 2ms
    
    	//efface display
    	Cde = 0x00;
    	LCD_Cmd(Cde);
    	Cde = 0x01;						
    	LCD_Cmd(Cde);
    	Delay_2Ms;	// delais de 2ms
    
    }

  3. #3
    dragonfly56360

    Re : Problème affichage ecran LCD JHD162A et PIC16f877a avec mikroC

    Bonjour,

    Excusez moi de répondre un petit peu tard.
    Ma board de développement ne contient qu'un seul écran. Mais, on peut choisir l'écran à connecter. C'est pourquoi il y a deux écrans sur le circuit de brochage.

    Pour ce qui est de ma fosc, c'est celle de mon microcontrôleur. Du coup c'est 20MHz il me semble.

    Merci de votre réponse, mais pourquoi ça ne fonctionne de cette façon?

    J'ai donc essayé un code exemple fourni avec ma board, compilé avec HI-TECH et je peux voir un affichage caractère par caractère (t...te...tes...test etc...). Je ne comprends pas pourquoi non plus. Pouvez vous m'éclairez? Voici, je pense les fonctions qui nous interessent :

    Code:
    //LCD init
    void lcd_init()
     {
        PORTD=0X1;                 //clr screen 
        lcd_enable();
        PORTD=0b00000111100;//0x38;                //8 bits 2 lines 5*7 mode.  
        lcd_enable();
        PORTD=0b0000001100;//0X0e;                //display on,cursor on,blink on.
        lcd_enable();
        PORTD=0X06;                //character not move,cursor rotate right.
        lcd_enable();
        PORTD=0X80;                //¡°WWW.PIC16.COM"
        lcd_enable();
     }
     
    //--------------------------------------
    //¡°WWW.PIC16.COM"
    void write_web()
     {
        int i;
         for(i=0;i<0x10;i++)        //total 16 bytes.
           {
             write(web[i]);        //search table.
           }
     }
    
    void write(char x)
     {
      PORTD=x;                   //data send to PORTD
      rs=1;                      //is data not command.
      rw=0;                      //is write not read.
      e=0;                       //pull low enable signal.
      delay();                   //for a while.
      e=1;                       //pull high to build the rising edge.
     }
    
    
    //--------------------------------------
    //lcd display setting 
    void lcd_enable()
     {
       rs=0;                     //is command not data
       rw=0;                     //is write not read. 
       e=0;                      //pull low enable signal.           
       delay();                  //for a while.                      
       e=1;                      //pull high to build the rising edge
     }
    
    
    //main
    int main (void)
     { 
    int compteur=0;
    int fois=0;
       //for(fois=0;fois<=1;fois++)
    for(;;)
          {
           
            init();                //I/O init
            lcd_init();            //LCD init
            write_web();           //display company's website  
            PORTD=0XC0;            //set the 2nd line display address
            lcd_enable();          //LCD display setting.       
            write_tel(compteur);           //display company's tel number. 
    		delay();
    		delay(); 
    	    compteur++;
      		PORTD=0x02;
         //fois++;
         }
    return;
     }

    Je pense que cela vient de la fonction "write()", car on affiche caractère par caractère. Du coup, comment éviter cela et tout afficher en une fois? Il y a une tempo pour visualiser l'appartition des caractères les uns après les autres. Mais une fois qu'ils sont tous apparus le programme se réinitialise et la chaine recommence à s'afficher depuis le début, même avec ma variable "fois" qui ne doit permettre un affichage que deux fois.


    Merci, j'espère que j'ai été assez clair. Je commence avec la programmation des µC, mais je maitrise bien le C. Du coup désolé avec mes questions bêtes.

  4. #4
    dragonfly56360

    Re : Problème affichage ecran LCD JHD162A et PIC16f877a avec mikroC

    Voilà après m'être un peu cassé la tête entre mikroC et HI-TECH, j ai choisi le dernier.
    Je me rend compte que mes dernières questions étaient un peu bête.

    Le chronomètre fonctionne correctement avec une légère dérive d environ une sec au bout de 10 min.

    Voilà mon code pour ceux que ça pourraient intéresser. Pour rappel : PIC16f877a, carte de développement ql200 et afficheur JHD162a

    Code:
    #include<pic.h>
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    
     __CONFIG(0x1832);        
    
    
    #define rs RA1
    #define rw RA2
    #define e  RA3
    
    char web[]="  ESSAI CHRONO  ";
    char telephone[]="TEMPS ";
    int count=0;
    int minute,heure=0;      //On initialise les minutes et les heures à 0
    //display company's tel number.
    
    void init();                   //I/O init
    void lcd_init();               //LCD init
    void write_web();              //display company's website
    void write_tel(int seconde,int minute,int heure);            //display company's tel number.
    void write(char x);            //display one byte
    void lcd_enable();             //LCD display setting.
    void delay();                  //delay
    void initialisation(int seconde);         //initialisation totale
    
    
    
    int sec_min(int seconde, int minute);
    int min_heure (int minute, int heure);
    
    //---------------------------------------
    //main
    int main (void)
     { 
    int seconde=0;
    int sec;
            init();                //I/O init
            lcd_init();            //LCD init
    
    /*    TIMER 0
    TMR0=0;
    T0CS=0;
    T0SE=0;
    PSA=0;
    PS0=1;
    PS2=1;
    */
    
    
    
    //T1CON=0b00000001; //TIMER1
    T2CON=0b01111100;
    TMR2=0;
    PR2=0xFF;
    while(1)
        {
    	 seconde++;
     	 //delay();
         /*while(!T0IF);//TIMER0
    	 T0IF=0;*/
    	 /*while(!TMR1IF); //TIMER1
    	 TMR1IF=0;*/
    	while(!TMR2IF);
    	TMR2IF=0;
    	 count++;
               //if(count==15) TIMER 1 & 0
    			if(count==244)
                {
                  count=0;
                  //sec=seconde/15; Timer 0&1
    				sec=seconde/244;
    					if(sec==60)
    					 {
    						initialisation(sec);
    						sec=0;
    						seconde=0;
    					 }	
                  initialisation(sec);
                }
         
         }
    	
     }
    
    //---------------------------------------
    //INITIALISATION
    
    void initialisation(seconde){
    
    
    		 minute=sec_min(seconde,minute);
    		 heure=min_heure(minute,heure);
    
    			if(minute==60){    //On affiche pas 60minutes mais 0minute
    				minute=0;}
    			if(seconde==60){
    				seconde=0;}    //On affiche pas 60sec mais 0sec
    
    
    
            write_web();           //display company's website  
            PORTD=0XC0;            //set the 2nd line display address
            lcd_enable();          //LCD display setting.       
            write_tel(seconde,minute,heure);           //display company's tel number. 
    		delay();
    		delay(); 
      		PORTD=0x02;
    }
    
    
    
    
    
    
    
    //---------------------------------------
    //I/O init
    void init()
     {
        ADCON1=0X07;               //a port as ordinary i/o.
        TRISA=0X00;                //a port as output.
    
        TRISD=0X00;                //d port as output.
     }
    
    //---------------------------------------
    //LCD init
    void lcd_init()
     {
        PORTD=0X1;                 //clr screen 
        lcd_enable();
        PORTD=0b00000111100;//0x38;                //8 bits 2 lines 5*7 mode.  
        lcd_enable();
        PORTD=0b0000001100;//0X0e;                //display on,cursor on,blink on.
        lcd_enable();
        PORTD=0X06;                //character not move,cursor rotate right.
        lcd_enable();
        PORTD=0X80;                //¡°WWW.PIC16.COM"
        lcd_enable();
    
     }
     
    //--------------------------------------
    //¡°WWW.PIC16.COM"
    void write_web()
     {
        int i;
         for(i=0;i<0x10;i++)        //total 16 bytes.
           {
             write(web[i]);        //search table.
           }
     }
    
    //--------------------------------------
    //¡°TEL0755-83643980"   
     void write_tel(seconde,minute,heure) {
    
        char chaine[20];
        int i;
    
       sprintf(chaine,"%s%dh%dm%ds        ",telephone,heure,minute,seconde);
        for(i=0;i<0x10;i++)       //total 16 bytes to display.
           {
             write(chaine[i]);       //search table to display
           }
     } 
      
    
    
    
    
    //--------------------------------------
    //write a byte to lcd.
    void write(char x)
     {
      PORTD=x;                   //data send to PORTD
      rs=1;                      //is data not command.
      rw=0;                      //is write not read.
      e=0;                       //pull low enable signal.
      delay();                   //for a while.
      e=1;                       //pull high to build the rising edge.
     }
    
    
    //--------------------------------------
    //lcd display setting 
    void lcd_enable()
     {
       rs=0;                     //is command not data
       rw=0;                     //is write not read. 
       e=0;                      //pull low enable signal.           
       delay();                  //for a while.                      
       e=1;                      //pull high to build the rising edge
     }
    
    //--------------------------------------
    //delay
    void delay()
     {
       int i;
       for(i=0;i<1;i++);
     }
    
    
    
    //--------------------------------------
    //Secondes en minutes
    
    
    
    int sec_min(seconde,minute){
    
    
    
    if (seconde==60){ //quand on atteind 60 sec
    minute++;            //on incremente de une min  
    }
    
    
    return minute;
    }
    
    
    
    //--------------------------------------
    //Minutes en heures
    
    int min_heure (minute,heure){
    
    if(minute==60){
    heure++;}
    
    return heure;
    }


    Désolé pour les commentaires dans le code, je ne les ai pas retouchés et je n'ai pas encore optimisé le code.

  5. A voir en vidéo sur Futura

Discussions similaires

  1. programmation avec MIKROC d'un PIC16F877A
    Par anouardz dans le forum Électronique
    Réponses: 6
    Dernier message: 24/03/2014, 21h58
  2. Affichage de nombre sur LCD avec mikroC
    Par azannn dans le forum Électronique
    Réponses: 7
    Dernier message: 25/06/2013, 09h30
  3. problème affichage avec écran 12"
    Par chris74 dans le forum Matériel - Hardware
    Réponses: 2
    Dernier message: 20/10/2011, 17h49
  4. Problème CAN avec un PIC16F877A
    Par invite5d1bc976 dans le forum Électronique
    Réponses: 5
    Dernier message: 09/05/2009, 14h58
  5. Problème d'affichage avec écran LCD 2x16
    Par invite897f3d13 dans le forum Électronique
    Réponses: 4
    Dernier message: 20/11/2007, 15h48
Découvrez nos comparatifs produits sur l'informatique et les technologies.