PIC 18F4620 + afficheur LCD 4x16
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

PIC 18F4620 + afficheur LCD 4x16



  1. #1
    invite88fe2bbb

    Exclamation PIC 18F4620 + afficheur LCD 4x16


    ------

    Bonjour a tous,

    En vu d'un projet en cours, je dois afficher un texte sur un afficheur LCD que j'ai monté en 8 bits. Sa puce est une S6A0069.

    Je programme sous CCS, et la compilation ne pose aucun soucis.
    Cependant lorsque j'essaye d'afficher un caractère, il se reproduis plusieurs fois et pas du tout la où il serait censé s'afficher.
    Je ne sais donc pas si cela viens de l'initialisation du lcd, de mon sous programme qui gere le placement des char. ou bien le prog. principal ...

    Je vous met monprogramme en espérant que vous pourrez m'aider. Je vous en remercie d'avance.
    Si il y a des questions, bien évidement il n'y a pas de soucis


    Code:
    #include "LCD.h"
    
    #define LCD_RS PIN_E0
    #define LCD_RW PIN_E1
    #define LCD_E  PIN_E2
    
    #define clear_display  0x01
    #define return_home  0x02
    #define function_set  0x30
    #define display_ON  0x0C
    #define display_OFF 0x08
    #define add_zero_ddram  0x80
    
    
    
    void lcd_com(char c)
    {
       output_low (LCD_E);
       output_low(LCD_RS);           // Met le RS à 0 : mode commande
       output_d (c);                 // Envoie la commande dans le port D
       output_high (LCD_E);          // Set du Enable pour activer l'envoie
       delay_us(100);
       output_low (LCD_E);           // Met E au niveau 0 pour prochaine envoie
       delay_us(100);
       set_tris_d(0x00);  
       output_d(0x00); 
    }
    
    void lcd_char(char c)
    {
       output_high(LCD_RS);          // Met le RS à 1 : mode charactere
       output_D(c);                  // Envoie les characteres voulus dans D
       output_high (LCD_E);          // Set du Enable pour activer l'envoie
       delay_us(50);
       output_low (LCD_E);           // Met E au niveau 0 pour prochaine envoie
       delay_us(130);
    }
    
    void lcd_init()
    {
       delay_ms(30);   
     
       output_low(LCD_RW);
       output_low(LCD_E);
       output_low(LCD_RS);
      
     
       lcd_com(function_set);
       delay_ms(6); 
       lcd_com(function_set);
       delay_us(150); 
       lcd_com(function_set);
       delay_us(150); 
       lcd_com(clear_display);
       delay_ms(3); 
       lcd_com(add_zero_ddram);
       delay_us(1700);
       lcd_com(display_ON);
       delay_us(1700);
    //   lcd_com(0x06);
     //  delay_us(1700);
     //  lcd_com(return_home);
      // delay_us(1700);
     
    }
    
    void goto_xy(int8 row,int8 col)
    {
    int8 i;
      
    switch (row)
    {
      case 1: lcd_com(0x02);         //cuseur home
              for(i=1;i<col;i++)
              {
                lcd_com(0x14);       //move curseur right
              }
              break;
      
      case 2: lcd_com(0x02);         //cuseur home
              for(i=1;i<(16+col);i++)
              {
                lcd_com(0x14);       //move curseur right
              }
              break;
    
      case 3: lcd_com(0x02);         //cuseur home
              for(i=1;i<(32+col);i++)
              {
                lcd_com(0x14);       //move curseur right
              }
              break;
              
      case 4: lcd_com(0x02);         //cuseur home
              for(i=1;i<(48+col);i++)
              {
                lcd_com(0x14);       //move curseur right
              }
              break;
    }
    }
    
    void main()
    {
    
       setup_adc_ports(NO_ANALOGS|VSS_VDD);
       setup_adc(ADC_OFF);
       setup_spi(FALSE);
       setup_wdt(WDT_OFF);
       setup_timer_0(RTCC_INTERNAL);
       setup_timer_1(T1_DISABLED);
       setup_timer_2(T2_DISABLED,0,1);
       setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
       setup_comparator(NC_NC_NC_NC);
       setup_vref(FALSE);
    
    lcd_init();
    lcd_com(clear_display);
    delay_us(1700);
    
    while (1)
    {
    
       goto_xy(1,1);       
       lcd_char("1");  
       goto_xy(1,16);       
       lcd_char("AR");   
       goto_xy(4,16);       
       lcd_char("3");  
       goto_xy(4,1);       
       lcd_char("4");  
       delay_ms(10);
    
    output_high (PIN_A0);
    }
    
    }

    -----

  2. #2
    invite03481543

    Re : PIC 18F4620 + afficheur LCD 4x16

    Bonjour,

    je verrai bien un soucis de temporisation, le mieux est de tester le bit qui dit si l'afficheur est occupé (busy flag) c'est bien plus fiable que de mettre des tempos partout.
    A+

  3. #3
    invite88fe2bbb

    Re : PIC 18F4620 + afficheur LCD 4x16

    merci, je vais essayer ton conseil et je te retiendrai au courant. Merci de ton aide.

Discussions similaires

  1. programmer un afficheur lcd avec pic 16f877
    Par invited14768ec dans le forum Électronique
    Réponses: 5
    Dernier message: 08/05/2011, 19h49
  2. Programme en C pour PIC et afficheur LCD
    Par invitedd558ae9 dans le forum Électronique
    Réponses: 5
    Dernier message: 11/03/2009, 11h27
  3. Gestion d'un afficheur LCD 4x16
    Par invite0376a73d dans le forum Électronique
    Réponses: 5
    Dernier message: 28/07/2008, 19h46
  4. Projet BTS LCD 4x16
    Par invitee348fb98 dans le forum TPE / TIPE et autres travaux
    Réponses: 0
    Dernier message: 14/03/2008, 10h26
  5. PIC 18F4620 et tracas....
    Par invite18a2d625 dans le forum Électronique
    Réponses: 0
    Dernier message: 20/05/2006, 18h52
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...