Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

leggere DDRAM dal display

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] leggere DDRAM dal display

Messaggioda Foto UtenteMarcRider » 27 set 2013, 18:04

uso il chipset ST7066U,
Ho tentato di leggere le informazioni contenute in una posizione DDRAM, ma il risultato che mi torna, se non ho capito male,è la posizione CGRAM 0x08.

La funzione di lettura che ho scritto è la seguente:

Codice: Seleziona tutto
char Lettura(unsigned char nBit, unsigned char DatoComando)
{
    // risultato da ritornare alla fine
    char Ritorno = 0x00;

    // imposta tutto in input
    STLCD_D0_DIR = 1;
    STLCD_D1_DIR = 1;
    STLCD_D2_DIR = 1;
    STLCD_D3_DIR = 1;
    STLCD_D4_DIR = 1;
    STLCD_D5_DIR = 1;   
    STLCD_D6_DIR = 1;
    STLCD_D7_DIR = 1;



    // 8bit
    if (nBit == 0)
    {
        STLCD_DRW = 1;
        STLCD_DRS = DatoComando;
        STLCD_DE = 1;
        Ritardo(1);
        //se il valore del bit è true allora è 1 altrimenti è 0
        if(STLCD_D7) Ritorno | 0x80;
        if(STLCD_D6) Ritorno | 0x40;
        if(STLCD_D5) Ritorno | 0x20;
        if(STLCD_D4) Ritorno | 0x10;
        if(STLCD_D3) Ritorno | 0x08;
        if(STLCD_D2) Ritorno | 0x04;
        if(STLCD_D1) Ritorno | 0x02;
        if(STLCD_D0) Ritorno | 0x01;


        STLCD_DE = 0;
        Ritardo(1);

    } else {
        //4bit

        STLCD_DRW = 1;
        STLCD_DRS = DatoComando;
        STLCD_DE = 1;
        Ritardo(1);

        if(STLCD_D7)Ritorno | 0x80;
        if(STLCD_D6)Ritorno | 0x40;
        if(STLCD_D5)Ritorno | 0x20;
        if(STLCD_D4)Ritorno | 0x10;

        STLCD_DE = 0;
        Ritardo(1);

        STLCD_DRW = 1;
        STLCD_DRS = DatoComando;
        STLCD_DE = 1;
        // Seconda parte
        //Ritardo(1);
        if(STLCD_D7)Ritorno | 0x08;
        if(STLCD_D6)Ritorno | 0x04;
        if(STLCD_D5)Ritorno | 0x02;
        if(STLCD_D4)Ritorno | 0x01;


        STLCD_DE = 0;
        Ritardo(1);

    }
    return Ritorno;


I ritardi li ho aggiunti dopo, per scrupolo, anche se mi sembra di aver letto sul datasheet che in lettura non c'era bisogno.
Anche cambiando posizione del cursore, il dato stampato è sempre lo stesso.
Ulteriore cosa, non uso i latch LAT ma PORTbits.
Ho provato prima con i latch, poi per fare una prova ho lasciato i PORTbits.

questo è il codice prima di richiamare la funzione lettura:

Codice: Seleziona tutto
    Caricamento(BIT4,Comando,0b11000000);// DDRAM, inizio seconda riga
    SuperDelay(); ClrWdt();
    Caricamento(BIT4,Dato,'C');
    SuperDelay(); ClrWdt();
    Caricamento(BIT4,Comando,0b11000000);// DDRAM, inizio seconda riga
    SuperDelay(); ClrWdt();

    RAMLETTURA = Lettura(BIT4,Dato);
   
    Caricamento(BIT4,Dato,RAMLETTURA);
        SuperDelay();
// RAMLETTURA equivale a 0x08, ed ecco qui sotto la prova.
        Caricamento(BIT4,Dato,0x08);
        SuperDelay();


Se vi chiedete come ho scoperto il lavore di ramlettura... ho utilizzato un sistema rudimentale. ho impostato questo:

Codice: Seleziona tutto
char test = 0;
        //char im[] = {1};
       
        while(test!=0b11111111)
        {
        Caricamento(BIT4,Comando,ClearDisplay);
        Ritardo(1);
        test++;
        //im[0] = im[0]++;
        Caricamento(BIT4,Dato,test);
        //CaricaStringa(im,BIT4);
        SuperDelay();
        ClrWdt();


e ho avuto culo perché ho dovuto contare solo fino ad OTTO :mrgreen:
Avatar utente
Foto UtenteMarcRider
5 1 4
New entry
New entry
 
Messaggi: 53
Iscritto il: 16 feb 2012, 17:37

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti