0.96″ I2C OLED SSD1306 LCD CON PIC18F

Libreria MIKROC per il Display OLED SSD1306 con Codice di Esempio per Microcontrollore PIC18F…

 
 
 
 




 

INTRO

In commercio esistono diversi display OLED, quasi tutti basati sulla stessa logica di controllo e sull’integrato SSD1306. OLED significa Organic LED, ovvero viene utilizzata la proprietà di materiali organici bioluminescenti che se eccitati sono in grado di generare luce.

Vi sono i display OLED 128×64 pixel, 64×32 e 96×16 e sono disponibili con diversi colori e diversi pin. Sono programmati con protocollo I2C quindi il display con minor numero di pin ne ha 4, 2 per l’alimentazione, e due per la comunicazione, ovvero SCL ed SDA.

Vi è la versione a 4 pin come detto ma vi è anche la versione a 7 pin. Cambia leggermente la connessione visto che va connesso al microcontrollore anche il pin RES. Inoltre cambia l’indirizzo I2C tra le due versioni come vedremo nel codice.

 




 
LIBRERIA SSD1306

La libreria è strutturata come un file driver .c da caricare all’interno del progetto. Quindi basterà copiare il driver nella cartella del nostro progetto e aprirlo in una finestra di mikroc. Dopo di che possiamo richiamare le funzioni che ci servono per far funzionare il display. Le funzioni sono le seguenti:

SSD1306_Init(vccstate, i2caddr); //inizializza display, specificando il tipo di alimentazione e l'indirizzo (0x78 per il 4 pin, 0x7A per l'altro)

SSD1306_StartScrollRight(start, stop);     //scroll a destra
SSD1306_StartScrollLeft(start, stop);      //scroll a sinistra
SSD1306_StartScrollDiagRight(start, stop); //muovi sulla diagonale verso destra
SSD1306_StartScrollDiagLeft(start, stop);  //muovi sulla diagonale verso sinistra
SSD1306_StopScroll();                      //ferma ogni movimento

SSD1306_ClearDisplay();                    //pulisci il display
SSD1306_FillScreen();                      //accendi tutti i pixel
SSD1306_Dim(dim);                          //aggiusta luminosità, dim può essere 0 o 1
SSD1306_InvertDisplay(i);                  //inverte display, i può essere 1 o 0

SSD1306_GotoXY(colonna, riga);             //vai alla posizione colonna-riga
SSD1306_PutC(c);                           //scrivi un char nella posizione colonna-riga specificata sopra
SSD1306_PutCustomC(char *c);               //scrivi un char 5x7 realizzat da noi
SSD1306_Print(char *s);                    //scrive una stringa di caratteri

Bisogna inizializzare il display specificando il tipo di tensione di alimentazione e l’indirizzo del display, 0x78 per il 4 pin e 0x7A per il 7 pin. In caso provate entrambi le soluzioni se non funziona.

Vi sono poi le istruzioni per muovere il testo in diverse posizioni, le istruzioni per controllare il display, spegnerlo, pulirlo o muovere il cursore. Infine ci sono le stringhe per la scrittura su display.

Il display OLED richiede una ram di buffer con dimensione 1024 bytes (128×64/8) quindi se si vuole scrivere un pixel bisogna scriverne 8, uno solo non è possibile. Questo driver ci permette di scrivere solo stringe di testo sul display. Il display 128×64 è diviso in 21 colonne e 8 righe, quello 128×32 sarà diviso in 21 colonne e 4 righe, quello 96×16 avrà 16 colonne e 2 righe. Questo perché i char hanno dimensione 5×7 quindi avrò 128/6 (5 pixel più uno di spazio) per le colonne e 64/8.

La libreria dispone di una matrice con i caratteri all’interno.

 

CODICE

Il codice è il seguente:

#include "SSD1306_driver.c"          //includi il driver del display
#define SSD1306_I2C_ADDRESS   0x78   //0x7A per display con pin RES (reset) e DC pin
#define SSD1306_128_64               //128 pixel per 64 pixel   ogni char è 5x7

char *text = "000\0";                //terminatore di stringa
unsigned short i = 100;

