[Programmation] Mise en œuvre d'un LCD
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Mise en œuvre d'un LCD



  1. #1
    davidif

    Mise en œuvre d'un LCD


    ------

    Bonjour, je suis en train de mettre en oeuvre un lcd 128/64 : référence EA DOGM128-6
    Pour ça je me suis procuré le retro-éclairage https://fr.rs-online.com/web/p/retro...8699/?sra=pstk
    et le lcd : https://fr.rs-online.com/web/p/affic...8670/?sra=pstk

    j'ai donc implémenté mon interface SPI de mon pic32mx796f512l via mplabx et harmony
    j'ai à priori réussi à initialisé car des pixels viennent s'afficher en désordre et j'essai maintenant de l'éclaircir mais n'y arrive pas pour le moment.

    pour tout ça je me base sur les codes sur ce site : https://www.lcd-module.com/support/a...tion-note.html

    mais en fait je me pose une question sur la présence de traînés noir que j'avais depuis le début avant même de les mettre sous tension et pensais qu'à l'initialisation ils disparaîtrons mais c'est toujours présent ... à l'init les pixels apparaissent mais je perçois toujours en transparence ces trainés.

    Est-ce quelque qui doit disparaître, par le biais de commande selon vous ou ils sont foutu ?

    Merci de vos conseils.

    -----

  2. #2
    nornand

    Re : Mise en oeuvre d'un LCD

    Bsr hors tension , aucun pixel ne doit apparaître .

  3. #3
    jiherve

    Re : Mise en oeuvre d'un LCD

    bonsoir
    et bien sur toute la tripaille annexe(condos) a été cablée ou fait elle partie du backlight?
    Cet afficheur ne fonctionne pas à poil!
    j'en utilise mais avec un Propeller Parallax.
    JR
    l'électronique c'est pas du vaudou!

  4. #4
    davidif

    Re : Mise en oeuvre d'un LCD

    Citation Envoyé par jiherve Voir le message
    bonsoir
    et bien sur toute la tripaille annexe(condos) a été cablée ou fait elle partie du backlight?
    Cet afficheur ne fonctionne pas à poil!
    j'en utilise mais avec un Propeller Parallax.
    JR
    Oui, biensure
    Schéma classic, que j'ai repris de la doc

    Nom : elec_aff.jpg
