Anem a afegir una pantalla LCD al nostre microcontrolador. Les pantalles LCD porten normalment un circuit integrat que les controla (un altre microcontrolador) que permet que nosaltres li enviem la configuració i els caràcters a mostrar. Si no hi hagués aquest circuit integrat, nosaltres hauríem de controlar tots els punts (píxels) de la pantalla i ens faltarien ports.
Els controladors de pantalla es poden comunicar amb el microcontrolador en sèrie o en paral·lel.
La comunicació paral·lel requereix un conjunt de quatre o vuit bits de dades i entre dos i quatre bits de control; per tant haurem de reservar entre sis i dotze potes dels ports del microcontrolador. Té l'avantatge que els bits s'envien tots d'un cop i, per tant, la programació és més senzilla.
La comunicació sèrie es fa enviant els bits un darrere l'altre i, per tant, cal gestionar el canal de comunicació. Amb comunicació sèrie la programació és més complexa però es necessiten molt poques potes (normalment dues o tres) per a la comunicació.
Aquest apartat es basa en les pantalles sèrie de 16 per 2 de l'empresa Sparkfun. En el cas de les pantalles, més important que el full de característiques de la pantalla és el full de característiques del controlador. Podeu trobar la taula de caràcters que porta implementats a la pàgina 17 d'aquest full de característiques.
Per connectar la pantalla amb el microcontrolador, cal fer les següents connexions:
| Pantalla | Microcontrolador | |
| Nom | Nom | Pota |
| VDD (+5 V) | Vdd (+5 V) | 1 |
| GND | Vss (+5 V) | 20 |
| RX | TX (RB7) | 10 |
Per enviar dades a la pantalla ens caldrà una transmissió sèrie a 9600 bauds.
La pantalla ja està preconfigurada de fàbrica. Si ens estan bé els valors per defecte ja podem començar a enviar-li caràcters que ens apareixeran a la primera columna de la primera filera i posicions successives.
Atenció: en alguns casos hem detectat problemes causats perquè s'envien coses (instruccions de configuració o text) a la pantalla abans que aquesta s'acabi d'inicialitzar. Això és més freqüent si s'alimenta la placa directament ja que quan l'alimentem amb el programador, aquest reinicialitza el microcontrolador sense deixar d'alimentar la pantalla. Si es detecta un mal funcionament de la pantalla, és recomanable posar un retard, per exemple de dos segons, a l'inici del programa, abans d'enviar res a la pantalla.
El controlador de la pantalla té una memòria per als caràcters que es visualitzen. Cada posició de la pantalla correspon a un byte a la memòria però no tots els bytes de la memòria es visualitzen.
La primera línia de la pantalla comença a l'adreça 0. En pantalles de dues línies, la segona línia comença a la 64 (decimal). Si la pantalla té més línies, la tercera començarà a 20 i la quarta a 84. En una pantalla de 16 caràcters per línia es visualitzaran a la primera línia les posicions 0 a 15.
La taula de caràcters és, en principi, la dels codis ASCII. Per tant per als caràcters normals podem treballar directament en ASCII. Algunes de les adreces que en els codis ASCII no hi són (més de 7Fh) o algunes de les que corresponen a caràcters de control contenen símbols que el fabricant de la pantalla ha decidit posar-hi.
L'enviament de caràcters és molt senzill, un cop hem configurat la comunicació sèrie. En el següent tros de programa veiem la configuració sèrie i com s'envia un caràcter. A l' exemple PS hi tenim un programa complet.
cblock 0x20 Caracter ; Caràcter o codi a enviar (port C) Retard1 ; Variables de retard Retard2 Retard3 ... endc
org 0 Inici movlw .10 ; Retard de 2 s call Rets ; Esperem que arrenqui la pantalla bsf STATUS,RP0 ; Tria el banc 1 bsf TXSTA,BRGH ; Configuració de velocitat bcf BAUDCTL,BRG16 ; Paràmetre de velocitat de 8 bits movlw .25 ; Velocitat de 9600 baud movwf SPBRG ; Paràmetre de velocitat bcf TXSTA,SYNC ; Comunicació asíncrona bcf TXSTA,TX9 ; Comunicació de 8 bits bcf STATUS,RP0 ; Tria el banc 0 bsf RCSTA,SPEN ; Activa comunicació sèrie bsf STATUS,RP0 ; Tria el banc 1 bsf TXSTA,TXEN ; Activa comunicació bcf STATUS,RP0 ; Tria el banc 0 ... movlw 'H' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia ...
; ; Enviem caràcters a visualitzar ; EnviaL movf Caracter,f ; Agafa el caràcter movwf TXREG ; L'envia nop nop ; Espera 2 us btfss PIR1,TXIF ; El registre TXREG ha quedat lliure? goto $-1 ; No, doncs esperem return ; Tornem al lloc des d'on hem vingut ; ; Funció de retard de 0,2 W s ; Rets movwf Retard3 Bucles decfsz Retard1,f goto Bucles decfsz Retard2,f goto Bucles decfsz Retard3,f goto Bucles return ...
Hi ha uns quants caràcters que permeten canviar les característiques de la pantalla o de la visualització. Cal enviar un caràcter de control FE (254 decimal) seguit del codi de control que ens fa falta. Els codis estan a la taula següent:
| Primer caràcter de control | Segon caràcter de control | Funció | ||
| decimal | hexadecimal | decimal | hexadecimal | |
| 254 | FE | 1 | 01 | Esborra la pantalla i posa el cursor a l'inici |
| 254 | FE | 20 | 14 | Mou el cursor una posició a la dreta |
| 254 | FE | 16 | 10 | Mou el cursor una posició a l'esquerra |
| 254 | FE | 28 | 1C | Desplaça a la dreta |
| 254 | FE | 24 | 18 | Desplaça a l'esquerra |
| 254 | FE | 12 | 0C | Activa la visualització |
| 254 | FE | 8 | 08 | Desactiva la visualització |
| 254 | FE | 14 | 0E | Activa la visualització del cursor subratllat |
| 254 | FE | 13 | 0D | Activa la visualització del cursor intermitent |
| 254 | FE | 12 | 0C | Desactiva la visualització del cursor |
Les adreces de la memòria són de set bits (0 a 6). Per dir-li al controlador a quina adreça volem escriure cal enviar-li un caràcter de control FE (254 decimal) seguit del valor de l'adreça però amb el bit 7 a 1. Així per demanar-li que es posi a la primera posició (adreça 0, o sigui 00000000) li enviarem el caràcter de control seguit de 10000000. Un cop li hem dit la posició i hem escrit un caràcter, el següent es posarà al costat. Per tant només hem de canviar l'adreça quan la posició no sigui consecutiva. A continuació hi ha un tros de programa com a exemple:
movlw .254 ; Control de la posició del cursor movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw .64 ; Filera 2 columna 1 iorlw b'10000000' ; Posa el bit de posicionat a 1 movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia
Quan s'han d'enviar paraules o altres textos predefinits el programa es pot tornar força llarg si es va copiant de manera seqüencial cada caràcter a l'acumulador i després es crida a la funció EnviaL. Pot ser una bona idea guardar els textos a la memòria de programa i fer una funció que (indicant la posició del primer caràcter i la llargada del text) els llegeixi seqüencialment de la memòria de programa i els enviï a la pantalla. Com a referència, es pot consultar l'exemple MP.
Per escriure valors a la pantalla caldrà passar-los a format BCD (per tenir-los separats en xifres) i convertir a ASCII cada una de les xifres.
La pantalla pot mostrar fins a 8 caràcters definits per l'usuari. Aquests caràcters són adreçables amb els codis ASCII del 0 (00h) al 7 (07h).
Per crear els caràcters cal enviar una seqüencia de vuit bytes amb el patró corresponent. Els caràcters són de 5 per 8 píxels (punts) o sigui que hem d'enviar vuit valors en els que els tres primers bits (5, 6 i 7) són 0 i els altres cinc (0 a 5) són 1 si volem el punt activat i 0 si el volem desactivat. La següent figura mostra els 8 bytes que caldrien per crear la lletra Ω.

