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!!!
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.