Affichages : 261
Taille : 104,8 Ko

    Pour les trainés, je pense avoir fait ça comme un boeuf et avoir oublié de retirer toutes les protections plastic présent sur les 2 côtés de l'afficheur, également présent sur le rétro-éclairage.
    Je l'ai retiré sur le dessus mais j'ai pas fait gaffe pour les autres .... je sais (: j'entend déjà les retours qui seront légitimes (: ...
    Je suis donc bon pour racheter tout au moins le LCD que j'ai du mal à récupérer ... en attendant je continu mes tests avec le deuxième restant que je démonterai une fois mes achats reçu.

    Biensure, c'est la première fois que je met en oeuvre ce genre de lcd graphique, j'ai déjà utilisé des lcd mais du 2x16 alpha-numérique donc moins compliqué à implémenter, enfin pour moi (:

    pour le moment j'ai généré mon code SPI puis l'initialisation :

    Code:
    void write_data(char i)
    {
    char myBuffer[8]={i}, state = 0;
    DRV_SPI_BUFFER_HANDLE bufferHandle;
    
                    switch ( state )
                        {
                        case 0:
                            //bufferHandle = DRV_SPI_BufferAddWrite( handle, myBuffer, 10, NULL, NULL );
                            
                            SS1Off();
                             bufferHandle =DRV_SPI0_BufferAddWrite (&myBuffer,1 , NULL, NULL ); 
                            SS1On();
                            
                            if(bufferHandle != DRV_SPI_BUFFER_HANDLE_INVALID )
                             {
                                state++;
                             }
                        break;
                        
                        case 1:
                        
                            if(DRV_SPI_BufferStatus(bufferHandle) == DRV_SPI_BUFFER_EVENT_COMPLETE)
                            {
                            state=0;
                            
                            // All transmitter data has been sent successfully.
                            }
    
                        break;
                        
                        }
    
    }
    les codes à envoyer

    Code:
    #define DISPOFF      0xAE
    #define DISPON       0xAF   //Display on
    #define DISPSTART    0x40  //Display start line 0
    #define PAGEADR      0xB0 //Page 0 einstellen
    #define COLADRL      0x00
    #define COLADRH      0x10 //High-Nible der Spaltenadresse
    #define ADCNORMAL    0xA0  //Low-Nible der Spaltenadresse
    #define ADCREVERSE   0xA1
    #define COMNORMAL    0xC0
    #define COMREVERSE   0xC8
    #define DISPNORMAL   0xA6
    #define DISPREVERSE  0xA7
    #define LCDBIAS9     0xA2
    #define LCDBIAS7     0xA3
    #define RESET        0xE2
    #define SETPOWERCTRL 0x28
    #define REGRESISTOR  0x20
    #define SETCONTRAST  0x81
    #define SETCONTRAST1  0x16
    #define STATINDMODE  0xAC
    #define BOOSTERRATIO 0xF8  //Set internal Booster to 4x
    #define BOOSTER      0x2F  // Booster, Regulator and Follower On
    #define CONTRAST     0x27  //Contrast set

    code initialisation, qui à priori à l'aire de fonctionner pour m'avoir inscrit des pixels aléatoirement positionnés

    Code:
    void init_LCD128()
    {
        
                
                LCD_RSTOn(); //RESET-pin must be set to high (as along as the pin RESET is low, nothing works).
                
                //SS1Off();// CS-pin must be set to low (It can be written to the display, display input buffer is cleared).
                LCD_A0Off(); //A0-pin  must be set to low (The display is prepared to receive command data).
                
                write_data(DISPSTART);// 40 display start line
                write_data(ADCREVERSE);//Send hex A1 to the display: ADC reverse, 6 o'clock viewing direction
                write_data(COMNORMAL);//Send hex C0 to the display: COM0 ? COM63 in normal scan mode
                write_data(DISPNORMAL);//Send hex A6 to the display: Display normal, not mirrored
                write_data(LCDBIAS9);//Send hex A2 to the display: Set bias 1/9 (Duty 1/65)
                write_data(BOOSTER);//Send hex 2F to the display: Booster, regulator and follower on
                write_data(BOOSTERRATIO);//Send hex F8 to the display: Set internal booster to 4x
                write_data(COLADRL);//Send hex 00 to the display: Set internal booster to 4x
                write_data(CONTRAST);//Send hex 27 to the display: Contrast set
                write_data(SETCONTRAST);//Send hex 81 to the display: Contrast set
                write_data(SETCONTRAST1);//Send hex 16 to the display: Contrast set
                write_data(STATINDMODE);//Send hex AC to the display: No indicator
                write_data(COLADRL);//Send hex 00 to the display: No indicator
                write_data(DISPON);//Send hex AF to the display: No indicator
                
                //SS1On();//End of Initialization set the CS-pin to high again
                LCD_A0On();
        
    }
    et là j'essai de faire un clear qui pour le moment ne fonctionne pas

    Code:
    void clear_lcd ()
    {
        
        uint16_t i;
        //uint8_t pixel;
        uint8_t colonne;
        
        colonne=0;
        
        send_data(PAGEADR); // 0xB0 page 0 
        
        while(colonne < 8)
        {    
            send_data(PAGEADR+colonne);
            
    
                for(i=0;i++;i=127)
                 {
                     send_data(0);   
    
                 }
            
        colonne++;    
        }
        
        send_data(PAGEADR);
        //send_data(SETCONTRAST1);
        //send_data(COLADRL);
        LCD_A0Off();
        write_data(SETCONTRAST1);
        write_data(0);
        LCD_A0On();
        
        
        send_data(DISPSTART);
    }
    Merci

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

    Re : Mise en oeuvre d'un LCD

    Ha oui, j'ai également vérifié les tensions détaillés également pour chaque pin de 21 à 40 et elle sont tous plutôt bonnes, sauf en 31(cap3p) ou j'ai du 10.85 au lieu de 4.8v.
    Aussi du 3.13 pour du A0, RST, CS1B.

  7. #6
    davidif

    Re : Mise en oeuvre d'un LCD

    après l'initialisation

    Nom : 20201117_161901.jpg
Affichages : 273
Taille : 55,5 Ko

    Mais je n'arrive pas à effacer les pixels avec ma fonction clear_lcd

    Code:
    void clear_lcd ()
    {
        
        uint16_t i;
        //uint8_t pixel;
        uint8_t page;
        
        page=0;
        
        //send_data(PAGEADR); // 0xB0 page 0 
    
        //send_data(0);
        
        while(page < 9)
        {  
            
        send_command(PAGEADR);
        //pixel=0;
    
                for(i=0;i<128;i++)
                 {  
                     //send_data(PAGEADR+i);   
                     send_data(0); 
                 }
            
        page++;    
        }
        
        send_command(PAGEADR);
        
        //LCD_A0Off();
        send_command(COLADRH);
        send_command(0);
        //LCD_A0On();
        send_command(DISPSTART);
    }
    en m'inspirant du raisonnement allemand sur les site constructeur : https://www.lcd-module.com/support/a...tion-note.html
    http://www.lcd-module.de/deu/disk/de...0DOGM128-6.doc

    s'il vous plait, auriez vous une suggestion , merci pour votre aide

  8. #7
    davidif

    Re : Mise en oeuvre d'un LCD

    Bon bah problème résolu,

  9. #8
    jiherve

    Re : Mise en oeuvre d'un LCD

    bonsoir,
    peut on en savoir plus?
    JR
    l'électronique c'est pas du vaudou!

  10. #9
    davidif

    Re : Mise en oeuvre d'un LCD

    bonsoir,

    Effectivement après quelques difficultés je suis arrivé à piloter mon écran LCD,
    Cependant je tente maintenant de remplir une jauge de 22/48 pixel, pour ça je me sert d'un fichier image d'une jauge vide dont je me sert pour la remplir en fonction d'une valeur de 0 à 100%

    20201204_093400 (1).jpg

    chacune des jauges sont indépendante et font 22/48 pixels représenté par le tableau d'une batterie vide "Image_batterie_vide[Image_batterie_vide_LEN]"
    l'idée est donc de partir de l'image d'une batterie vide et qu'elle ce remplisse (ou ce vide) au fur et à mesure de l'évolution d'une variable dont la valeur évolue de 0 à 100%.

    Je viens donc renseigner ce tableau :
    unsigned char Image_batterie1[134]; à l'aide de celui d'une batterie vide.

    sachant que les valeurs du tableau change de la dernière valeur à la première, par packet de 22 chiffres de tel sorte :

    D'ou ce tableau uint8_t tab_pixel[8]={255,254,252,248,240,224,192, 128};

    la première ligne les valeurs des 22 derniers doivent prendre la valeurs de 128.
    la deuxième ligne les valeurs des 22 derniers doivent prendre la valeurs de 192.
    la troisième ligne les valeurs des 22 derniers doivent prendre la valeurs de 224.
    la 4ième ligne les valeurs des 22 derniers doivent prendre la valeurs de 240.
    la 5ième ligne les valeurs des 22 derniers doivent prendre la valeurs de 248.
    la 6ième ligne les valeurs des 22 derniers doivent prendre la valeurs de 252.
    la 7ième ligne les valeurs des 22 derniers doivent prendre la valeurs de 254.
    la 8ième ligne les valeurs des 22 derniers doivent prendre la valeurs de 255.

    la 9ième ligne les valeurs des 22 avant derniers doivent prendre la valeurs de 128.
    la 10ième ligne les valeurs des 22 avant derniers doivent prendre la valeurs de 192.
    la 11ième ligne les valeurs des 22 avant derniers doivent prendre la valeurs de 224.
    la 12ième ligne les valeurs des 22 avant derniers doivent prendre la valeurs de 240.
    la 13ième ligne les valeurs des 22 avant derniers doivent prendre la valeurs de 248.
    la 14ième ligne les valeurs des 22 avant derniers doivent prendre la valeurs de 252.
    la 15ième ligne les valeurs des 22 avant derniers doivent prendre la valeurs de 254.
    la 16ième ligne les valeurs des 22 avant derniers doivent prendre la valeurs de 255.

    -
    -
    -

    Une fois le tableau renseigné de ces nouvelles valeurs je viens l'afficher aussitôt avec la fonction d'affichage :
    picture(0,0, Image_batterie1);

    Voila comment pourrais ce faire la fonctionnalité imaginé.
    Mes notion de programmation étant limité j'ai pensé au première abord à définir les opérations ci-dessus.

    actuellement, je rempli mon tableau mais pas tout à fait comme je souhaite

    20210110_181246.jpg

    mon soft :

    Code:
    void niveaux(uint8_t niveau_bat,unsigned char *tab_gauge)
    {
    
    uint8_t nbr_data;//=niveau_bat/2;  //valeur du soc compris entre 0 et 50 
    uint8_t i,j,k,l,temp;
    uint8_t size=133;
    
    temp=22;
    for(l=2 ; l>size ; l++) {tab_gauge[l]=0;}
    i=j=k=l=0;
    
    tab_gauge[0]=22;
    tab_gauge[1]=48;
    
    nbr_data = niveau_bat;  //rendre en proportion du tableau 
    unsigned char tab_pixel[]={0,128,192,224,240,248,252,254,255};
    
    		for(k=0; k < 6 ; k++)
    		{
                    
                    for(l=0;l<8; l++)
                    {
                            for(i=0; i<23 ; i++) // par ligne de 22 
                            {
                                
                            size=size-i;    
    
                                    for(j=0 ;j<9;j++) // scan du tableau de valeur de données possible 
                                    {
    
                                        if(Image_batterie_vide[size]==tab_pixel[j]){ tab_gauge[size]=tab_pixel[j+1];j=9;}
                                        if(tab_gauge[size]>=255)tab_gauge[size]=255;	
                                        
                                    }
    
                            //nbr_data--;   
                                    
                            }
    
                    var=size=size+i;
                    nbr_data--;
                    if(nbr_data==0) {l=8; k=6;}       
                    }            
    		size=size-temp;
    		}
    
    
        
    }

    Code:
    #define Image_batterie_vide_LEN  134
    
    unsigned char Image_batterie_vide[Image_batterie_vide_LEN] =
    {
       22, 48,
      255,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,255,
      255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,
      255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,
      255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,
      255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,
      255,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,255
    };

    là j'ai un peut de mal à comprendre

    J'espère avoir été plus claire.
    Merci pour vos éclairage
    Dernière modification par davidif ; 10/01/2021 à 19h47.

  11. #10
    davidif

    Re : Mise en oeuvre d'un LCD

    Bonsoir, en fait je viens de m'apercevoir qu'il suffit d'incrémenter des 1 binaire pour ainsi allumer les pixels correspondant à la ligne

    D0 0 0 0 0 0 0 0 0 1
    D1 0 0 0 0 0 0 0 1 1
    D2 0 0 0 0 0 0 1 1 1
    D3 0 0 0 0 0 1 1 1 1
    D4 0 0 0 0 1 1 1 1 1
    D5 0 0 0 1 1 1 1 1 1
    D6 0 0 1 1 1 1 1 1 1
    D7 0 1 1 1 1 1 1 1 1

    val 0 128 192 224 240 248 252 254 255

    que opération puis-je faire pour ajouter du 1 sur un mot binaire ?

    Merci

  12. #11
    davidif

    Re : Mise en oeuvre d'un LCD

    bonjour,

    je verrais bien quelque chose comme ça ,

    Code:
    void niveaux(uint8_t niveau_bat,unsigned char *tab_gauge)
    {
    
    uint8_t nbr_data;//=niveau_bat/2;  //valeur du soc compris entre 0 et 50 
    uint8_t i,k,l,temp;
    uint8_t size=133;
    
    temp=22;
    for(l=2 ; l>size ; l++) {tab_gauge[l]=0;}
    i=k=l=0;
    
    //tab_gauge[0]=22;
    //tab_gauge[1]=48;
    
    nbr_data = niveau_bat;  //rendre en proportion du tableau 
    
    		for(k=0; k < 6 ; k++)
    		{
                    
                    for(l=0;l<8; l++)
                    {
                            for(i=0; i<23 ; i++) // par ligne de 22 
                            {
                                
                            size=size-i; 
    						//tab_gauge[size]=(Image_batterie_vide[size]>>1) | 0x80 ; 
                            tab_gauge[size]=(tab_gauge[size] >>1) | 0x80 ;
                            //nbr_data--;   
                                    
                            }
    
                    size=size+i;
                    //nbr_data--;
                    if(nbr_data==0) {l=8; k=6;}       
                    }    
    				
    		size=size-temp;
    		}
    
    tab_gauge[0]=22;
    tab_gauge[1]=48;
    }
    soit je me calle sur l'image d'une batterie vide :
    tab_gauge[size]=(Image_batterie_vide[size]>>1) | 0x80 ;

    20210111_093247.jpg

    soit je rempli en fichier vide
    tab_gauge[size]=(tab_gauge[size]
    20210111_093007.jpg

    merci de votre aide
    Dernière modification par davidif ; 11/01/2021 à 09h39.

Discussions similaires

  1. [Programmation] Mise en œuvre bus I2C
    Par davidif dans le forum Électronique
    Réponses: 28
    Dernier message: 24/01/2021, 12h57
  2. Changer anti-fausse manœuvre fenêtre oscillo-battante
    Par invite01a895d5 dans le forum Bricolage et décoration
    Réponses: 6
    Dernier message: 11/09/2020, 11h49
  3. [Programmation] Mise en œuvre du basic 8052
    Par invite1d577638 dans le forum Électronique
    Réponses: 106
    Dernier message: 12/07/2016, 11h56
  4. Pour le plaisir Misumena vatia à l'œuvre.
    Par invite13787621101991 dans le forum Identification des espèces animales ou végétales
    Réponses: 5
    Dernier message: 04/06/2012, 10h41
  5. en manœuvre
    Par inviteaab9221a dans le forum Mathématiques du collège et du lycée
    Réponses: 7
    Dernier message: 24/07/2006, 12h26
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...