Pantalla LCD 16×2 con PIC (Librería en C para HD44780)
http://www.geekfactory.mx/tutoriales/tutoriales-pic/pantalla-lcd-16x2-con-pichttp://www.geekfactory .mx/tutoriales/tutoriales-pic/pantalla-lcd-16x2-con-piclibreria/ Cuando los simples indicadores luminosos con led ya no son suficientes, habitualmente el siguiente paso para todo programador es ir por una pantalla lcd 16×2. Llegados a este punto, encontramos que existen módulos LC que facilitan la interfa! con este perif"rico. #l est$ndar en la industria para estos módulos co n %controlador a bordo& es el chipset HD44780 'y otros m$s compatibles desarrollados a partir de este(, para los cuales encontramos soporte en pr$cticamente cualquier plataforma) *rduino, +C, *- *-,, /0+3, etc. #n esta entrada introducimos la librer4a de control altamente portable a cualquier microcontrolador, la cual puede ser utili!ada tanto para +C, como **- y pr$cticamente cualquier otro microcontrolador o computadora embebida que se nos ocurra. Nuetra !oto "e porta"a para el artículo #uetra #$"ulo LCD con ilu#inaci$n a%ul & letra color blanco'
Conexiones básicas de una pantalla lcd 16×2 #l HD44780 permite conectarse a tra5"s de un bus de u bits. #l modo de bits permite usar solo pines para el bus de datos, d$ndonos un total de 6 o 7 pines requeridos para la interfa! con el LC, mientras que el modo de bits requiere 13 u 11 pines. l pin * e el +nico ,ue pue"e o#itire i e ua la pantalla en #o"o "e olo ecritura & "eberconectare a tierra i no e ua. #n este caso el microcontrolador no puede leer desde el chip controlador de pantalla, pero en la mayor4a de las situaciones esto no es necesario y nuestra librer4a no implementa aun esta funcionalidad. 8otese que todas estas configuraciones son ilustrati5as, la pantalla pantalla se puede conectar a cualquier combinación de pines posible, ya que nuestra librer4a soporta usar cualquier pin como parte del bus de datos y se9ales de control.
Diagrama para modo de 4 bits Las conexiones para el módo de bits en un +C16: se muestran a continuación. 0e utili!an los primeros bits del puerto * '*3;*( como bus de datos. <3 como co mo se9al de habilitación '#( y <1 como se9al de d e selección de registro '0(.
Diagrama para modo de 8 bits Las conexiones para el módo de bits son algo m$s complicadas, ya que requerimos las lineas de datos acti5as. #n este caso utili!aremos los bits del puerto <, aunque se puede usar cualquier combinación de pines con nuestra librer4a. *3 ahora funciona como se9al de selección de registro '0( y *1 como se9al de habilitación '#(.
Comandos del controlador HD44780 +ara conocer un poco me=or los comandos soportados por la librería para la pantalla lc" 16×2, es necesario estudiar el =uego de instrucciones soportadas por el chip controlador de pantalla, el cual se resume en la siguiente tabla que hemos traducido de la ho=a de datos. La mayor4a de los comandos listados pueden ser e=ecutados llamando a una función en C de nuestra librer4a. Códio de !peración Instrucció n % %' ) ) ) ) ) ) )+ )2 & ( 7 6 * 4 1 0
Clear display
Cursor home
ntry mode set
isplay on/o9 control
Cursor/displ ay shift
!orra el contenido de la pantalla 1 y retorna el cursor a la posici"n 1.'2 ms #home$ %direcci"n &.
1
)etorna el cursor a la posici"n #*ome$. )etorna tambi+n el ,rea ( de isi"n a la posici"n inicial. l 1.'2 ms contenido de la )0 permanece intacto.
ncrementar/ecrementar direcci"n %/&4 *abilitar 1 / 3 corrimiento de pantalla %3&. stas operaciones se reali5an al leer o escribir datos
7 8s
nciende o apaga el display %& C ! Cursor encendido / apagado %C& destello del cursor %blink& %!&.
7 8s
1
3/ )/ ( C ;
1
1 = ;
3et CA)0 address
1
Descripción
"iempo de #$ecuci ón
<
(
3elecciona entre despla5amiento de pantalla o de cursor %3/C& selecciona la direcci"n de ( despla5amiento %)/;&. l contenido de la )0 permanece intacto.
7 8s
Con>gurar en ancho de bus %? u ( @ bits& %;&=umero de lineas de display %=& y tipo de fuente %<&.
7 8s
CA)0 address
scribe la direcci"n de CA)0. ;os datos a almacenar en CA)0 pueden ser eniados
7 8s
despu+s de esta instrucci"n
3et )0 address
1
)0 address
scribe la direcci"n de )0. ;os datos a almacenar en )0 pueden ser eniados despu+s de esta instrucci"n
CA)0/)0 address
;eer bandera #Dcupado$ %!ussy
7 8s
)ead busy Bag address counter
1
Erite CA)0 or)0
1
Erite ata
scribe datos a las memorias CA)0 o )0.
7 8s
)ead from CA/)0
1
1
)ead ata
;ee datos desde las memorias CA)0 o )0.
7 8s
! <
,ombres - sini.cado de de bits en instrucciones I.D > 3 ? disminuir el contador de dirección, 1 ? incrementar el contador de dirección@ / > 3 ? 0in corrimiento de display, 1 ? Con corrimiento de display@ D > 3 ? isplay *pagado, 1 ? isplay #ncendido@ C > 3 ? Cursor *pagado, 1 ? Cursor #ncendido@ > 3 ? +arpadeo cursor *pagado, 1 ? +arpadeo Cursor #ncendido@ /.C > 3 ? /o5er Cursor, 1 ? Corrimiento de pantalla@ .L > 3 ? /o5erACorrer a la i!quierda, 1 ? /o5erACorrer a la derecha@ DL > 3 ? nterfa! de bits, 1 ? nterfa! de bits@ N > 3 ? 1 linea, 1 ? 2 lineas@ > 3 ? B× puntos, 1 ? B×13 puntos@ > 3 ? puede aceptar instrucción, 1 ? operación interna en progreso.
8s
/ibrera para pantalla de 16×2 con IC 8uestra librería para pantalla lc" 16×2 se encuentra alo=ada en ithub. La librer4a es capa! de controlar una pantalla conectada en cualquier combinación de pines del microcontrolador. *dem$s es bastante f$cil lle5ar esta librer4a a otros microcontroladores +C de me=or desemple9o y tambi"n a microcontroladores de otras marcas '*tmel, D /0+3, etc(. e igual forma, el código esta pensado para admitir distintas capas de abstracción de hardEare para el acceso a pines de entradaAsalida en situaciones en las que esto no sea tan sencillo como lo es en un microcontrolador 'abordaremos esto en otra entrada futura sobre la conexión de una pantalla a un aspberry +i(. La librer4a para pantalla lcd 16×2 puede encontrarse en el siguiente repositorio que puedes clocar o bien descargar los archi5os de la librer4a en formato F+.
ttp3..itub'co#.ee5!actor&.LCD
+ara obtener la ultima 5ersión de la librer4a podemos usar git con el siguiente comando) git clone --recursie https://github.com/geekfactory/;C.git
La librer4a b$sica para el +C consiste en 4 arcio "e c$"io !uente) •
•
•
•
/CD3 F Contiene la declaraci"n y documentaci"n de las funciones %prototipos&. /CDc F e>nici"n del funcionamiento de las funciones de usuario %0G& de la pantalla ;C. /CDIC163 Con>guraci"n especH>ca para la ;C en la arIuitectura del microcontrolador GC. /CDIC16c F e>nici"n de las funciones especH>cas para acceso a los pines de /D en el GC16.
Como ya di=imos, a 5eces utili!amos esta librer4a en o tros microcontroladores, por esta ra!ón puedes encontrar otros archi5os en github, pero estos son los que se requieren para traba=ar en cualquier proyecto con +C.
Confguración de los pines en la librería Para a"ecuar la librería para pantalla lc" 16×2 a nuetro circuito a& ,ue e"itar el arcio LCD-PIC16.h. entro de este, encontramos las definiciones de los pines utili!ados en la interfa! con el controlador de pantalla. #n este caso definimos un bus de bits en la parte ba=a del puerto * '*3 > *( y lineas de control 0 y # en los pines <1 y <3 respecti5amente. #sto corresponde a la ilustración del modo de bits que se encuentra arriba en esta p$gina.
/(( ( e>nitions for common control lines (/ Jde>ne ;CKG=K)3 GD)L!bits.)!1 Jde>ne ;CKL)3K)3 L)3!bits.L)3!1 Jde>ne ;CKG=K GD)L!bits.)! Jde>ne ;CKL)3K L)3!bits.L)3! /(( ( Con>guration example for ? bit mode (/ Jde>ne ;CKL)3K? L)30bits.L)30 Jde>ne ;CKL)3K' L)30bits.L)301 Jde>ne ;CKL)3K6 L)30bits.L)302 Jde>ne ;CKL)3K7 L)30bits.L)30 Jde>ne ;CKG=K? GD)L0bits.)0 Jde>ne ;CKG=K' GD)L0bits.)01 Jde>ne ;CKG=K6 GD)L0bits.)02 Jde>ne ;CKG=K7 GD)L0bits.)0
+ara utili!ar la librer4a con un bus de bits, es necesario definir los pines restantes del bus de datos) LCG+8G3 a LCG+8G.
Escribir caracteres a la pantalla Cada uno de los caracteres que escribimos a la pantalla son almacenados en una ubicación en la memoria */ apuntada por la dirección del cursor. Cuando escribimos un car$cter, el código *0C correspondiente a este, se almacena en la memoria interna conocida como Display Data o */. +ara escribir caracteres a la */ utili!amos las funciones lcd_write() y lcd_puts(), que escriben un caracter y una cadena, respecti5amente. // Godemos moer el cursor a donde deseamos comen5ar a escribir lcdKgoto% &4 // niamos texto a la pantalla %)0& lcdKputs% M*ola undoM &4 // niar un solo caracter %signo de admiracion& lcdKwrite%MNM&4
Defnir nuestros propios caracteres personalizados en una pantalla lcd 16×2 #l controlador H73 en la pantalla lcd 16×2 nos permite tambi"n definir caracteres especiales definidos por el usuario 'hasta caracteres(. Cuando deseamos escribir un car$cter personali!ado, el mapa de bits que lo compone se almacenan en otro segmento de memoria independiente conocida como Character 9enerator o simplemente C9. Cada car$cter se define como un grupo de bytes que se en54an a la memoria C*/. +or e=emplo, podemos crear un 4cono con una carita feli! de la siguiente forma)
/apa de bits para caracteres personali!ados 'C*/( en pantalla H73 #n lengua=e C podemos declarar un array con el caracter personali!ado que mostramos en la figura anterior de la siguiente manera) // Caracter personali5ado carita feli5 :& const char smileO@P Q R b b11 b11 b11 b b11 b111 b S4
+ara usar el caracter, es necesario transferirlo al controlador de pantalla mediante la función lcd_create_char() y luego mostrarlo en pantalla en5iando el código correspondiente al
caracter con la función lcd_write(). #l código para mostrar el car$cter que acabamos de crear quedar4a de la siguiente manera) AA Cargar el caracter a C*/ AA #l primer par$metro es el código del caracter '3 ; 7( AA #l segundo es el apuntador a donde se guarda el bitmap 'el array declarado anteriormente( lcdGcreateGchar '3, smile(@ AA
#$emplo completo 5/) pantalla /CD 16×2 #n el programa de e=emplo aplicamos lo aprendido para iniciar la pantalla, mostrar letras, mo5er el cursor y escribir caracteres personali!ados. entro del repositorio de ithub podemos encontrar el proyecto demo para /+L*< J listo para compilarse para un +C16: pero que podemos utili!ar f$cilmente con cualquier microcontrolador de la familia +C16:. #l programa requiere un +C16: con cristal de /h! conectado en los pines correspondientes y la pantalla conectada como se muestra en la ilustración de %/odo de bits& mostrada m$s arriba. Jde>ne CD=<AKL=AK0=KC;DCT 1 Jinclude Uxc.hV // ncabe5ado para el compilador WC@ Jinclude M../;C.hM /( eice speci>c con>guration (/ Jpragma con>g g EL Q D<< // Eatchdog Limer nable bit %EL disabled& Jpragma con>g GE)L Q D<< // Gower-up Limer nable bit %GE)L disabled& Jpragma con>g C;) Q D= // )0'/C;)/XGG Gin g !D)= Q D<< // !rown-out )eset nable bit %!D) disabled& Jpragma con>g ;XG Q D<< // ;ow-Xoltage Grogramming nable bit %)! is // digital /D *X on C;) must be used for // programming& Jpragma con>g CG Q D<< // ata emory Code Grotection bit %Code // protection o9& Jpragma con>g E)L Q D<< // g CCGW Q )! // CCG1 Gin 3election bit %CCG1 function on )!& Jpragma con>g CG Q D<< // g
Jpragma con>g 3D Q D<< // nternal xternal 3witchoer bit %nternal // xternal 3witchoer mode disabled& // eclaration of custom characters const char arrowrO@P Q R b1 b1 b1 b11111 b1 b1 b1 b S4 const char arrowuO@P Q R b1 b111 b111 b1 b1 b1 b1 b S4 const char arrowdO@P Q R b1 b1 b1 b1 b111 b111 b1 b S4 const char arrowlO@P Q R b1 b1 b1 b11111 b1 b1 b1 b S4 oid main%& R int i4 0=3; Q x4 L)30 Q x<<4 L)3! Q x7<4
// nitiali5e lcd drier lcdKinit% 16 2&4 // ;oad characters to CA)0 lcdKcreateKchar% arrowr&4 lcdKcreateKchar%1 arrowu&4 lcdKcreateKchar%2 arrowl&4 lcdKcreateKchar% arrowd&4 // Clear screen to end write to character generator lcdKclear%&4 // Lurn on display lcdKon%&4 // isplay message on the >rst row lcdKputs%M geekfactory.mx M&4 // oe cursor to the fourth column on second line lcdKgoto% 1&4 // Grint a message there lcdKputs%M*ello EorldM&4 // oer cursor to the sixteenth column on second row lcdKgoto%1' 1&4 // ain loop for %44& R for %i Q 4 i U ?4 iYY& R // 1 *5 led blink delayKms%'&4 // Loggle pin )!7 GD)L! ZQ x@4 // Erite custom de>ned character code %can be -7& lcdKwrite%i&4 // Aoto the last isible position on the screen lcdKgoto%' '&4 S S S
%esultado del prorama de prueba *l cargar y e=ecutar de manera exitosa el programa de prueba en el microcontrolador, deber4amos 5er en nuestra pantalla algo como lo siguiente)
0i no aparece nada en la pantalla o solamente aparecen caracteres que no se reconocen, procederemos a re5isar cada uno de los siguientes aspectos del monta=e) •
•
•
•
)eisar el potenciometro de contraste: cambiar de posici"n hasta Iue logremos er algo )eisar Iue las se[ales y )3 est+n conectadas en los pines adecuados )eisar las conexiones en el bus de datos reisar Iue los pines coincidan con los de>nidos en el programa )eisar la elocidad de relo\ si el controlador no puede recibir correctamente algunos comandos podrHa causar Iue la informaci"n no se muestre correctamente.
"ips - trucos para el uso de esta librera Reisa la a!uda incluida De recomendamos apro5echar al m$ximo el apoyo de la documentación incluida. 0i estamos acostumbrados a traba=ar con /+L*< J siempre pod emos oprimir las teclas %CDL K #spacio& para acceder a la función de autocompletado. #sta función nos muestra una 5entana sobre nuestro editor de texto donde podemos obser5ar la documentación de la librer4a. #sto incluye las funciones disponibles e información sobre los par$metros que reciben. La 5entana de autocompletado tiene la siguiente apariencia)
"se caracteres personalizados La librer4a 5iene con funciones que permiten definir caracteres especiales. #n el e=emplo de la librer4a hemos definido caracteres personali!ados 'flechas( que aparecen durante el programa de demostración. 0in embargo, la creati5idad de cada persona permitir$ crear caracteres que pueden utili!arse como iconos para los m$s di5ersos usos.
#porta tus ideas ! correcciones 8uestra librer4a de LC esta alo=ada en github. Cualquier persona puede reali!ar correcciones o me=oras al código fuente y aportarlas al repositorio. *lguien en nuestro equipo re5isar$ los cambios propuestos y los integrar$ al código principal en caso de ser necesario.
Descaras - enlaces relacionados •
escarga de la ho\a de datos de la pantalla en nuestra tienda irtual escarga de la ho\a de datos del controlador *??7@ original
•
Compra tus pantallas ;C en nuestra tienda irtual
•
Conclusión #n este art4culo, sentamos las bases para que puedas incluir de manera sencilla pantallas LC de 16×2 caracteres en tus dise9os con microcontroladores +C. 8osotros lo hacemos habitualmente y encontrar$s muchos e=emplos que funcionan con esta librer4a dentro de nuestro sitio Eeb. Como ya di=imos, te in5itamos a crear una cuenta en ithub y a me=orar la librer4a y aportar cualquier me=ora que creas con5eniente. 0er$ un placer tambi"n recibir tus comentarios a tra5"s de este medio o mediante correo electrónico.