void main() {

  delay_ms(5);                       //aspetta 5ms

  I2C1_Init(100000);                 //Inizializza il modulo I2C 1

  SSD1306_Init(SSD1306_SWITCHCAPVCC, SSD1306_I2C_ADDRESS);
  //_EXTERNALVCC, _SWITCHCAPVC oppure _CHARGEPUMP tipo di connessione VCC, indirizzo (inizializzazione display)

  SSD1306_ClearDisplay();                          //pulisci display

  SSD1306_GotoXY(1, 1);                            //prima riga prima colonna
  SSD1306_Print("NE555.IT");                        //scrivi stringa
  delay_ms(5000);                                  // wait 5 seconds

  SSD1306_GotoXY(1, 2);                            //seconda riga prima colonna
  SSD1306_Print("Display OLED");                   //scrivi stringa
  delay_ms(5000);                                  // wait 5 seconds

  SSD1306_StartScrollRight(1, 1);                  //Muovi a destra per 3 secondi
  delay_ms(3000);
  SSD1306_StopScroll();

  SSD1306_StartScrollLeft(1, 2);                  //Muovi a destra per 3 secondi
  delay_ms(3000);
  SSD1306_StopScroll();

  SSD1306_StartScrollDiagRight(1, 1);             //Muovi lungo la diagonale a destra
  delay_ms(3000);
  SSD1306_StopScroll();

  SSD1306_StartScrollDiagLeft(1, 2);              //Muovi lungo la diagonale a sinistra
  delay_ms(3000);
  SSD1306_StopScroll();
  
  while(i > 0) {

    text[0] = (i / 100) % 10 + '0';               //estrai centinaia
    text[1] = (i / 10)  % 10 + '0';               //estrai decine
    text[2] =  i        % 10 + '0';               //estrai unità

    SSD1306_GotoXY(10, 5);
    SSD1306_Print(text);

    i -= 1;                                       //decrementa i

    delay_ms(1000);                               //aspetta 1 secondo

  }
}

Includo il driver del display, scelgo come indirizzo 0x78 e definisco come display il 128×64. Inizializzo una variabile short al valore di 100, userò questa variabile per scrivere un numero sul display.

Bisogna inizializzare il modulo I2C e inizializzeremo il modulo 1. Successivamente si inizializza il display e lo si pulisce. Scriviamo una stringa sulla prima riga e prima colonna e poi un’altra sulla seconda riga. Quando andremo a muovere a destra e sinistra il testo si muoverà solo la seconda stringa scritta. Sulla diagonale si sposterà anche solo la seconda riga ma la prima seguirà sopra e sotto la seconda riga senza muoversi in diagonale.

Stoppato il movimento andremo a scrivere il valore della variabile sulla quinta riga decima colonna e ogni secondo questa variabile viene decrementata fino a raggiungere 0.

 

SCHEMA

Lo schema è il seguente:

La tensione di ingresso è 5V e l’assorbimento è di circa 5mA. Il display andrebbe alimentato a 3.3V come si descritto nel datasheet.  In realtà ho provato ad alimentarlo a 5V per 2-3 minuti e non si è bruciato, però ovviamente non vi garantisco nulla e consiglio di alimentarlo a 3.3V. La tensione 3.3V viene generata da uno stabilizzatore lineare 7833 o 78l33 e viene filtrata da un condensatore a 100uF.

Il circuito di oscillazione viene realizzato con due condensatori da 22pF e un quarzo da 8MHz. R1 mantiene il PIC18F non resettato.

Il PIC18F458 viene alimentato con i 3.3V positivi al pin 11 e 32 e con il negativo ai pin 12 e 31. Il positivo dei 3.3V va connesso anche a VCC del display e il negativo a GND. SCL va connesso al pin 18 mentre SDA al pin 23 del microcontrollore con due resistori di pull-up connessi a VCC.

 

DOWNLOAD

Potete scaricare la simulazione del circuito con PROTEUS, Il codice scritto con MIKROC e i file della LIBRERIA SSD1306 al seguente LINK!!!

 




 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

1 pensiero su “0.96″ I2C OLED SSD1306 LCD CON PIC18F

  1. Salve. Il vostro programma funziona benissimo. Ho una richiesta. Sarebbe possibile aggiungere una dimensione del testo al programma. Qualcosa come (display_setTextSize(2);). Grazie mille per la risposta.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *