Afficheur LCD + PIC16F876
Répondre à la discussion
Affichage des résultats 1 à 24 sur 24

Afficheur LCD + PIC16F876



  1. #1
    inviteefe58ca3

    Afficheur LCD + PIC16F876


    ------

    Bonjour à tous et à toutes,

    Je souhaite programmer un afficheur LCD LM016L avec un PIC16F876.

    Je me suis beaucoup renseigné sur internet et j'ai vite compris que ce n'étais pas si simple puisqu'il fallait avoir une librairie adéquate (contrairement aux PIC18F).

    Je me suis donc lancé à la recherche de librairies pour MPLAB XC8. J'en ai téléchargé avec des montages ISIS. Néanmoins, malgré que le programme et la librairie marchent en simulation sur ISIS, je ne comprend pas tous les aspects de la librairie. C'est pour cela que je me suis engagé à faire ma propre librairie .

    MAIS ! Je n'y arrive pas. Quelqu'un pourrais m'aider svp, que ça soit pour sa réalisation ou pour me communiquer une libraire "simple" ?

    N'ayant pas ma carte sous la main, je voulais valider mon programme sur ISIS.

    -> Je veux commander un afficheur LM016L en mode 4 bits pour afficher un texte fixe et une variable avec un PIC16F876 en le programmant à travers MPLAB et le compilateur XC8.


    Je vous remercie de votre aide,

    Cotton

    -----

  2. #2
    inviteefe58ca3

    Re : Afficheur LCD + PIC16F876

    Personne pour m'aiguiller ?

  3. #3
    inviteefe58ca3

    Re : Afficheur LCD + PIC16F876

    Bonjour,

    J'ai écris ce petit bout de programme pour écrire une simple lettre sur l'afficheur :

    Code:
    #include <pic16f876.h>
    
    #define  RS RA2
    #define  EN RA3
    
    
    // RB7 -> D7
    // RB6 -> D6
    // RB5 -> D5
    // RB4 -> D4
    
    void LCD_Init();
    void LCD_CharData();
    
    void main (void)
    {
    	TRISA = 0b00000000;
    	TRISB = 0b00000000;
    
    	LCD_Init();
    	LCD_CharData();
    
    	while (1);
    
    }
    
    void LCD_Init (void)
    {
        for(int i = 0; i<130;i++);
        RS = 0; //ecriture d'une instruction
        PORTB = 0x30; //(mode 8 bits)
        EN = 1;
        EN = 0;
        for(int i = 0; i<100;i++);
        PORTB = 0x30; //(mode 8 bits)
        EN = 1;
        EN =0;
        for(int i = 0; i<100;i++);
        PORTB = 0x30; //(mode 8 bits)
        EN = 1;
        EN = 0;
        for(int i = 0; i<100;i++);
    
        PORTB = 0x20; //(mode 4 bits)
        PORTB = 0x20; //0x28 = Init Fonction 4 bits / 2 lignes
        PORTB = 0x80; //0x28 = Init Fonction 4 bits / 2 lignes
        PORTB = 0x00; //0x0C = Display ON/OFF / Cursor off
        PORTB = 0xC0; //0x0C = Display ON/OFF / Cursor off
        PORTB = 0x00; //0x06 = Mode Incremente de Gauche à Droite
        PORTB = 0x60; //0x06 = Mode Incremente de Gauche à Droite
        PORTB = 0x00; //0x01 = Clear LCD
        PORTB = 0x10; //0x01 = Clear LCD
    }
    
    void LCD_CharData (void)
    {
        RS = 1;
        PORTB = 'n';
        EN = 1;
        EN = 0;
    
    }
    J'ai voulu le tester en simulation sur ISIS, mais rien ne marche. L'afficheur s'allume mais rien ne s'affiche.


    Pouvez vous me dire si ce bout de programme peut fonctionner en situation réelle ?
    Dernière modification par Antoane ; 21/02/2015 à 18h31. Motif: Ajout balises code

  4. #4
    invite11398957

    Re : Afficheur LCD + PIC16F876

    Bonsoir,

    J'ai peur que cela ne fonctionne pas bien.
    En mode 4 bits il faut envoyer les 4 bits de poids forts une impulsion sur E puis les 4 bits de poids faibles.
    Voir par ex ici : http://www.aurel32.net/elec/lcd.php

    il est possible de s'inspirer des fichiers : C:\.....\Microchip\xc8\v1.33\s ources\pic18\plib\XLCD

    A+

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

    Re : Afficheur LCD + PIC16F876

    Bonsoir,

    Merci de ta réponse pat1149.

    J'ai modifié mon code :

    Code:
    #include <pic16f876.h>
    
    #define  RS RA2
    #define  EN RA3
    
    
    // RB7 -> D7
    // RB6 -> D6
    // RB5 -> D5
    // RB4 -> D4
    
    void LCD_Init();
    void LCD_CharData();
    
    char c;
    
    void main (void)
    {
    	TRISA = 0b00000000;
            ADCON1 = 0b00000110;
    	TRISB = 0b00000000;
    
    	LCD_Init();
    	LCD_CharData('n');
    
    	while (1)
            {
                
            }
    }
    
    void LCD_Init (void)
    {
        for(int i = 0; i<130;i++);
        RS = 0; //ecriture d'une instruction
        EN = 0;
        PORTB = 0x30; //(mode 8 bits)
        EN = 1;
        EN = 0;
        for(int i = 0; i<100;i++);
        PORTB = 0x30; //(mode 8 bits)
        EN = 1;
        EN =0;
        for(int i = 0; i<100;i++);
        PORTB = 0x30; //(mode 8 bits)
        EN = 1;
        EN = 0;
        for(int i = 0; i<100;i++);
    
        PORTB = 0x20; //(mode 4 bits)
        EN = 1;
        EN = 0;
        PORTB = 0x20; //0x28 = Init Fonction 4 bits / 2 lignes
        EN = 1;
        EN = 0;
        PORTB = 0x80; //0x28 = Init Fonction 4 bits / 2 lignes
        EN = 1;
        EN = 0;
        PORTB = 0x00; //0x0C = Display ON/OFF / Cursor off
        EN = 1;
        EN = 0;
        PORTB = 0xC0; //0x0C = Display ON/OFF / Cursor off
        EN = 1;
        EN = 0;
        PORTB = 0x00; //0x06 = Mode Incremente de Gauche à Droite
        EN = 1;
        EN = 0;
        PORTB = 0x60; //0x06 = Mode Incremente de Gauche à Droite
        EN = 1;
        EN = 0;
        PORTB = 0x00; //0x01 = Clear LCD
        EN = 1;
        EN = 0;
        PORTB = 0x10; //0x01 = Clear LCD
        EN = 1;
        EN = 0;
    }
    
    void LCD_CharData (c)
    {    
        RS = 1;
        PORTB = c;
        EN = 1;
        EN = 0;
        for(int i = 0; i<100;i++);
    }
    Malheureusement, en simulation sur ISIS, cela ne marche toujours pas. Ce peut-il que cela ne marche pas ou que ISIS ne retranscrit pas correctement ?

    Merci de vos réponses,

    Cotton.

  7. #6
    invite11398957

    Re : Afficheur LCD + PIC16F876

    Bonsoir,

    toujours le même problème dans la fonction "void LCD_CharData (void)", en mode 4 bits il faut envoyer les 4 bits de poids forts une impulsion sur E puis les 4 bits de poids faibles.

    Si joint les fichiers que j'utilise en mode 4 bits, c'est une copie simplifiée des fonctions xcld.

    Bonne soirée.
    Fichiers attachés Fichiers attachés

  8. #7
    inviteefe58ca3

    Re : Afficheur LCD + PIC16F876

    Code:
    #include <pic16f876.h>
    
    #define  RS RA2
    #define  EN RA3
    
    
    // RB7 -> D7
    // RB6 -> D6
    // RB5 -> D5
    // RB4 -> D4
    
    void LCD_Init();
    void LCD_CharData();
    
    char c;
    
    void main (void)
    {
    	TRISA = 0b00000000;
            ADCON1 = 0b00000110;
    	TRISB = 0b00000000;
    
    	LCD_Init();
    	LCD_CharData('n');
    
    	while (1)
            {
                
            }
    }
    
    void LCD_Init (void)
    {
        for(int i = 0; i<130;i++);
        RS = 0; //ecriture d'une instruction
        EN = 0;
        PORTB = 0x30; //(mode 8 bits)
        EN = 1;
        EN = 0;
        for(int i = 0; i<100;i++);
        PORTB = 0x30; //(mode 8 bits)
        EN = 1;
        EN =0;
        for(int i = 0; i<100;i++);
        PORTB = 0x30; //(mode 8 bits)
        EN = 1;
        EN = 0;
        for(int i = 0; i<100;i++);
    
        PORTB = 0x20; //(mode 4 bits)
        EN = 1;
        EN = 0;
        PORTB = 0x20; //0x28 = Init Fonction 4 bits / 2 lignes
        EN = 1;
        EN = 0;
        PORTB = 0x80; //0x28 = Init Fonction 4 bits / 2 lignes
        EN = 1;
        EN = 0;
        PORTB = 0x00; //0x0C = Display ON/OFF / Cursor off
        EN = 1;
        EN = 0;
        PORTB = 0xC0; //0x0C = Display ON/OFF / Cursor off
        EN = 1;
        EN = 0;
        PORTB = 0x00; //0x06 = Mode Incremente de Gauche à Droite
        EN = 1;
        EN = 0;
        PORTB = 0x60; //0x06 = Mode Incremente de Gauche à Droite
        EN = 1;
        EN = 0;
        PORTB = 0x00; //0x01 = Clear LCD
        EN = 1;
        EN = 0;
        PORTB = 0x10; //0x01 = Clear LCD
        EN = 1;
        EN = 0;
    }
    
    void LCD_CharData (c)
    {    
        RS = 1;
        PORTB = 00110000;
        EN = 1;
        EN = 0;
        PORTB = 00000000;
        EN = 1;
        EN = 0;
        for(int i = 0; i<100;i++);
    }

    Sous cette forme peut être ?

    J'ai récupéré la librairie .zip, je ne comprend rien au code qu'il y a dedans ^^'.

  9. #8
    invite11398957

    Re : Afficheur LCD + PIC16F876

    Bonjour,

    Cela est mieux, mais il faut aussi gérer le timing entre chaque commande ou data.Dans ma librairie j'utilise le flag busy du lcd ce qui n'est pas votre cas donc il faut le remplacer par une temporisation pour permettre à l'afficheur de terminer son traitement interne avant de lui envoyer une nouvelle commande ou data.

    voir par ex ici : http://web.alfredstate.edu/weimandn/...ion_index.html

    A+

  10. #9
    invite11398957

    Re : Afficheur LCD + PIC16F876

    Bonjour,
    Difficile de faire plus simple, j'espère que cela fonctionne ?

    Code:
    /* 
     * File:   lib_lcd.c
     * Author: Adiministrateur
     *
     * Created on 22 février 2015, 10:23
     */
    #include <xc.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    // CONFIG
    #pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
    #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
    #pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
    #pragma config CP = OFF         // FLASH Program Memory Code Protection bits (Code protection off)
    #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
    #pragma config LVP = OFF        // Low Voltage In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
    #pragma config CPD = OFF        // Data EE Memory Code Protection (Code Protection off)
    #pragma config WRT = ON         // FLASH Program Memory Write Enable (Unprotected program memory may be written to by EECON control)
    
    #define  _XTAL_FREQ 4000000
    #define  RS PORTAbits.RA2
    #define  EN PORTAbits.RA3
    
    
    // RB7 -> D7
    // RB6 -> D6
    // RB5 -> D5
    // RB4 -> D4
    
    void LCD_Init();
    void LCD_Cmde(unsigned char cmde);
    void LCD_data(unsigned char data);
    
    int main(void)
    {
        unsigned char cmpt;
        unsigned char lettre;
        ADCON1 = 0b00001110;
        PORTA = 0;
        PORTB = 0;
        TRISA = 0b00000000;
        TRISB = 0b00000000;
    
        LCD_Init();
       
    
    
    	while (1)
            {
                lettre =('a');
                for (int cmpt=0;cmpt<16;cmpt++)
                {
                    LCD_data(lettre);
                    lettre++;           //incremente lettre pour obtenir b,c,....
                    __delay_ms(1000);
                }
                LCD_Cmde(0x01);              //efface lcd
                __delay_us(100);
            }
    
    
    
    
    
        return (EXIT_SUCCESS);
    }
    
    void LCD_Init (void)
    {
        __delay_ms(15);     //
     LCD_Cmde(0b00110000);        //init mode 8bits
        __delay_ms(5);
        LCD_Cmde(0b00110000);        //init mode 8bits
        __delay_ms(5);
        LCD_Cmde(0b00110010);        //init mode 8bits
        __delay_us(100);
        LCD_Cmde(0x28);         //init mode 4bits 00101000
        __delay_us(100);
        LCD_Cmde(0x28);              //init mode 4bits 00101000
        __delay_us(100);
        LCD_Cmde(0x0C);              //afficheur ok curseur off
        __delay_us(100);
        LCD_Cmde(0x01);              //efface lcd
        __delay_us(100);
    
    
    }
    
    
    void LCD_Cmde(unsigned char cmde)
    {
        PORTB = cmde;           //ecriture des 4 bits de poids fort
        RS = 0;
        __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
        PORTB = cmde<<4;        //decalage vers la gauche des 4 bits de poids faible
         __delay_ms(1);         // et ecriture des 4 bits de poids faible
        EN = 1;
        __delay_ms(1);
        EN = 0;
    }
    void LCD_data(unsigned char data)
    {
       PORTB = data;            //ecriture des 4 bits de poids fort
        RS = 1;
        __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
        PORTB = data<<4;        //decalage vers la gauche des 4 bits de poids faible
         __delay_ms(1);         // et ecriture des 4 bits de poids faible
        EN = 1;
        __delay_ms(1);
        EN = 0;
    }

  11. #10
    inviteefe58ca3

    Re : Afficheur LCD + PIC16F876

    Bonsoir,

    Merci pour ce programme qui marche très bien en simulation . Espérons qu'il marchera en situation réelle.

    Une autre question, à partir de ce programme, comment puis-je, cette fois, afficher une variable à la place d'une lettre statique ?

    Merci de vos réponses,

    Cotton.

  12. #11
    spown

    Re : Afficheur LCD + PIC16F876

    bonsoir/bonjour;

    Utilises le modulo.
    Ex :

    Code:
    int temp = 123;
            var1 = temp/100;	
     	var2 = (temp%100)/10;
     	var3 = temp%10;
    
     	LCD_data(var1+'0');  // le zero pour l'ascii
     	LCD_data(var2+'0');
    .
    .
    .

  13. #12
    inviteefe58ca3

    Re : Afficheur LCD + PIC16F876

    Bonjour,

    Code:
    void variable_to_ASCII (variable)
    {
        if (variable >= 100)
        {
            c = c++;
            C = c+0x30;
            variable - 100;
        }
        else if (variable >= 10)
        {
            d = d++;
            D = d+0x30;
            variable - 10;
        }
        else if (variable >= 1)
        {
            u = u++;
            U = u+0x30;
            variable - 1;
        }
        else;
    }
    J'ai essayé ça au début. En simulation ISIS, j'ai eu pleins de caractères à la suite sur l'afficheur. J'ai conclu que cela ne marchait pas. Pourtant, je pense que ça aurai du. J'ai sans doute fait des erreurs sur les int, char etc ...

    J'ai encore une petite question svp.

    Je voudrais afficher ceci sur le LCD :

    Vitesse : XX, XX étant ma variable.

    Seule la variable doit changer. Je sais qu'il paramétrer le curseur mais je n'y arrive pas.


    Merci de vos réponses,

    Cotton.

  14. #13
    invite11398957

    Re : Afficheur LCD + PIC16F876

    Bonjour,
    Ouf cela fonctionne, c'est très bien.
    Petite précision, dans le code j'utilise "__delay_ms(1)" il est normalement possible de réduire cette tempo.
    pour afficher sur un LCD il est possible d'utiliser la fonction "printf()" avec toutes les possibilités de formatage (voir ici par ex : http://alain.dancel.free.fr/c/c60_10.htm).
    Pour cela il faut ajouter une fonction "putch()"
    Code:
    void putch(char c)
    {
        LCD_data(c);
    }
    et dans le code ajouter par ex :
    Code:
     variable = 241;
     printf ("Dec: %3u Hex: %2X",variable,variable );
     __delay_ms(1000);
    on obtient ceci sur l'afficheur : "Dec: 241 Hex: F1"

    A+

  15. #14
    inviteefe58ca3

    Re : Afficheur LCD + PIC16F876

    Bonjour,

    Merci de vos réponses.

    Je n'arrive pas à mettre en oeuvre la fonction printf.

    Est-ce qu'avec cette fonction, je pourrais afficher :

    "Vitesse : XX" XX étant une variable qui peut être 00 comme 99 par exemple ? Je veux que "Vitesse :" reste statique et que "XX" varie en fonction de son contenu bien entendu.

    @pat1149 : Je ne sais pas où ajouter votre code 2 par rapport à votre code 1.


    Merci,

    Cotton.

  16. #15
    invite11398957

    Re : Afficheur LCD + PIC16F876

    Bonsoir,
    Oui il est possible d'afficher "Vitesse : xx", voir code ci dessous :
    Code:
    /* 
     * File:   lib_lcd.c
     * Author: Adiministrateur
     *
     * Created on 22 février 2015, 10:23
     */
    #include <xc.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    // CONFIG
    #pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
    #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
    #pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
    #pragma config CP = OFF         // FLASH Program Memory Code Protection bits (Code protection off)
    #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
    #pragma config LVP = OFF        // Low Voltage In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
    #pragma config CPD = OFF        // Data EE Memory Code Protection (Code Protection off)
    #pragma config WRT = ON         // FLASH Program Memory Write Enable (Unprotected program memory may be written to by EECON control)
    
    #define  _XTAL_FREQ 4000000
    #define  RS PORTAbits.RA2
    #define  EN PORTAbits.RA3
    
    
    // RB7 -> D7
    // RB6 -> D6
    // RB5 -> D5
    // RB4 -> D4
    //const char aff[16] = "Le LANGAGE C";
    void LCD_Init();
    void LCD_Cmde(unsigned char cmde);
    void LCD_data(unsigned char data);
    void putch(char c);
    //void LCD_Write_Text( char *msg);
    
    int main(void)
    {
        unsigned char cmpt;
        unsigned char lettre;
        unsigned char variable;
        unsigned char vitesse;
        //char pp[16]="Bonjour";
        //char cc[]="Au revoir";
        //unsigned char *point = &cc;
     
        ADCON1 = 0b00001110;
        PORTA = 0;
        PORTB = 0;
        TRISA = 0b00000000;
        TRISB = 0b00000000;
    
        LCD_Init();
       
    
    
    	while (1)
            {
                lettre =('a');
                for (int cmpt=0;cmpt<16;cmpt++)
                {
                    LCD_data(lettre);
                    lettre++;           //incremente lettre pour obtenir b,c,....
                    __delay_ms(100);
                }
                LCD_Cmde(0x01);              //efface lcd
                __delay_us(100);
                vitesse = 98;
                printf ("Vitesse: %2u",vitesse );
                 __delay_ms(2000);
                LCD_Cmde(0x01);              //efface lcd
                __delay_us(100);
                vitesse = 01;
                printf ("Vitesse: %2u",vitesse );
                 __delay_ms(2000);
                LCD_Cmde(0x01);              //efface lcd
                __delay_us(100);
                
            }
        return (EXIT_SUCCESS);
    }
    
    void LCD_Init (void)
    {
        __delay_ms(15);     //
     LCD_Cmde(0b00110000);        //init mode 8bits
        __delay_ms(5);
        LCD_Cmde(0b00110000);        //init mode 8bits
        __delay_ms(5);
        LCD_Cmde(0b00110010);        //init mode 8bits
        __delay_us(100);
        LCD_Cmde(0x28);         //init mode 4bits 00101000
        __delay_us(100);
        LCD_Cmde(0x28);              //init mode 4bits 00101000
        __delay_us(100);
        LCD_Cmde(0x0C);              //afficheur ok curseur off
        __delay_us(100);
        LCD_Cmde(0x01);              //efface lcd
        __delay_us(100);
    
    
    }
    
    void putch(char c)
    {
        LCD_data(c);
    }
    
    void LCD_Cmde(unsigned char cmde)
    {
        PORTB = cmde;           //ecriture des 4 bits de poids fort
        RS = 0;
        __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
        PORTB = cmde<<4;        //decalage vers la gauche des 4 bits de poids faible
         __delay_ms(1);         // et ecriture des 4 bits de poids faible
        EN = 1;
        __delay_ms(1);
        EN = 0;
    }
    void LCD_data(unsigned char data)
    {
       PORTB = data;            //ecriture des 4 bits de poids fort
        RS = 1;
        __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
        PORTB = data<<4;        //decalage vers la gauche des 4 bits de poids faible
         __delay_ms(1);         // et ecriture des 4 bits de poids faible
        EN = 1;
        __delay_ms(1);
        EN = 0;
    }

  17. #16
    inviteefe58ca3

    Re : Afficheur LCD + PIC16F876

    Bonjour à tous,

    Merci de vos réponses.

    Pour ma part, j'ai fait ce programme qui marche très bien sur ISIS .

    Code:
    #include<pic16f876.h>
    #include <xc.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
    #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
    #pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
    #pragma config CP = OFF         // FLASH Program Memory Code Protection bits (Code protection off)
    #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
    #pragma config LVP = OFF        // Low Voltage In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
    #pragma config CPD = OFF        // Data EE Memory Code Protection (Code Protection off)
    #pragma config WRT = ON         // FLASH Program Memory Write Enable (Unprotected program memory may be written to by EECON control)
    
    #define  _XTAL_FREQ 4000000
    #define  RS PORTAbits.RA2
    #define  EN PORTAbits.RA3
    
    // RB7 -> D7 //Connectiques entre PIC et LCD
    // RB6 -> D6 //Connectiques entre PIC et LCD
    // RB5 -> D5 //Connectiques entre PIC et LCD
    // RB4 -> D4 //Connectiques entre PIC et LCD
    
    // INITIALISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    void LCD_Init();
    void LCD_Cmde(unsigned char cmde);
    void LCD_data(unsigned char data);
    void LCD_goto(char position);
    
    char var1;
    char var2;
    char var3;
    
    void main(void) //PROGRAMME PRINCIPAL
    {
        //INITIALISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        TRISA = 0b00000011;
        ADCON1 = 0b00001110;
        TRISB = 0b11000000;
        TRISC = 0b11000000;
    
        TXSTA = 0b00000110;
        RCSTA = 0b10010000;
        SPBRG = 25;
    
        PORTA = 0;
        PORTB = 0;
        RCREG = 0x00;
    
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        LCD_Init(); //Initialisation LCD
    
        LCD_goto(0x03); //Décale le curseur ligne 1, position 3
    
        LCD_data('P');
        LCD_data('r');
        LCD_data('o');
        LCD_data('j');
        LCD_data('e');
        LCD_data('t');
        LCD_data(' ');
        LCD_data('B');
        LCD_data('T');
        LCD_data('S');
    
        LCD_goto(0x43); //Décale le curseur ligne 2, position 0
    
        LCD_data('G');
        LCD_data('i');
        LCD_data('g');
        LCD_data('a');
        LCD_data(' ');
        LCD_data('P');
        LCD_data('i');
        LCD_data('x');
        LCD_data('e');
        LCD_data('l');
    
        __delay_ms(3000);
    
        LCD_Cmde(0x01); //Efface LCD
    
        LCD_data('V');
        LCD_data('i');
        LCD_data('t');
        LCD_data('e');
        LCD_data('s');
        LCD_data('s');
        LCD_data('e');
        LCD_data(':');
    
        while (1)
        {
            int variable = RCREG; //Contenu de RCREG stocké dans variable
    
            var1 = variable/100;
     	var2 = (variable%100)/10;
     	var3 = variable%10;
    
     	LCD_data(var1+'0'); //Ecrire les centaines sur LCD
            __delay_us(100);
     	LCD_data(var2+'0'); //Ecrire les dizianes sur LCD
            __delay_us(100);
            LCD_data(var3+'0'); //Ecrire les unités sur LCD
            __delay_us(100);
            LCD_goto(0x08); //Décale le curseur ligne 1, position 8
            __delay_us(100);
        }
    }

    Aujourd'hui, armé de mon schéma ISIS et de mon programme, j'ai voulu le tester sur un vrai système.

    Un problème s'est posé. Rien de s'affiche !

    Pourtant, il me semble pas avoir fait d'erreur dans le câblage . J'ai utilisé un PIC16F876 et une place d'expérimentation.

    Pour le contraste, j'ai mit la broche à la masse donc 0. De ce fait, j'ai le contraste à fond pour voir les caractères. Est-ce une erreur de l'avoir relié ?


    J'aimerai savoir si mon programme, ci-dessus, dans l'état actuel, peut fonctionner en situation "réelle" ?

    Merci,

    Cotton.

  18. #17
    inviteefe58ca3

    Re : Afficheur LCD + PIC16F876

    PS : Ci-dessous, le code en entier cette fois ^^'.

    Code:
    #include<pic16f876.h>
    #include <xc.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
    #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
    #pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
    #pragma config CP = OFF         // FLASH Program Memory Code Protection bits (Code protection off)
    #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
    #pragma config LVP = OFF        // Low Voltage In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
    #pragma config CPD = OFF        // Data EE Memory Code Protection (Code Protection off)
    #pragma config WRT = ON         // FLASH Program Memory Write Enable (Unprotected program memory may be written to by EECON control)
    
    #define  _XTAL_FREQ 4000000
    #define  RS PORTAbits.RA2
    #define  EN PORTAbits.RA3
    
    // RB7 -> D7 //Connectiques entre PIC et LCD
    // RB6 -> D6 //Connectiques entre PIC et LCD
    // RB5 -> D5 //Connectiques entre PIC et LCD
    // RB4 -> D4 //Connectiques entre PIC et LCD
    
    // INITIALISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    void LCD_Init();
    void LCD_Cmde(unsigned char cmde);
    void LCD_data(unsigned char data);
    void LCD_goto(char position);
    
    char var1;
    char var2;
    char var3;
    
    void main(void) //PROGRAMME PRINCIPAL
    {
        //INITIALISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        TRISA = 0b00000011;
        ADCON1 = 0b00001110;
        TRISB = 0b11000000;
        TRISC = 0b11000000;
    
        TXSTA = 0b00000110;
        RCSTA = 0b10010000;
        SPBRG = 25;
    
        PORTA = 0;
        PORTB = 0;
        RCREG = 0x00;
    
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        LCD_Init(); //Initialisation LCD
    
        LCD_goto(0x03); //Décale le curseur ligne 1, position 3
    
        LCD_data('P');
        LCD_data('r');
        LCD_data('o');
        LCD_data('j');
        LCD_data('e');
        LCD_data('t');
        LCD_data(' ');
        LCD_data('B');
        LCD_data('T');
        LCD_data('S');
    
        LCD_goto(0x43); //Décale le curseur ligne 2, position 0
    
        LCD_data('G');
        LCD_data('i');
        LCD_data('g');
        LCD_data('a');
        LCD_data(' ');
        LCD_data('P');
        LCD_data('i');
        LCD_data('x');
        LCD_data('e');
        LCD_data('l');
    
        __delay_ms(3000);
    
        LCD_Cmde(0x01); //Efface LCD
    
        LCD_data('V');
        LCD_data('i');
        LCD_data('t');
        LCD_data('e');
        LCD_data('s');
        LCD_data('s');
        LCD_data('e');
        LCD_data(':');
    
        while (1)
        {
            int variable = RCREG; //Contenu de RCREG stocké dans variable
    
            var1 = variable/100;
     	var2 = (variable%100)/10;
     	var3 = variable%10;
    
     	LCD_data(var1+'0'); //Ecrire les centaines sur LCD
            __delay_us(100);
     	LCD_data(var2+'0'); //Ecrire les dizianes sur LCD
            __delay_us(100);
            LCD_data(var3+'0'); //Ecrire les unités sur LCD
            __delay_us(100);
            LCD_goto(0x08); //Décale le curseur ligne 1, position 8
            __delay_us(100);
        }
    }
    
    void LCD_Init (void) //FONCTION D'INITIALISATION LCD ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    {
        __delay_ms(15);
        LCD_Cmde(0b00110000); //En mode 8 bits
        __delay_ms(5);
        LCD_Cmde(0b00110000); //En mode 8 bits
        __delay_ms(5);
        LCD_Cmde(0b00110010); //En mode 8 bits
        __delay_us(100);
        LCD_Cmde(0x28); //En mode 4 bits / 2 lignes
        __delay_us(100);
        LCD_Cmde(0x28);
        __delay_us(100);
        LCD_Cmde(0x0C); //Display ON/OFF / Cursor off
        __delay_us(100);
        LCD_Cmde(0x01) //Efface LCD
        __delay_us(100);
    }
    
    void LCD_Cmde(char cmde) //FONCTION ENVOI D'UNE COMMANDE LCD ~~~~~~~~~~~~~~~~~~~
    {
        RS = 0; //Ecrire une commande
        PORTB = cmde>>4; //Envoi des 4 bits de poids forts MSB
        __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
        PORTB = cmde; //Envoi des 4 bits de poids faible LSB
         __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
    }
    
    void LCD_data(unsigned char data) //ENVOI D'UNE DONNEE LCD ~~~~~~~~~~~~~~~~~~~~~
    {
        RS = 1; //Ecrire une donnée
        PORTB = data>>4; //Envoi des 4 bits de poids forts MSB
        __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
        PORTB = data; //Envoi des 4 bits de poids faible LSB
         __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
    }
    
    void LCD_goto(char position) //FONCTION POSITION CURSEUR LCD ~~~~~~~~~~~~~~~~~~~
    {
        RS = 0; //Ecrire une commande
        PORTB = (0x80+position)>>4; //0x80 = Ecrire dans la DDRAM / position curseur
        __delay_ms(1);
        EN = 1;
        __delay_ms(1);
        EN = 0;
        PORTB = (0x80+position); //0x80 = Ecrire dans la DDRAM / position curseur
         __delay_ms(1);         
        EN = 1;
        __delay_ms(1);
        EN = 0;
    }
    Merci,

    Cotton.

  19. #18
    inviteefe58ca3

    Re : Afficheur LCD + PIC16F876

    Bonjour à tous,

    Je viens compléter mon message :

    Je viens d'effectuer de nouveaux tests aujourd'hui. Après avoir réglé le contraste, j'ai pu apercevoir des caractères. Des caractères, certesMAIS pas les bons ! Pourtant, mon câblage ne m'a pas l'air erroné. Je juge donc que le problème vient de l'initialisation. Enfin, je suppose ...

    Pouvez vous me le confirmer ? Me dire pourquoi cela ne marche pas IRL alors qu'en simulation, c'est le cas ?

    Merci,

    Cotton.

  20. #19
    invite11398957

    Re : Afficheur LCD + PIC16F876

    Bonsoir,

    Avec xc8 la déclaration : #include<pic16f876.h> n'est pas nécessaire.

    En début de programme il est indiqué que les data sont sur RB4-RB7 et dans les fonctions elles sont sur RB0-RB3, normal ?.

    Désolé mais peu de temps de disponible actuellement.

  21. #20
    inviteefe58ca3

    Re : Afficheur LCD + PIC16F876

    Bonsoir,

    Oui, pour les indications, cela est une erreur. J'ai câblé mon afficheur comme :

    RB3 -> D7,

    à

    RB0 -> D4.

  22. #21
    invite11398957

    Re : Afficheur LCD + PIC16F876

    Bonsoir,

    Test ok sur une carte avec un 16F690 et un afficheur connecté sur les pins 4 à 7 du portb.
    Néanmoins il est préférable de faire quelques modifications sur les délais utilisés dans les fonctions : LCD_cmde, LCD_data et LCD_goto.
    Le code modifié :
    Code:
    #include <xc.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
    #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
    #pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
    #pragma config CP = OFF         // FLASH Program Memory Code Protection bits (Code protection off)
    #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
    #pragma config LVP = OFF        // Low Voltage In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
    #pragma config CPD = OFF        // Data EE Memory Code Protection (Code Protection off)
    #pragma config WRT = ON         // FLASH Program Memory Write Enable (Unprotected program memory may be written to by EECON control)
    
    #define  _XTAL_FREQ 4000000
    #define  RS PORTAbits.RA2
    #define  EN PORTAbits.RA3
    
    // RB7 -> D3 //Connectiques entre PIC et LCD
    // RB6 -> D2 //Connectiques entre PIC et LCD
    // RB5 -> D1 //Connectiques entre PIC et LCD
    // RB4 -> D0 //Connectiques entre PIC et LCD
    
    // INITIALISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    void LCD_Init();
    void LCD_Cmde(unsigned char cmde);
    void LCD_data(unsigned char data);
    void LCD_goto(char position);
    
    char var1;
    char var2;
    char var3;
    
    void main(void) //PROGRAMME PRINCIPAL
    {
        //INITIALISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        TRISA = 0b00000011;
        ADCON1 = 0b00001110;
        TRISB = 0b11000000;
        TRISC = 0b11000000;
    
        TXSTA = 0b00000110;
        RCSTA = 0b10010000;
        SPBRG = 25;
    
        PORTA = 0;
        PORTB = 0;
        RCREG = 0x00;
    
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        LCD_Init(); //Initialisation LCD
    
        LCD_goto(0x03); //Décale le curseur ligne 1, position 3
    
        LCD_data('P');
        LCD_data('r');
        LCD_data('o');
        LCD_data('j');
        LCD_data('e');
        LCD_data('t');
        LCD_data(' ');
        LCD_data('B');
        LCD_data('T');
        LCD_data('S');
    
        LCD_goto(0x43); //Décale le curseur ligne 2, position 0
    
        LCD_data('G');
        LCD_data('i');
        LCD_data('g');
        LCD_data('a');
        LCD_data(' ');
        LCD_data('P');
        LCD_data('i');
        LCD_data('x');
        LCD_data('e');
        LCD_data('l');
    
        __delay_ms(3000);
    
        LCD_Cmde(0x01); //Efface LCD
    
        LCD_data('V');
        LCD_data('i');
        LCD_data('t');
        LCD_data('e');
        LCD_data('s');
        LCD_data('s');
        LCD_data('e');
        LCD_data(':');
    
        while (1)
        {
            int variable = RCREG; //Contenu de RCREG stocké dans variable
    
            var1 = variable/100;
     	var2 = (variable%100)/10;
     	var3 = variable%10;
    
     	LCD_data(var1+'0'); //Ecrire les centaines sur LCD
            __delay_us(100);
     	LCD_data(var2+'0'); //Ecrire les dizianes sur LCD
            __delay_us(100);
            LCD_data(var3+'0'); //Ecrire les unités sur LCD
            __delay_us(100);
            LCD_goto(0x08); //Décale le curseur ligne 1, position 8
            __delay_us(100);
        }
    }
    
    void LCD_Init (void) //FONCTION D'INITIALISATION LCD ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    {
        __delay_ms(15);
        LCD_Cmde(0b00110000); //En mode 8 bits
        __delay_ms(5);
        LCD_Cmde(0b00110000); //En mode 8 bits
        __delay_ms(5);
        LCD_Cmde(0b00110010); //En mode 8 bits
        __delay_us(100);
        LCD_Cmde(0x28); //En mode 4 bits / 2 lignes
        __delay_us(100);
        LCD_Cmde(0x28);
        __delay_us(100);
        LCD_Cmde(0x0C); //Display ON/OFF / Cursor off
        __delay_us(100);
        LCD_Cmde(0x01) //Efface LCD
        __delay_us(100);
    }
    
    void LCD_Cmde(char cmde) //FONCTION ENVOI D'UNE COMMANDE LCD ~~~~~~~~~~~~~~~~~~~
    {
        RS = 0; //Ecrire une commande
        PORTB = cmde>>4; //Envoi des 4 bits de poids forts MSB
        __delay_us(10);
        EN = 1;
        __delay_us(10);
        EN = 0;
        PORTB = cmde; //Envoi des 4 bits de poids faible LSB
         __delay_us(10);
        EN = 1;
        __delay_us(10);
        EN = 0;
        __delay_ms(2);
    }
    
    void LCD_data(unsigned char data) //ENVOI D'UNE DONNEE LCD ~~~~~~~~~~~~~~~~~~~~~
    {
        RS = 1; //Ecrire une donnée
        PORTB = data>>4; //Envoi des 4 bits de poids forts MSB
        __delay_us(10);
        EN = 1;
        __delay_us(10);
        EN = 0;
        PORTB = data; //Envoi des 4 bits de poids faible LSB
         __delay_us(10);
        EN = 1;
        __delay_us(10);
        EN = 0;
        __delay_us(100);
    }
    
    void LCD_goto(char position) //FONCTION POSITION CURSEUR LCD ~~~~~~~~~~~~~~~~~~~
    {
        RS = 0; //Ecrire une commande
        PORTB = (0x80+position)>>4; //0x80 = Ecrire dans la DDRAM / position curseur
        __delay_us(10);
        EN = 1;
        __delay_us(10);
        EN = 0;
        PORTB = (0x80+position); //0x80 = Ecrire dans la DDRAM / position curseur
         __delay_us(10);
        EN = 1;
        __delay_us(10);
        EN = 0;
        __delay_ms(2);
    }

  23. #22
    invite5637435c

    Re : Afficheur LCD + PIC16F876

    Bonjour,

    il est surtout préférable d'utiliser le "busy flag", il est là pour ça, pour faire les choses correctement
    Sans quoi d'un afficheur à l'autre le résultat sera incertain ou au pif, ce qui n'est pas très rigoureux comme démarche.

  24. #23
    invite11398957

    Re : Afficheur LCD + PIC16F876

    Bonsoir,

    Si cela fonctionne pour éviter ceci :
    Code:
    LCD_goto(0x03); //Décale le curseur ligne 1, position 3
    
        LCD_data('P');
        LCD_data('r');
        LCD_data('o');
        LCD_data('j');
        LCD_data('e');
        LCD_data('t');
        LCD_data(' ');
        LCD_data('B');
        LCD_data('T');
        LCD_data('S');
    
        LCD_goto(0x43); //Décale le curseur ligne 2, position 0
    
        LCD_data('G');
        LCD_data('i');
        LCD_data('g');
        LCD_data('a');
        LCD_data(' ');
        LCD_data('P');
        LCD_data('i');
        LCD_data('x');
        LCD_data('e');
        LCD_data('l');
    
        __delay_ms(3000);
    
        LCD_Cmde(0x01); //Efface LCD
    
        LCD_data('V');
        LCD_data('i');
        LCD_data('t');
        LCD_data('e');
        LCD_data('s');
        LCD_data('s');
        LCD_data('e');
        LCD_data(':');

    je vous propose de modifier le code :
    Code:
    #include <xc.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
    #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
    #pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
    #pragma config CP = OFF         // FLASH Program Memory Code Protection bits (Code protection off)
    #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
    #pragma config LVP = OFF        // Low Voltage In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
    #pragma config CPD = OFF        // Data EE Memory Code Protection (Code Protection off)
    #pragma config WRT = ON         // FLASH Program Memory Write Enable (Unprotected program memory may be written to by EECON control)
    
    #define  _XTAL_FREQ 4000000
    #define  RS PORTAbits.RA2
    #define  EN PORTAbits.RA3
    
    const char cc[]="Projet BTS";
    const char dd[]="Giga pixel";
    const char vv[]="Vitesse:";
    
    // RB7 -> D3 //Connectiques entre PIC et LCD
    // RB6 -> D2 //Connectiques entre PIC et LCD
    // RB5 -> D1 //Connectiques entre PIC et LCD
    // RB4 -> D0 //Connectiques entre PIC et LCD
    
    // INITIALISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    void LCD_Init();
    void LCD_Cmde(unsigned char cmde);
    void LCD_data(unsigned char data);
    void LCD_goto(char position);
    void LCD_Write_Text(const char *msg);
    
    char var1;
    char var2;
    char var3;
    
    void main(void) //PROGRAMME PRINCIPAL
    {
        //INITIALISATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        TRISA = 0b00000011;
        ADCON1 = 0b00001110;
        TRISB = 0b11000000;
        TRISC = 0b11000000;
    
        TXSTA = 0b00000110;
        RCSTA = 0b10010000;
        SPBRG = 25;
    
        PORTA = 0;
        PORTB = 0;
        RCREG = 0x00;
    
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        LCD_Init(); //Initialisation LCD
    
        LCD_goto(0x03); //Décale le curseur ligne 1, position 3
        LCD_Write_Text(cc);
        LCD_goto(0x43); //Décale le curseur ligne 2, position 0
        LCD_Write_Text(dd);
        __delay_ms(3000);
        LCD_Cmde(0x01); //Efface LCD
        LCD_Write_Text(vv);
        
    
        while (1)
        {
            int variable = RCREG; //Contenu de RCREG stocké dans variable
    
            var1 = variable/100;
     	var2 = (variable%100)/10;
     	var3 = variable%10;
    
     	LCD_data(var1+'0'); //Ecrire les centaines sur LCD
            __delay_us(100);
     	LCD_data(var2+'0'); //Ecrire les dizianes sur LCD
            __delay_us(100);
            LCD_data(var3+'0'); //Ecrire les unités sur LCD
            __delay_us(100);
            LCD_goto(0x08); //Décale le curseur ligne 1, position 8
            __delay_us(100);
        }
    }
    
    void LCD_Init (void) //FONCTION D'INITIALISATION LCD ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    {
        __delay_ms(15);
        LCD_Cmde(0b00110000); //En mode 8 bits
        __delay_ms(5);
        LCD_Cmde(0b00110000); //En mode 8 bits
        __delay_ms(5);
        LCD_Cmde(0b00110010); //En mode 8 bits
        __delay_us(100);
        LCD_Cmde(0x28); //En mode 4 bits / 2 lignes
        __delay_us(100);
        LCD_Cmde(0x28);
        __delay_us(100);
        LCD_Cmde(0x0C); //Display ON/OFF / Cursor off
        __delay_us(100);
        LCD_Cmde(0x01) //Efface LCD
        __delay_us(100);
    }
    
    void LCD_Cmde(char cmde) //FONCTION ENVOI D'UNE COMMANDE LCD ~~~~~~~~~~~~~~~~~~~
    {
        RS = 0; //Ecrire une commande
        PORTB = cmde>>4; //Envoi des 4 bits de poids forts MSB
        __delay_us(10);
        EN = 1;
        __delay_us(10);
        EN = 0;
        PORTB = cmde; //Envoi des 4 bits de poids faible LSB
         __delay_us(10);
        EN = 1;
        __delay_us(10);
        EN = 0;
        __delay_ms(2);
    }
    
    void LCD_data(unsigned char data) //ENVOI D'UNE DONNEE LCD ~~~~~~~~~~~~~~~~~~~~~
    {
        RS = 1; //Ecrire une donnée
        PORTB = data>>4; //Envoi des 4 bits de poids forts MSB
        __delay_us(10);
        EN = 1;
        __delay_us(10);
        EN = 0;
        PORTB = data; //Envoi des 4 bits de poids faible LSB
         __delay_us(10);
        EN = 1;
        __delay_us(10);
        EN = 0;
        __delay_us(100);
    }
    
    void LCD_goto(char position) //FONCTION POSITION CURSEUR LCD ~~~~~~~~~~~~~~~~~~~
    {
        RS = 0; //Ecrire une commande
        PORTB = (0x80+position)>>4; //0x80 = Ecrire dans la DDRAM / position curseur
        __delay_us(10);
        EN = 1;
        __delay_us(10);
        EN = 0;
        PORTB = (0x80+position); //0x80 = Ecrire dans la DDRAM / position curseur
         __delay_us(10);
        EN = 1;
        __delay_us(10);
        EN = 0;
        __delay_ms(2);
    }
    
    void LCD_Write_Text(const char *msg)
    {
        while(*msg)
        {
            LCD_data(*msg);
            msg++;
        }
    }
    dans la boucle while(1) il n'y a pas de tempo ou de test si modification de "variable", à regarder !

  25. #24
    inviteefe58ca3

    Re : Afficheur LCD + PIC16F876

    Bonjour,

    Merci de vos réponses. Je vais l'intégré au programme que j'ai sous la main actuellement.

    MON PROGRAMME FONCTIONNE ! J'ai légèrement modifier l'initialisation du LCD et j'ai refais mon câblage sur une base plus "fiable". En effet, des faux contacts sur ma plaque, vieillissante, perturbaient les tests.

    Je n'ai pas encore testé avec la liaison série en affichant la donnée reçue après "Vitesse :". Mais normalement, cela devrait fonctionner .

    Je vous remercie donc pour votre aide. Je vous tiens au courant si j'ai encore un problèmes de ce coté là.


    Un grand merci pour vos réponses,

    Cotton.

Discussions similaires

  1. SPI sur PIC16F876
    Par invite313e8f19 dans le forum Électronique
    Réponses: 2
    Dernier message: 22/02/2012, 09h41
  2. pic16F876
    Par invite77e59936 dans le forum Électronique
    Réponses: 1
    Dernier message: 29/05/2009, 02h30
  3. Pb Afficheur (2*16) GDM1602A + PIC16f876
    Par invite9f4b8fa4 dans le forum Électronique
    Réponses: 14
    Dernier message: 06/03/2008, 16h23
  4. Pic16f876
    Par invite0f39f32f dans le forum Électronique
    Réponses: 1
    Dernier message: 02/05/2006, 18h48
  5. PIC16F876
    Par inviteaaaccd27 dans le forum Électronique
    Réponses: 1
    Dernier message: 04/02/2004, 13h56
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...