Els caràcters especials es guarden a una altra part de la memòria de la pantalla. El primer caràcter s'ha de colocar a les adreces 00h a 07h, el segon a les 08h a 0Fh i així successivament. El vuitè anirà de la 38h a la 3Fh.
El vuitè byte normalment ha d'estar a zero ja que allí és on ha d'aparèixer el subratllat del cursos. És recomanable que estigui a zero perquè en alguns programes hem detectat caràcters anòmals a la pantalla si no ho estaven.
Les adreces de la memòria on es guarden els caràcters especials són de sis bits (0 a 5). Per dir-li al controlador a quina adreça volem escriure cal enviar-li un caràcter de control (254, o sigui FEh) seguit del valor de l'adreça però amb el bit 7 a 0 i el 6 a 1. Així per demanar-li que es posi a la primera posició (adreça 00h, 00000000) li enviarem el caràcter de control 01000000. Un cop li hem dit la posició i hem escrit un byte, el següent es posarà al costat. Per tant només hem de canviar l'adreça quan la posició no sigui consecutiva.
A continuació hi ha un tros de programa com a exemple:
cblock 0x20 Caracter ; Caràcter o codi a enviar ... endc
... ; Caràcters especials movlw .254 ; Control de la posició movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 0 ; Adreça de la primera línia iorlw b'01000000' ; Posa el bit de caràcter especial a 1 movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw b'00000000' ; Primera filera movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw b'00001110' movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw b'00010001' movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw b'00010001' movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw b'00001010' movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw b'00001010' movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw b'00011011' movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw b'00000000' ; Darrera filera movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia ; Fi caràcters especials ; Enviem l'adreça i els valors movlw .254 ; Control de la posició del cursor movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 0 ; Filera 1 columna 1 iorlw b'10000000' ; Posa el bit de posicionat a 1 movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 0 ; Caràcter especial movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia ...
En algunes versions de la pantalla, no en totes, es pot variar la seva lluminositat. Per canviar la lluminositat de la pantalla s'envia el caràcter de control 7Ch (124 decimal) seguit d'un valor decimal entre 128 i 157; per tant, tenim 30 possibles valors de la lluminositat. A la taula següent tenim alguns valors de lluminositat aproximats:
| Caràcter de control | Valor | Lluminositat | ||
| decimal | hexadecimal | decimal | hexadecimal | |
| 124 | 7C | 128 | 80 | 0 % (apagat) |
| 124 | 7C | 136 | 88 | 25 % |
| 124 | 7C | 143 | 8F | 50 % |
| 124 | 7C | 151 | 97 | 75 % |
| 124 | 7C | 157 | 9D | 100 % |
El controlador de la pantalla porta configurat, de fàbrica, el tipus de pantalla al qual està connectat. Aquesta configuració està guardada en una memòria no volàtil i, per tant, és permanent. Esporàdicament, però, pot succeir que aquesta configuració es malmeti. En aquest cas, podem fer servir les següents comandes per ajustar els paràmetres apropiats:
| Primer caràcter de control | Segon caràcter de control | Funció | ||
| decimal | hexadecimal | decimal | hexadecimal | |
| 124 | 7C | 3 | 03 | Amplada de vint caràcters |
| 124 | 7C | 4 | 04 | Amplada de setze caràcters |
| 124 | 7C | 5 | 05 | Quatre línies |
| 124 | 7C | 6 | 06 | Dues línies |
En algunes aplicacions pot ser necessari modificar la velocitat del canal sèrie que fem servir per enviar els caràcters a la pantalla. Cal tenir present que immediatament després de rebre el segon caràcter de la comanda es canviarà la velocitat i, per tant, els següents caràcters s'hauran d'enviar a la nova velocitat seleccionada. Par a canviar la velocitat podem fer servir les següents comandes:
| Primer caràcter de control | Segon caràcter de control | Funció | ||
| decimal | hexadecimal | decimal | hexadecimal | |
| 124 | 7C | 11 | 0B | 2400 bits per segon (baud) |
| 124 | 7C | 12 | 0C | 4800 bits per segon (baud) |
| 124 | 7C | 13 | 0D | 9600 bits per segon (baud) |
| 124 | 7C | 14 | 0E | 14400 bits per segon (baud) |
| 124 | 7C | 15 | 0F | 19200 bits per segon (baud) |
| 124 | 7C | 16 | 10 | 38400 bits per segon (baud) |
| 18 | 12 | Reinicia a 9600 bits per segon ★ | ||
★ Aquesta comanda està pensada per a aquells casos en els quals desconeixem quina és la velocitat que hi ha configurada en un moment donat. Enviant el caràcter 12h (18 en decimal) durant els 500 ms posteriors a l'alimentació de la pantalla es produirà un reinici de la velocitat a 9600 bits per segon. Aquest caràcter s'ha d'enviar a 9600 baud, independentment de quina sigui la velocitat que hi ha configurada. És recomanable tornar a reiniciar la pantalla després de fer servir aquesta comanda.

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.