L’uso dei display LCD (Liquid Crystal Displays - Display a Cristalli Liquidi) nelle realizzazioni embedded è un classico argomento di discussione. Parecchi anni fa affrontai il problema della costruzione di dispositivi aventi come semplice uscita un display numerico a 7 segmenti. Nella realizzazione finale optai come soluzione per un display LCD ad 8 cifre controllato da un particolare LCD controller denominato HT1621B. Non fui molto soddisfatto a causa del costo di questa soluzione: era di circa 10 $, malgrado risultasse competitivo.
Durante una recente visita ad un negozio di componentistica ho visto dei modelli a 3$ (modello TIC8148) e li ho acquistati. Una breve ricerca in internet mi ha fornito dettagli su questo dispositivo: si tratta di un LCD con Chip Su (On) Vetro (Glass) (COG) o, in altri termini, un display LCD con il controller al suo interno. Una più particolareggiata ricerca di un breve datasheet si concluse senza giungere ad una chiara comprensione su come usare il TIC8148. C’era solo qualche consiglio su come usare un chip COG denominato ML1001 (che viene considerato come driver LCD, vedi fig. 1)
Pic. 1.– TIC8148: LCD con COG.
Le specifiche tecniche disponibili per questo LCD controller erano assai più complete ed esaustive della documentazione riguardo al TIC8148. L’ ML1001 è uno shifter register dotato di 40 linee di uscita, per pilotare 40 segmenti LCD e che può essere connesso in cascata per pilotare fino a 80 o 120 segmenti. Analogamente il TIC8148 è formato da 2 driver LCD aventi struttura interna simile a quella mostrata in fig.2.
Il diagramma degli ingressi ed uscite del COG sono riferite al TIC8148.
Eccone una breve descrizione:
- 1 - VDD tensione di alimentazione positiva, nel range dei 2..6 V
2- GND terra
3 – LOAD switch dell’impulso di registro (stato degli 80 segmenti)
4 – DIN ingresso seriale per il caricamento dei dati
5 – DCLK impulso di clock per i dati seriali
6 – CHK verifica dell’output (generalmente non utilizzato)
I dati in ingresso vengono regolati in base alla cresta del segnale di DCLK e, dopo 80 cicli di clock, agiscono modulando la linea di ingresso LOAD, switchandone l’uscita dei tronconi in uscita.
Pic. 3. – TIC8148 segments numbering.
Il TIC8148 dispone di soli 72 segmenti, come uscita. Dunque le uscite dell’ML1001 dal #73 al #80 non sono connesse. Lo schema citato per i segmenti LCD è sempre quello di Fig. 1. Le cifre sono numerate da #1 a #8 da sinistra a destra. Ogni cifra richiede 9 bit. Generalmente ogni cifra è espressa da 7 segmenti (A, B, C , D, E, F, G) seguiti da quello relativo alla virgola decimale (segmento P) e dall’informazione opzionale relativa al simbolo V (segmento H).
I dati relativi allo shift-register COG vengono clockati tenendo conto in primo luogo del Bit Più Significativo (Most Significant Bit - MSB - Bit più significativo). Ciò significa che il segmento #80 dovrebbe essere il primo, tra i tronconi di file, e che quello #1 dovrebbe essere l’ultimo. Durante il trasferimento dei dati la prima parte è costituita da un dato fittizio (i segmenti #73-#80 non sono connessi) seguita da 72 bit di dati reali. Potete fare riferimento alla tabella pubblicata qui sotto per vedere lo schema di riferimento dei bit di dati e relativi segmenti del TIC8148.
Table 1. – TIC8148 segments mapping.
Ecco un breve esempio di applicazione in C# per il TIC8148. Per realizzarla in modo più semplice si è scelto di usare la porta parallela (LPT) di un PC. Ho deciso di usare 4 dei canali della porta LPT per controllare ed alimentare l’LCD tramite COG. Lo schema è rappresentato in Fig. 4.
Descrizione dello schema elettrico
Spesso il buffer di uscita della porta parallela di un PC è in grado di pilotare il TIC8148 direttamente. Personalmente consiglio l’uso di un buffer in tutti i casi in cui la distanza tra la porta parallela e l’LCD superi i 20 cm. Nella maggior parte dei casi il buffer di uscita della porta LPT di un PC è in grado di fornire l’ alimentazione ad un dispositivo esterno come un LCD pilotato da un COG. Sia il TIC8148 che il 74HC244 possono lavorare nel range dei 2..6 V. Non c’è dunque alcuna necessità di correggere i livelli del segnale. Il canale D2 della porta parallela fornisce l’alimentazione di 3,3 V allo stabilizzatore di tensione. Il circuito può essere alimentato da sorgente esterna. Il diodo VD1 protegge la porta LPT in caso di danno derivante da alimentazione esterna. Il buffer del 74HC244 è in grado di fornire un’immagine dei dati in ingresso e di pilotare l’LCD.. I canali D0, D4 e D5 sono quelle che pilotano LOAD, DCLK e DIN.
La Fig. 5 mostra uno screenshot di una semplice applicazione Windows in C#, mentre la n. 6 è la foto di un prototipo funzionante. Fornisce l’ora del PC al TIC8148.
Pic. 5. – Screenshot of Windows TIC8148 application.
Pic. 6 – Working prototype
La descrizione del codice
Windows non fornisce le librerie necessarie per gestire direttamente la porta LPT. Per controllare le linee d’uscita di LPT si è optato in favore della soluzione di terze parti inpout32.dll. E’ dotata di un metodo relativo alla scrittura dei dati verso la porta ed un altro per la lettura. In appendice troverete esempi su come accedere ai vari metodi della libreria.
In appendice B trovate il listato dei codici sorgente relativi alla routine principale. Quando Windows Application intercetta un evento dal Timer 1, legge l’ora corrente del PC e la converte in formato decimale.
La tracciatura dei dati, dalla ricezione fino all’LCD non è complicata. Generalmente per rappresentare i dati relativi ad un LCD a 8 cifre si ricorre alla tracciatura tramite un vettore ad 8 byte. Per semplificare l’uso di tale vettore si è usata la tabella di conversione “hex2digits” con 16 ingressi. Ad ognuno di questi ingressi viene associato un numero in esadecimale da 0X0 a 0XF per andare a formare una cifra dell’LCD. Come già detto, ogni cifra viene rappresentata da 9 bit (7 relativi ai segmenti del display, 1 per il segmento V ed 1 per la virgola). Per eliminare complicazioni durante la conversione si suppone che l’intero insieme degli 80 spezzoni di bit abbiano la seguente struttura:
1) 1 byte fittizio (segmenti #80,…,#73)
2) 8 per la visualizzazione della cifra (dati LCD + virgola)
Con queste premesse una semplice tabella di conversione permetterà di ottenere in uscita il risultato desiderato.
Appendix A (import of library function for PC port access) using System; using System.Runtime.InteropServices; using System.Threading; public class PortAccess { [DllImport("inpout32.dll", EntryPoint="Out32")] public static extern void Output(int adress, int value); [DllImport("inpout32.dll", EntryPoint="Inp32")] public static extern int Input( int adress); } Appendix B (main module to output data over PC parallel port to LCD) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace TIC8148 { public partial class Form1 : Form {
Scarica il codice: Download - TIC8148_LPT.pdf
sarà scontato per un professionista ma per un niubbo come me no!! E poi si possono anche fare lettere, vi rcordate l metodo di fare i numeri e girare la calcolatrice ? Chi nono l’ha mai fatto????
queste mi piacerebbe realizzarlo,
ma c’è un problema fondamentale sul mio computer non c’è più la porta parallela.
Perchè limitarsi ad un display come questo se i display LCD con controller HD44780 si trovano su ebay a pochissimi euro?
Diciamo che un 16 caratteri (qualsiasi carattere ASCII ed eventuali simboli personalizzabili) per 2 righe retroilluminato riuscite a farvelo spedire a casa con meno di 5 €…
Il funzionamento è simile e se ci affiancate un PIC, potete facilmente comandarlo via seriale!
Se invece usate una board Arduino, le cose diventano ancora più semplici: avendo il chip di conversione seriale-usb, la comunicazione seriale potrà essere effettuata tramite USB (in simulazione di porta COM).
Bello no?
In effetti la mancanza della porta parallela costituisce un grosso problema…
Comunque essendone il mio computer fornito ho intenzione di cimentarmi nei prossimi giorni…
Vi farò sapere…
Al link che propongo c’è una breve guida su come interfacciare un display lcd alfanumerico gestito da HD44780 tramite la porta LPT del computer (anche se obsoleta, ma il progetto sembra interessante soprattutto per chi dispondendola ancora sul proprio fisso e non usandola, può creare un vero e proprio modding del proprio PC aggiungendo uno strumento che indica la quantità di memoria RAM utilizzata, carico della CPU e temperatura della stessa!!!)
http://www.moddingplanet.it/classic/printer.php?action=review&id=125&page=1
Il link che hai postato è davvero completo…
Anche le immagini illustrative sono abbastanza chiare e si riescono a capire tutti i collegamenti fatti step-by-step.
Mi sapete suggerire un sito affidabile dove scaricare un software per LCD?
Grazie in anticipo
Guarda, sempre nel link che ho postato ci sono dei nomi di software che cercati con google dovresti riuscire a trovarli molto facilmente…e a quanto c’è scritto sono pure free!! Magari, sui siti ufficiali dei software, potresti incappare in qualche altro schema che illustra il collegamento del display al PC 😉
Ecco il link di LCD Smartie: http://lcdsmartie.sourceforge.net/
Buoni LCD a tutti!
Purtroppo le lettere non si possono visualizzare con questo tipo di display!
Esistono dei convertitori da USB a parallela. Il pc riconoscerà LPT1 e quindi puoi utilizzare tutti i software che desideri!
Non è un progetto molto innovativo, ma molto utile per eventuali studi scolastici!
… è chiaro che non leggi le lettere su questo tipo di display nfatti la mia era una battuta ? Adesso che lo sai l’hai capita??? Comunque, grazie del link al modding (ora ho una lista di preferiti da approfondre lunga qualche anno luce) W arduino e anche gli LCD :O