P18f4520, affichage d'une valeur sur écran LCD picdem 2+
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

P18f4520, affichage d'une valeur sur écran LCD picdem 2+



  1. #1
    invite8d0b7120

    P18f4520, affichage d'une valeur sur écran LCD picdem 2+


    ------

    Bonjour à tous.

    Comme le titre l'indique je dispose de la nouvelle carte (verte) Picdem 2 + Demo Board, équipée d'un P18f4520. Je programme sous MPLAB v8.5 avec le compliateur C18.

    Mon but est d'afficher sur l'écran LCD le résultat d'une conversion analogique numérique.

    Dans un premier temps, j'ai cherché à mettre en route l'écran.
    J'ai trouvé sur un forum microchip la solution:
    http://www.microchip.com/forums/tm.aspx ... 19&mpage=1

    Je peux donc afficher ce que je veux sur l'écran via la fonction putrsXLCD("truc").

    J'ai ensuite tenté de modifier mon programme histoire d'avoir une sorte de "printf" mais qui fonctionne sur l'écran LCD. J'ai essayé de bidouiller le programme suivant:

    #include <spi.h>
    #include <xlcdGre.h>
    #include <p18cxxx.h>
    #include <timers.h>
    #include <delays.h>
    #include <stdlib.h>
    #include <string.h>
    #include "LCDinit.c"
    #include "ftoa.c"

    #define q 4.8828e-3 // quantum pour un CAN 10bits 0v-5v

    /*****/
    #pragma config OSC = HS
    #pragma config PWRT = ON
    #pragma config WDT = OFF, WDTPS = 1
    #pragma config LVP = OFF
    #pragma config DEBUG = OFF
    #pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF,CP3 = OFF,CPB = OFF,CPD = OFF
    #pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF,WRT3 = OFF,WRTB = OFF,WRTC = OFF,WRTD = OFF
    #pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF,EBTR3 = OFF,EBTRB = OFF

    #define TRUE 1

    #define ButtonPP !PORTAbits.RA4 // RE2 push button
    #define ButtonFF !PORTBbits.RB0 // RE0 push button

    #define CLEAR_DISPLAY 0x01

    void DelayFor18TCY(void);
    void DelayPORXLCD(void);
    void DelayXLCD(void);

    char filename[14] ="Picdem2+ test";
    char teststring[15]="End of Testing";

    char artist[17]="----------------" ;
    char title[17]="----------------" ;

    void clear_lcd(int line)
    {


    char ln;
    int x;

    if (line==2) ln = 0xC0;
    else ln = 0x00;


    Delay10KTCYx(5);

    SetDDRamAddr(ln); // set line

    for (x=0; x<16; x++)
    {

    Delay10KTCYx(5);

    WriteDataXLCD(' '); // write a blank
    }


    Delay10KTCYx(5);

    SetDDRamAddr(ln); // set back to beginning
    return;
    }

    /******************************/
    void led(void){
    PORTBbits.RB1 = 1;
    Delay10KTCYx(100);
    PORTBbits.RB1 = 0;
    Delay10KTCYx(100);
    }


    /*************** main starts here **************/
    void main (void)
    {

    char chaine;
    float res;
    int i;
    int somme, result, s, x, y,rs;

    //Setup Ports
    PORTB = 0b00000000; // Setup PORTB
    TRISB = 0b00000001; // RB0 as input. Reset as output

    DDRAbits.RA4 = 1; // play/pause
    DDRBbits.RB0 = 1; // next track

    OpenXLCD(FOUR_BIT & LINES_5X7); // Init the LCD Display

    // Set cursor off

    Delay10KTCYx(20);

    WriteCmdXLCD(DON&CURSOR_OFF&BL INK_OFF);

    while(BusyXLCD());

    Delay10KTCYx(20);

    res=(float)5*q; // calcul simple
    ftoa(res,chaine,5,'f'); // convertit en chaine
    for (i=0;i<0x1ffff;i++); // petite tempo

    putrsXLCD(chaine); // Affichage du résultat sur l'écran

    while (!ButtonPP); //wait for keypress
    Delay100TCYx(0x01);
    while (ButtonPP);

    clear_lcd(2); //set and clear second line

    Delay10KTCYx(10);

    putsXLCD(filename);

    while (!ButtonPP); //wait for keypress
    Delay100TCYx(0x01);
    while (ButtonPP);

    clear_lcd(1); //set and clear second line

    Delay10KTCYx(10);

    putsXLCD(teststring);


    while (1)
    {
    led();
    }
    }

    Je n'obtiens par d'erreur, mais rien n'apparait sur l'écran LCD. Je pense que ma façon de procéder n'est pas la bonne.

    Cordialement.

    -----

  2. #2
    invite8d0b7120

    Re : P18f4520, affichage d'une valeur sur écran LCD picdem 2+

    Petite précision. Le fichier ftoa.c a été pris d'un autre site. Je le mets dans un post à part pour éviter de rendre illisible mon précédent post:

    unsigned char *ftoa (float x, unsigned char *str,char prec,char format)
    {
    /* converts a floating point number to an ascii string */
    /* x is stored into str, which should be at least 30 chars long */
    unsigned char *adpt;
    int ie, i, k, ndig, fstyle;
    double y;
    adpt=str;
    //if (nargs() != 7) IEHzap("ftoa ");
    ndig = ( prec<=0) ? 7 : (prec > 22 ? 23 : prec+1);
    if (format == 'f' || format == 'F')
    fstyle = 1;
    else
    fstyle = 0;
    /* print in e format unless last arg is 'f' */
    ie = 0;
    /* if x negative, write minus and reverse */
    if ( x < 0)
    {
    *str++ = '-';
    x = -x;
    }

    /* put x in range 1 <= x < 10 */
    if (x > 0.0) while (x < 1.0)
    {
    x *= 10.0; // à la place de =*
    ie--;
    }
    while (x >= 10.0)
    {
    x = x/10.0;
    ie++;
    }

    /* in f format, number of digits is related to size */
    if (fstyle) ndig += ie; // à la place de =+

    /* round. x is between 1 and 10 and ndig will be printed to
    right of decimal point so rounding is ... */
    for (y = i = 1; i < ndig; i++)
    y = y/10.;
    x += y/2.; // à la place de =+
    if (x >= 10.0) {x = 1.0; ie++;} /* repair rounding disasters */
    /* now loop. put out a digit (obtain by multiplying by
    10, truncating, subtracting) until enough digits out */
    /* if fstyle, and leading zeros, they go out special */
    if (fstyle && ie<0)
    {
    *str++ = '0'; *str++ = '.';
    if (ndig < 0) ie = ie-ndig; /* limit zeros if underflow */
    for (i = -1; i > ie; i--)
    *str++ = '0';
    }
    for (i=0; i < ndig; i++)
    {
    k = x;
    *str++ = k + '0';
    if (i == (fstyle ? ie : 0)) /* where is decimal point */
    *str++ = '.';
    x -= (y=k); // à la place de =-
    x *= 10.0; // à la place de =*
    }

    /* now, in estyle, put out exponent if not zero */
    if (!fstyle && ie != 0)
    {
    *str++ = 'E';
    if (ie < 0)
    {
    ie = -ie;
    *str++ = '-';
    }
    for (k=100; k > ie; k /=10); // à la place de =/
    for (; k > 0; k /=10) // à la place de =/
    {
    *str++ = ie/k + '0';
    ie = ie%k;
    }
    }
    *str = '\0';
    return (adpt);
    }

  3. #3
    kronanberg

    Re : P18f4520, affichage d'une valeur sur écran LCD picdem 2+

    salut !!

    Est ce que t'as moyen de mettre ton lien microchip parce que pour le moment il est pas valide !!
    Et l'exemple de LCd m'interresse aussi

    Merci

  4. #4
    invite8d0b7120

    Re : P18f4520, affichage d'une valeur sur écran LCD picdem 2+

    Pardon j'avais pas vu.

    Voila le lien:

    http://www.microchip.com/forums/tm.a...333519&mpage=1

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Problème librairie LCD du Picdem 2 Plus Demo Board (P18F4520)
    Par invite8d0b7120 dans le forum Électronique
    Réponses: 2
    Dernier message: 20/04/2010, 11h28
  2. Afficheur LCD; Affichage d'une valeur de tension
    Par Ahmed22 dans le forum Électronique
    Réponses: 4
    Dernier message: 23/04/2009, 11h48
  3. Affichage de la valeur d'une tension sur un afficheur LCD
    Par Ahmed22 dans le forum Électronique
    Réponses: 4
    Dernier message: 21/04/2009, 18h54
  4. affichage écran lcd
    Par invite58ab3889 dans le forum Électronique
    Réponses: 2
    Dernier message: 06/02/2009, 17h48
  5. Afficher la valeur d'une variable sur un lcd
    Par invitea5fe4634 dans le forum Électronique
    Réponses: 5
    Dernier message: 27/03/2008, 18h02
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...