[Programmation] 4bits lcd-pic18f4520-mplab
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

4bits lcd-pic18f4520-mplab



  1. #1
    Jordina

    4bits lcd-pic18f4520-mplab


    ------

    Bonjour tout le monde,

    j'aimerais que mon afficheur soit connecté sur le microcontrôleur pic18f4520 comme suit :

    Partie data
    D7 --> PORB3
    D6 --> PORB2
    D5 --> PORB1
    D4 --> PORB0

    Partie commande
    RS--> PORB4
    EN --> PORA3
    RW --> PORA2

    J'ai réussis à contrôler la partie commande mais la partie data ne marche pas comme je le veux.

    Elle fonctionne unique lorsqu'il est connecté sur le microcontrôleur comme suit:
    D7 --> PORB7
    D6 --> PORB6
    D5 --> PORB5
    D4 --> PORB4

    Quelqu'un peut me dire ce qui ne marche pas svp ?

    Code:
    CODE: 
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define vref 5.00 /*Reference Voltage is 5V*/
    
    
    #define RS PORTBbits.RB3  /*PIN 0 of PORTB is assigned for register select Pin of LCD*/
    #define EN PORTAbits.RA3  
    #define RW PORTAbits.RA2/*PIN 1 of PORTB is assigned for enable Pin of LCD */
    #define ldata PORTB  /*PORTB(PB4-PB7) is assigned for LCD Data Output*/ 
    
    
    
    void LCD_Init()
    {
         TRISB=00000000;
        //LCD_Port = 0;       /*PORT as Output Port*/
        TRISAbits.RA2=0x0;
        TRISAbits.RA3=0x0;
        MSdelay(15);        /*15ms,16x2 LCD Power on delay*/
        LCD_Command(0x02);  /*send for initialization of LCD 
                              for nibble (4-bit) mode */
        LCD_Command(0x28);  /*use 2 line and 
                              initialize 5*8 matrix in (4-bit mode)*/
    	LCD_Command(0x01);  /*clear display screen*/
        LCD_Command(0x0c);  /*display on cursor off*/
    	LCD_Command(0x06);  /*increment cursor (shift cursor to right)*/	   
    }
    
    void LCD_Command(unsigned char cmd )
    {
        //LATB=(0<<3) | (0<2) | (1<<1)| (1<<0);
        //ldata=LATB;
    	ldata = (ldata & 0x0f) |(0xF0 & cmd);  /*Send higher nibble of command first to PORT*/ 
    	RS = 0;  /*Command Register is selected i.e.RS=0*/ 
    	EN = 1;  /*High-to-low pulse on Enable pin to latch data*/ 
    	NOP();
    	EN = 0;
    	MSdelay(1);
        ldata = (ldata & 0x0f) | (cmd<<4);  /*Send lower nibble of command to PORT */
        EN = 1;
    	NOP();
    	EN = 0;
    	MSdelay(3);
    }
    void LCD_Char(unsigned char dat)
    {
        
        //LATB=(0<<4) | (0<5) | (1<<6)| (1<<7);
        //ldata=LATB;
    	ldata = (ldata & 0x0f) | (0xF0 & dat);  /*Send higher nibble of data first to PORT*/
    	RS = 1;  /*Data Register is selected*/
    	EN = 1;  /*High-to-low pulse on Enable pin to latch data*/
    	NOP();
    	EN = 0;
    	MSdelay(1);
        ldata = (ldata & 0x0f) | (dat<<4);  /*Send lower nibble of data to PORT*/
    	EN = 1;  /*High-to-low pulse on Enable pin to latch data*/
    	NOP();
    	EN = 0;
    	MSdelay(3);
    }
    
    
    
    
    void LCD_String(const char *msg)
    {
    	while((*msg)!=0)
    	{		
    	  LCD_Char(*msg);
    	  msg++;	
        }
    }
    
    void LCD_String_xy(char row,char pos,const char *msg)
    {
        char location=0;
        if(row<=1)
        {
            location=(0x80) | ((pos) & 0x0f);  /*Print message on 1st row and desired location*/
            LCD_Command(location);
        }
        else
        {
            location=(0xC0) | ((pos) & 0x0f);  /*Print message on 2nd row and desired location*/
            LCD_Command(location);    
        }  
        
    
        LCD_String(msg);
    
    }
    void LCD_Clear()
    {
       	LCD_Command(0x01);  /*clear display screen*/
        MSdelay(3);
    }
    
    void MSdelay(unsigned int val)
    {
     unsigned int i,j;
     for(i=0;i<val;i++)
         for(j=0;j<165;j++);  /*This count Provide delay of 1 ms for 8MHz Frequency */
     }

    -----
    Dernière modification par gienas ; 02/08/2021 à 06h53. Motif: Ajouté les balises code obligatoires pour les programmes

  2. #2
    Bitrode

    Re : 4bits lcd-pic18f4520-mplab

    Bonjour,

    il faut modifier ton code pour que les datas soient transmises sur les bonnes lignes, visiblement ce code est écrit pour des datas transmises sur le quartet haut du port (dat << 4).
    Du coup forcément ça ne fonctionne pas.

  3. #3
    Jordina

    Re : 4bits lcd-pic18f4520-mplab

    Bonjour Bitrode,

    merci pour ta réponse!

    mon code fonctionne uniquement avec ce câblage.

  4. #4
    Bitrode

    Re : 4bits lcd-pic18f4520-mplab

    Citation Envoyé par Jordina Voir le message
    mon code fonctionne uniquement avec ce câblage.
    Lequel?
    Pour moi ce code fonctionne avec les datas sur D7,D6,D5,D4.
    Pas sur D3,D2,D1,D0, à cause du décalage à gauche par 4 que je t'ai indiqué, le quartet est transmis sur les 4 bits hauts du port alors que les branchements data de ton LCD sont sur les 4 bits bas du port.

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

    Re : 4bits lcd-pic18f4520-mplab

    Bonjour,

    Oui exactement.

    j'ai essayé de le modifier pour le faire fonctionner sur D3, D2, D1, et D0 mais sans succès.

    #define RS PORTBbits.RB3 /*PIN 0 of PORTB is assigned for register select Pin of LCD*/
    #define EN PORTAbits.RA3
    #define RW PORTAbits.RA2/*PIN 1 of PORTB is assigned for enable Pin of LCD */
    #define ldata PORTB /*PORTB(PB4-PB7) is assigned for LCD Data Output*/
    //#define LCD_Port TRISB /*define macros for PORTB Direction Register*/
    //#define LCD_Port TRISB=0xF0;
    //#define Electrov PORTAbits.RA0
    //#define Valid PORTDbits.RD7


    //#define Electrov RD7
    //#define Valid RC0

    /*********************Proto-Type Declaration******************* **********/

    void MSdelay(unsigned int ); /*Generate delay in ms*/
    void LCD_Init(); /*Initialize LCD*/
    void LCD_Command(unsigned char ); /*Send command to LCD*/
    void LCD_Char(unsigned char x); /*Send data to LCD*/
    void LCD_String(const char *); /*Display data string on LCD*/
    void LCD_String_xy(char, char , const char *);
    void LCD_Clear(); /*Clear LCD Screen*/

    void LCD_String_xy(char ,char ,const char*);
    void ADC_Init();
    int ADC_Read(int);



    int main(void)
    {
    // OSCCON = 0x72; /*Use internal oscillator and
    // set frequency to 8 MHz*/
    //LCD_Init(); /*Initialize LCD to 5*8 matrix in 4-bit mode*/
    //LCD_String_xy(1,5,"Hello"); /*Display string on 1st row, 5th location*/
    // LCD_String_xy(2,1,"ElectronicW ings"); /*Display string on 2nd row,1st location*/
    //LCD_String_xy(2,3,"ElectronicW ings");

  7. #6
    Bitrode

    Re : 4bits lcd-pic18f4520-mplab

    Je n'ai pas regardé ton code dans les détails mais me semble-t-il, le code d'origine dont tu te sers a été écrit pour avoir dans le quartet haut les lignes datas et dans le quartet bas les commandes, le tout donc sur le même port.
    Or toi tu souhaites avoir une partie sur le port B et la partie commande répartie sur le port B (RS) et sur le port A (E et R/W).
    Déjà là tu te compliques bien la vie
    Il faut donc restructurer le code pour que ça fonctionne avec ces nouvelles conditions et faire les bons masques pour envoyer les bonnes séquences.

Discussions similaires

  1. programamtion lcd 4bits
    Par invitea883d7b1 dans le forum Électronique
    Réponses: 2
    Dernier message: 20/05/2011, 13h20
  2. Affichage sur LCD en 4bits
    Par invite07bc4d05 dans le forum Électronique
    Réponses: 3
    Dernier message: 20/07/2010, 16h39
  3. programation LCD 4bits avec mikroC
    Par invite0b985a93 dans le forum Électronique
    Réponses: 1
    Dernier message: 24/10/2009, 12h43
  4. afficheur lcd 4bits
    Par invite5207145e dans le forum Électronique
    Réponses: 1
    Dernier message: 27/05/2009, 11h02
  5. Mémoire 4K x 4bits en VHDL
    Par invitec1433000 dans le forum Électronique
    Réponses: 0
    Dernier message: 07/05/2009, 11h33
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...