Libreria per display LCD grafico 128x64 con controller KS0108B

display LCD grafico 128x64
Finalmente, dopo tanto gingillarmi con il primo display grafico 128x64 in mio possesso (lo so, altri sono già agli OLED e oltre), mi sono deciso a farne qualcosa di serio perche avevo bisogno di un display con interfaccia seriale.

L'intenzione è (sarebbe) quella di usare il GLCD al posto del display LCD a caratteri nel progetto DDS, ma contemporanemente mi sto chiedendo se lo sforzo di modificare tutto il firmware già fatto valga il vantaggio di avere delle icone sul display.
L'occasione è comunque ghiotta per studiare questo componente e scrivere qualcosa di decente.
Da studiare ce n'è parecchio, visto che il datasheet ha ben 2 (mezze) pagine dedicate alla programmazione del display, scritte in Inglese tradotto dal Cinese... un incubo.
Più che studiare c'è da indovinare cosa volessero dire i progettisti!

L'obiettivo era utilizzare il display in modalità testo, con 8 righe da 20 caratteri (con font standard 5x7), in modalità grafica con 1024 pixel indirizzabili, e in modalità mista, testo + grafica. Dei 21 teorici caratteri per linea, ho preferito sacrificarne 1 e ridurli a 20, ovvero 120pix, in modo da mantenere una spaziatura di 4pix a sinistra e destra, per una maggiore visibilità o per cornici grafiche.
Il disegno grafico prevede 3 modalità: Positivo (pixel scuro su fondo chiaro), Negativo (pixel chiaro su fondo scuro) e Invertito (il pixel è disegnato in inverso rispetto al colore precedente - XOR). Questo consente di adattare la grafica a qualsiasi combinazione di colori del proprio display.

L'interprete dei comandi (Parser) è facilmente modificabile per sostituire le lettere di comando con altre a proprio piacere; l'aggiunta di nuove funzioni è semplice in quanto richiede solo di effettuare le chiamate alle funzioni base disponibili, predisponendo i valori nelle locazioni dei parametri condivisi.
Dopo ogni modifica il programma deve essere ricompilato con il tool gratuito di Microchip MPLAB.



Caratteristiche

Immagine importata da PC
La libreria, e i programmi di prova, sono interamente scritti in Assembler per i micro della famiglia PIC18 di Microchip.
Lo sviluppo è stato fatto su un PIC18F2580 (che uso come piattaforma fissa per questi progetti), e utilizza veramente pochi pin: 4 (5 contando il Reset, non utilizzato) per l'interfacciamento al display e 2 per la comunicazione seriale.
Questo PIC è valido (e ancor meglio il PIC18F2680) per la disponibilità di RAM; inoltre, come tutte le MCU di questa famiglia, offre un oscillatore interno a 32MHz (8MHz x 4 col PLL), di grande utilità perchè senza quarzi e condensatorini.
La velocità permette di implementare senza problemi un'interfaccia seriale RS232 bidirezionale a 115,200bps.
Con la versione SOIC del PIC, un paio di condensatori e un connettore si può realizzare un modulino 'piggyback' molto piatto da applicare sul retro del display.


Struttura della libreria

Per mia (s)comodità ho voluto separare in 2 moduli la libreria, con alcuni file ausiliari a corredo:

Il modulo MFB contiene le routine 'private' di utilità, quali le funzioni di conversione binario->decimale e binario->esadecimale, oltre alla tabella del font standard 5x7.
Il modulo MIC incorpora alcune funzioni di supporto diagnostico (es. dump memoria e comandi al PC).
Il file esterno GLCD.h descrive l'assegnazione dei pin utilizzati dalla libreria.

MFB espone, in questa versione, 19 funzioni base e 11 parametri di comunicazione dati dal modulo MIC.



Struttura dei comandi

I comandi seriali dal PC sono composti da 1 o 2 lettere identificative della funzione e da 0 a 4 parametri [valore da 0 a 255] separati da virgole. Es. 'BF5,5,20,30'.
Le lettere dei comandi possono essere minuscole o maiuscole; non devono esserci spazi nella stringa.
La stringa deve essere terminata da un carattere 'CR' (decimale=13, esadecimale=0D), senza 'LF' .



Modulo MIC: comandi

ComandoDescrizioneEsempio
A AT
Posiziona il cursore di testo alle coordinate dei primi 2 parametri
A5,10
B


BF
BOX
disegna un rettangolo alle coordinate X0,Y0,X1,Y1 contenute nell'ordine nei 4 parametri forniti

BOXFILL
come sopra, con riempimento
B10,11,12,13



BF10,11,12,13
C


CI
CLEAR
Cancella il display col colore di sfondo

CLEAR INV
Cancella il display col colore di disegno
C


CI
D DOWNLOAD
Scarica un'immagine di sfondo da PC (1024 bytes)
D
F FILL
Carica un'immagine di sfondo esistente in memoria ROM (1024 bytes)
F
H


HC
HOME
Muove il cursore all'inizio riga specificata nel primo parametro (1..8)

HOME CLEAR
Come sopra, ma cancella inoltre la riga usando il 2° parametro fornito
H5


