Comment faire marcher ce code ??
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Comment faire marcher ce code ??



  1. #1
    invite227c1caa

    Comment faire marcher ce code ??


    ------

    Bonjour,

    je suis en train de réaliser un programme en C pour PIC 16f84 permettant d'afficher une chaine de caractère sur un afficheur LCD 2x16 mais le problème c'est que je n'arrive pas à écrire le code pour un LCD en mode 4 bits.

    J'ai beaucoup chercher sur google pendent 1 semaine mais je n'y arrive pas donc j'aurai besoin d'aide svvpp .

    Je programme sous MPLAB avec CC5X et voici mon code (et mon schéma fait sous ISIS ci join). Merci d'avence

    Code:
    bit D4 @ RB4;
    bit D5 @ RB5;
    bit D6 @ RB6;
    bit D7 @ RB7;
    
    bit RS @ RB1;
    bit RW @ RB2;
    bit E @ RB3;
    
    
    void ecrire_afficheur(bit rs, char dat);
    void affiche_caractere(char carac);
    void init_aff(void);
    void aff_chaine(char chaine);
    void tempo_ms(char);
    
    
    
    void main (void)
    {
    	TRISA = 0x11;
    	TRISB = 0x01;
    	PORTA = 0;
    	PORTB = 0;
    init_aff();
    
    
    affiche_caractere('B');
    
    }
    
    
    //initialisation de l'afficheur
    void init_aff(void)
    {
    ecrire_afficheur(0, 0x01);//on efface le LCD
    
    ecrire_afficheur(0, 0x30); //mode 8bits
    
    ecrire_afficheur(0, 0x28); //mode 4 bits, 2 lignes, fonte 5x7
    
    ecrire_afficheur(0, 0x0C); //affichage en fonction
    
    ecrire_afficheur(0, 0x06); //deplacement curseur vers la gauche
    
    ecrire_afficheur(0, 0x01);//on efface le LCD
    }
    
    //affiche le caractere sur LCD
    void ecrire_afficheur(bit rs, char dat)
    {
    
    
    
    RS = rs;
    tempo_ms(5);
    RW = 0;
    tempo_ms(5);
    E = 0;
    tempo_ms(5);
    E = 1;
    tempo_ms(5);
    
    tempo_ms(5);
    E = 0;
    tempo_ms(5);
    }
    
    
    void affiche_caractere(char carac)
    
    {
    ecrire_afficheur(1, carac);
    }
    
    
    
    //chaine de caractére
    void aff_chaine(char chaine){
    
    unsigned char i = 0;
    
    while(chaine[i]!= '\0' )
    
    affiche_caractere(chaine[i++]);
    }
    
    
    void tempo_ms(char temps){
    
    	char j=0,i=0;
    
    	for(j = 0;j < temps ; j++)       
    		for(i = 0; i <90 ; i++); 		   
    }

    -----
    Images attachées Images attachées  

  2. #2
    polo974

    Re : Comment faire marcher ce code ??

    google(LCD en mode 4 bits)
    1ère réponse: http://www.aurel32.net/elec/lcd.php
    Les données sont alors écrites ou lues en envoyant séquentiellement les quatres bits de poids fort suivi des quatres bits de poids faible. Une impulsion positive d'au moins 450 ns doit être envoyée sur la ligne E pour valider chaque demi-octet ou nibble.
    4ème réponse: http://www.8051projects.net/lcd-inte.../lcd-4-bit.php
    si tu préfères in english

    recherche, rédaction de la réponse, petite pointe ironique: 10mn sans me presser...

    pour décaler de 4 bits: au choix /16 ou >>4
    Jusqu'ici tout va bien...

  3. #3
    invite227c1caa

    Re : Comment faire marcher ce code ??

    Merci pour ta réponse.

    Justement je suis allé sur le 1er site que t'a donné , j'ai même initialisé le LCD comme expliquer sur ce site. Mais le probléme c'etait le décalage des bits de poids forts donc meintenent que tu me la expliquer je vais essayer

  4. #4
    polo974

    Re : Comment faire marcher ce code ??



    C'est en (re)lisant ton code, où il manquait l'écriture que je me suis douté du pb de décalage d'où l'info en fin de message...

    Bonne continuation...
    Jusqu'ici tout va bien...

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

    Re : Comment faire marcher ce code ??

    Merci à toi mais en fin de compte j'ai changer de compilateur pour mikroc ( un peu plus simple ) et meintenent j'arrive à afficher des chaines de caractères ainsi que compter de 0 à 99 dès l'appui sur le bouton poussoir mais je n'arrive pas à faire une multiplication de ces nombres par un autre et d'afficher le résultat sur le LCD.

    Ce que je veux faire c'est multiplier le nombre d'appui par une échelle d'une carte pour afficher la distance en Km sur le LCD. merci de votre aide

    voici mon code ( le code de la partie comptage et un peu chaotique mais sa marche ) :

    Code:
    sbit interr at RB0_bit;
    sbit LCD_RS at RB1_bit;
    sbit LCD_EN at RB3_bit;
    sbit LCD_D4 at RB4_bit;
    sbit LCD_D5 at RB5_bit;
    sbit LCD_D6 at RB6_bit;
    sbit LCD_D7 at RB7_bit;
    
    sbit LCD_RS_Direction at TRISB1_bit;
    sbit LCD_EN_Direction at TRISB3_bit;
    sbit LCD_D4_Direction at TRISB4_bit;
    sbit LCD_D5_Direction at TRISB5_bit;
    sbit LCD_D6_Direction at TRISB6_bit;
    sbit LCD_D7_Direction at TRISB7_bit;
    // End LCD module connections
     Lcd_Init();
    
    
    char txt3[] = "Distance =";
    char txt4[] = "Km";
    
                                   //Crée une variable de comptage
    void Move_Delay() {                  // mouvement text
      Delay_ms(500);
    }
    
    void main(){
      int i = 0x31;      // i = 1 en ASCII
      int j = 0x30;      // j = 0 en ASCII
    
      TRISA = 0xff;
      TRISB = 0x01;
      PORTB = 0;
      PORTA = 0;
      
      Lcd_Init();                        // Initialize LCD
    
      Lcd_Cmd(_LCD_CLEAR);                // Clear display
      Lcd_Cmd(_LCD_CURSOR_OFF);
      Lcd_Out(1,1,txt3);                 // écrire texte sur 1er ligne
      Lcd_Out(2,1,txt4);                 // écrire texte sur 2eme ligne
      //Delay_ms(20);
    
                for(;;){
                Delay_ms(200);
                
    if (interr == 1){        // si on appui sur le BP
    
       Lcd_Out(1,13,&i);     // on affiche la valeur de l'adresse de i
             
             
             if ( i == 0x3A){              // si i = ':' en ASCII
                  i = 0x30;                  // i == 1
                  j ++;              // j = j + 0x01
                  Lcd_Out(1,13,&i);                 // on affiche la valeur  de l'adresse de i
    
             if ( j != 0x39)                   // si j est different de 9
                Lcd_Out(1,12,&j);                     // on affiche la valeur de l'adresse de j
    
                }
    
    else {                         // sinon on  incremente i
            i ++;
          }
                      }
                            }
    
      }

    PS: j'utilise le même schéma fourni dans mon 1er post

Discussions similaires

  1. comment faire marcher une LED Blanche sur du 240 Volt AC secteur ?
    Par invite52b3a8f0 dans le forum Électronique
    Réponses: 14
    Dernier message: 06/09/2015, 01h05
  2. [Brun] comment faire marcher 2 tv avec une parabole 1 tete
    Par inviteba82b891 dans le forum Dépannage
    Réponses: 8
    Dernier message: 11/10/2009, 13h18
  3. faire marcher et xp, et vista, via dde
    Par invite7deac881 dans le forum Logiciel - Software - Open Source
    Réponses: 13
    Dernier message: 12/11/2007, 19h44
  4. comment faire marcher "copié-glissé" de Ecartebleue ?
    Par invite8832ae39 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 4
    Dernier message: 03/06/2005, 13h35
  5. comment faire marcher le moduleur
    Par inviteddd993b2 dans le forum Électronique
    Réponses: 0
    Dernier message: 09/06/2004, 11h27
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...