H3,127
L LINE
Disegna una linea dal punto X0,Y0 al punto X1,Y2 (*)
L10,15,50,20
M MODE
Predispone il modo di disegno normale (0), Negativo (1), Inverso (2) o entrambi (3)
M3
P


PG
POINT
Disegna un punto alle coordinate X0,Y0

POINT GET
Ritorna nel parametro comune gPixel lo stato spento acceso (0/1) del punto
P15,30


PG40,10
TM TEST
Test di funzionamento che disegna alcuni elementi sul display
T
W WRITE MSG
Scrive uno degli 8 (1..8) messaggi configurati in ROM (lunghezza max 20 car)
W4
" FREE TEXT
Scrive i caratteri inviati dalla seriale compresi tra una coppia di virgolette
Gestisce i 'ritorni a capo'.
"pippo"

(*) Il sw riconosce se la linea è orizzontale o verticale, nel qual caso esegue un codice diverso e più veloce, altrimenti utilizza l'algoritmo Breshenam per linee con altre inclinazioni. NOTA: l'attuale implementazione è 'bacata' e con certi parametri va in tilt.



Modulo MFB

Funzioni Base

FunzioneDescrizione
GLinit Inizializza la libreria e il display grafico. Obbligatoria, deve essere la prima funzione chiamata.
GLout Inserisce il valore contenuto dell'accumulatore WREG alla RAM del display (**). Non modifica il valore di WREG
GLcmdout Invia il comando contenuto dell'accumulatore WREG al display. Non modifica il valore di WREG
GLin Recupera dalla RAM del display il contenuto della locazione corrente (**). Il valore letto è posto nella variabile locale lByteRead e contentenuto in WREG al ritorno
GLclear Cancella l'intero display usando il valore contenuto nella variabile globale gPad
GLmode Predispone il modo di rappresentazione grafica in base al valore della variabile globale gMode

Funzioni di testo

FunzioneDescrizione
GLhome Porta il cursore di testo a inizio pagine (alto-sinistra), senza cancellare il contenuto
GLsetcursor Predispone la posizione del cursore di testo alle locazioni globali gTextX e gTextY [1..20, 1..8]
GLlinehome Porta il cursore di testo all'inizio della riga contenuta in WREG
GLlineclear Cancella, usando il valore di gPad, la riga contenuta in WREG e porta il cursore a inizio riga
GLwrite Scrive il carattere contenuto in WREG
GLstring Scrive una stringa di testo contenuta nella ROM; l'indice dele messaggio [1..8] è contenuto nella variabile gMsg

Funzioni Grafiche

FunzioneDescrizione
GLdrawpixel Disegna un punto alle coordinate contenute in gPixX e gPixY, secondo le modalità impostate con gMode
GLgetpixel Recupera il valore di un pixel alle coordinate contenute in gPixX e gPixY. Il valore letto è posto in gPixel [0=spento, 1=acceso]
GLline Disegna un linea tra i punti P0 [gPixX,gPixY] e P1 [gPixX2,gPixY2].
La procedura analizza i valori dei 4 parametri e determina se utilizzare l'algoritmo generico di disegno (Breshenam) oppure le routine specializzate Hline e Vline, precise e molto più veloci.
GLbox Disegna un rettangolo vuoto tra i punti P0 [gPixX,gPixY] e P1 [gPixX2,gPixY2].
GLboxfill Disegna un rettangolo pieno tra i punti P0 gPixX,gPixY] e P1 [gPixX2,gPixY2].
GLdownload Riceve dall'interfaccia seriale un'immagine di sfondo (1024 bytes)
GLload Carica dalla memoria ROM un'immagine compilata

(**) il controller grafico avanza automaticamente la locazione corrente dopo ogni scrittura o lettura della RAM.
Questo costringe ogni volta a ripredisporre la locazione attuale nei casi di lettura-modifica-scrittura.



Parametri di interfaccia

FunzioneDescrizione
gTextX Coordinata orizzontale del cursore di testo [1..20]
gTextY Coordinata verticale del cursore di testo [1..8]
gPixX Coordinata orizzontale del cursore grafico P0 [0..127]
gPixY Coordinata verticale del cursore grafico P0 [0..63]
gPixX2 Coordinata orizzontale del cursore grafico P1 [0..127]
gPixY2 Coordinata verticale del cursore grafico P1 [0..63]
gPixel Ritorna il valore letto dalla memorai RAM del display alle coordinate correnti [0=spento, 1=acceso]
gPad Valore utilizzato per il riempimento durante la cancellazione. Default =0. Se gPad=255 il display viene cancellato in negativo. Altri valori danno risultati particolari
gMode Modalità di rappresentazione (testo e grafica): 0=normale, 1=negativo,2=invertito, 3=negativo+invertito
gMsg Indice del messaggio di testo memeorizzato in ROM {1..8}
gSignal 8 bit di segnalazione (flags) per comunicazioni aggiuntive tra MIC e MFB (al momento usato il 1° bit per comunicare l'inizio di un Download.



Lista dei desideri

Le funzionalità che mi piacerebbe implementare, tempo e capacità permettendo:




Download gratuito

» Scarica il codice sorgente in Assemble PIC18 per MPLAB