Este documento esta elaborado con la finalidad de proporcionar ayuda en el uso del display: DG-16080-11 (display gráfico de 160x80 puntos). Recomendamos abrir este texto con el block de notas y maximizar la ventana. Este texto se ira modificando y ampliando en función de las dudas que Uds. nos hagan saber, con el propósito de compartir dicha información ya que también puede ser útil para otros. Este texto se llamara en adelante: AYUDA+ddmmaa.TXT (ultima fecha de actualización) Descarga el siguiente archivo: DG-16080-11.PDF, este manual contiene los datos técnicos del display así como las instrucciones para controlarlo. Agradezco de antemano sus dudas y comentarios a nuestro mail: giosys@prodigy.net.mx En el Demo que esta en las tiendas donde se vende el display, se uso un PIC16F54 con el objeto de demostrar que este Display puede ser usado con un chip sumamente básico. Sin embargo puedes conectarlo y usarlo con otro micro controlador, tan avanzado como lo requieras o de otros fabricantes. Los datos fueron almacenados en una memoria 24LC256 para darle capacidad y poder poner todos los gráficos y texto que están en el demo. El uso de una memoria externa es opcional, aquí no explicamos su uso, solo nos concentraremos en el display. Las conexiones quedaron como sigue: PINOUT CONEXION DISPLAY DEMO 1.Vss GND 0V 2.Vcc Vcc 5V 3.Vadj pot 10k ver manual 4.RS RA2 (PIC) 5.R/W GND 6.E RA3 (PIC) 7.D0 RB0 (PIC) 8.D1 RB1 (PIC) 9.D2 RB2 (PIC) 10.D3 RB3 (PIC) 11.D4 RB4 (PIC) 12.D5 RB5 (PIC) 13.D6 RB6 (PIC) 14.D7 RB7 (PIC) 15./CS GND 16./RST al Vcc a través de un resistor de 10k 17.Vlcd pot 10k ver manual 18.Dsp OFF No Conectar 19.EL alimentación para el Back light 20.EL Electroluminiscente El esquema demo es el siguiente: 24LC256 PIC16F54 Display ----- ----------- ---------- +5v | | | | | | | | SDA|----|RA0 RB0 |-------|D0 Vcc|---| | SCL|----|RA1 RB1 |-------|D1 | \ | | | RB2 |-------|D2 | / ----- | RB3 |-------|D3 Vadj|-->\ 10K <= OJO: ver la nota al final del texto en el circuito demo | RB4 |-------|D4 | / | RB5 |-------|D5 Vlcd|---| | RB6 |-------|D6 | | RB7 |-------|D7 | | | | | | | | | | RA2 |-------|RS | | RA3 |-------|E CS |---| | | | R/W|---| | | |--|Res Vss|---| ----------- | ---------- | | EL| |EL | +5v <--10K--| | | GND | | ----- | | | |INV-TH-203(2) | | ----- En esta configuración las terminales R/W,/CS, se conectaron a 0v dejando únicamente Rs y E para controlarlo. OJO: El display tiene una bandera de espera (manual pág. 13 y 14) la cual tiene que ser leída y comprobada antes de enviar el siguiente dato. Para facilitar el aprendizaje nos la hemos saltado temporalmente evitando la lectura hacia el display y la rutina de comprobación, etc. Con la siguiente condición: el oscilador del micro lo tienes que poner a velocidades bajas o bien en tu programa colocar ciclos de tiempo de espera. Comprueba los tiempos de las instrucciones (ciclo interno) y de tu programa con los del display (ver manual) el procesador no tiene que rebasarlos de lo contrario se perderían datos durante la comunicación del uC al display. Ya comprobamos que si funciona puesto que así trabaja el demo que esta en las tiendas donde se venden estos displays. (con un cristal de 4MHz) Es por eso que la terminal R/W de el display la mandamos a 0v porque solo realizamos ciclos de escritura utilizando únicamente la terminal E: RS=1: instrucción RS=0: datos E : habilita la función write durante la transición de 1 a 0 (ver manual) Aquí se observa que para lograr comunicación con el display solo tenemos que indicar si vamos a enviar una instrucción o un dato (RS), luego poner el dato en D(0-7), y después generar la transición de 1 a 0 en (E), para que el display acepte la información, así por cada dato o instrucción que enviemos. Una vez conectado realiza un programa en C o en el lenguaje que uses y con el que estés familiarizado, para el chip que vayas a usar. Genera dos tablas de datos una de ellas será la inicialización del DISPLAY y en la otra los datos que quieras que aparezcan en el: para iniciarlo en modo caracteres: 20char x 10 renglones (200chrs) la configuración es: tabla1= 00,38,01,77,02,13,03,4F,04,07,08,00,09,00,0A,00,0B,00,0C Explicación de la tabla: datos TABLA1 RS Descripción (para mas detalles ver manual) 00 1 INST: MODE CONTROL 38 0 Set: Dsp on, Master, cursor ON char BLink, Mode CHAR, Built-in ROM CHAR 01 1 INST: CHARACTER PITCH (-1) 77 0 set: 8 bits vertical CHAR, 8 bits horizontal x CHR => 20 chr x 10 rngl 02 1 INST: NUM CHAR (-1) 13 0 set: 20 char horizontalmente 03 1 INST: DISPLAY DUTY (-1) 4F 0 Set: 80 (valor de puntos verticalmente) 04 1 INST: CURSOR POSITION (-1) 07 0 Set: en el bit 8 (vertical) 08 1 INST: DSP START ADD LOWER 00 0 Set: posición 0 09 1 INST: DSP START ADD UPPER 00 0 Set: posición 0 0A 1 INST: RAM ADD LOWER 00 0 Set: posición 0 0B 1 INST: RAM ADD UPPER 00 0 Set: posición 0 0C 1 INST: WRITE DATA TO RAM Recuerda que los datos (SET) Están menos UNO después de cada instrucción señalada con (-1). Programa: La secuencia es: coloca RS=1 y E=1,luego lee un dato de la TABLA1(8bits) y mándala al puerto (en el demo PIC-Puerto B) enseguida coloca E=0. En este momento el display recibe la instrucción. Luego coloca RS=0 y E=1 manda el siguiente dato de la TABLA1 al puerto y luego coloca E=0, en este instante el display recibe el SET para la instrucción anterior. Así hasta terminar la primer tabla de datos, se observa que la instrucción WRITE DATA es la última, posteriormente coloca RS=0 y envía tu segunda tabla de datos sin modificar RS ya que a partir de aquí los datos entran en forma secuencial para llenar el display. La secuencia para la segunda tabla seria: ( E=1, Dato al display vía puerto(PB), E=0) así consecutivamente hasta terminar la tabla. recuerda no usar una misma instrucción en tu programa del uC, para los procesos de la secuencias esto con el propósito de generar los tiempos hacia el display y de ser necesario incluye alguna rutina de retardo entre las transiciones de E. En el demo no se usaron rutinas de retardo ya que las instrucciones para leer la memoria nos proporcionan dichos tiempos. La segunda tabla seria por ejemplo: datos TABLA2 RS Descripción 50 0 "P" 52 0 "R" 55 0 "U" 45 0 "E" 42 0 "B" 41 0 "A" Entonces las secuencias quedarían como sigue: (no usamos un lenguaje de programación en especifico, intentando sea lo mas genérico posible, para que puedan usarlo con el micro que deseen y del fabricante que sea) tabla1= 00,38,01,77,02,13,03,4F,04,07,08,00,09,00,0A,00,0B,00,0C tabla2= 50,52,55,45,42,41 pone RS=0 variable X=13h (19 datos de la primer tabla) ciclo1 pone RS=RS xor 1 (*) Pone E=1 Lee dato de TABLA1 manda dato al puerto (display) pone E=0 rutina de retardo (opcional) decrementa en uno a variable X si variable X es diferente de cero regresa a ciclo1 pone RS=0 variable X=06h (6 datos de la segunda tabla) ciclo2 pone E=1 Lee dato de TABLA2 manda dato al puerto (display) pone E=0 rutina de retardo (opcional) decrementa en uno a variable X si variable X es diferente de cero regresa a ciclo2 FIN de secuencias (*) aquí tienes que ejecutar una función Xor entre el valor de el bit que hayas designado para RS y "1", Ej: RS = Ra2(pic) entonces Ra2=Ra2 [XOR] 04h (0000 0100). esto hará que el valor se invierta en forma alternada y nos de los valores para (RS) conforme a la primer tabla, observa que se ha iniciado RS=0 para que en el primer ciclo esta se convierta en "1" para la primer instrucción, posteriormente cambiara su valor alternando 0,1,0,1,etc. En el ciclo2 RS no cambia su valor de CERO ya que solo mandaremos DATOS al display. Si has tenido éxito estarás viendo en el Display: PRUEBA, junto con muchos caracteres basura que están en la memoria del display. tienes que lograr comunicación con el display, antes de continuar con los siguientes ejemplos. Al final de este documento he agregado un ejemplo para PIC en ensamblador. Pueden usarlo prácticamente en cualquier pic solo tienen que agregar la inicialización de los puertos, este ejemplo ya fue checado en un circuito de prueba, el cual esta trabajando con el oscilador interno a 4Mhz y sin tiempos de retardo, pueden copiar el texto al MPLAB, agregarle la configuración de puertos y ensamblarlo ---------------------------------------------------------------------------------------------------------------- El Display no posee instrucción alguna para borrar el contenido de la memoria RAM por lo que después del ciclo de inicialización aparecerán caracteres basura. por lo tanto habrá que realizar un ciclo de borrado (clear screen): --------- este ciclo va después de la inicialización TABLA1 variable X=C8h (200 caracteres) ciclo3 pone E=1 manda 00 al puerto (display) pone E=0 rutina de tiempo decrementa en uno variable X si variable X es diferente de cero regresa a ciclo3 ** pone RS=1 pone E=1 manda 0A al puerto (instrucción RAM ADD LOWER) pone E=0 pone RS=0 pone E=1 manda XX al puerto (dirección 00 a C7) pone E=0 ------- aquí continua el ciclo2 que envía la TABLA2 al display ** Recuerda que al terminar la rutina de borrado, el apuntador interno de la memoria del display estará en 00C8 el cual señala una posición de RAM fuera de el display, tienes que volver a mandar el SET para la instrucción: RAM ADD lower y upper (instrucciones 8 y 9 en el manual) y juntas (16bits) forman la dirección para escribir en la memoria RAM destinada al display: En el ejemplo configuramos el display a 20x10 caracteres, quedando las direcciones(16bits) de memoria RAM de la siguiente manera (hexadecimal): 0000 0001 0002 0003 0004 0005 0006 ...... 0013 <--- 20 caracteres renglón 1 0014 0015 0016 0017 0018 0019 001A ...... 0027 <--- 20 caracteres renglón 2 ------- ------- ------- 00B4 00B5 00B6 00B7 00B8 00B9 00BA ...... 00C7 <--- 20 caracteres renglón 10 Se observa que los 8 bits de la izq. (RAM ADD upper) siempre están en cero, por lo que en modo texto no modificamos este registro. Entonces si quieres "escribir" en el display desde el principio (Angulo superior izq.) solamente tienes que mandar el set para RAM ADD LOWER = cero. O si lo prefieres puedes ponerlo en cualquier valor de 00h a C7h. esto seria como un (goto) Ej: si quieres poner "PRUEBA" al centro (aproximadamente) de la pantalla el valor para LOWER seria 56h. esto pondría el apuntador en el 5o renglón y en la columna 8 entonces la palabra "PRUEBA" queda centrada. De esta manera indicas donde vas a empezar a "escribir" en la pantalla. OJO: esto es solo para algunos casos como en este ejemplo en el que el valor del registro LOWER no es mayor a 7Fh, lo más recomendable es rescribir ambos registros. ver el manual (pag21). explicación: Si al modificar el registro LOWER el bit más significativo pasa de 1 a 0 automáticamente el registro UPPER se incrementa en uno ejemplo: suponiendo que tenemos la dirección 0582h UPPER LOWER 0000 0101 1000 0010 05h 82h Y si en este instante quiero modificar la dirección a 053Ah y solo modifico el registro LOWER quedan así: UPPER LOWER 0000 0110 0011 1010 06h 3Ah En el modo grafico es lo mismo pero serian 1600 bytes (20 bytes x 80 renglones), los que ocupa el display de RAM. las direcciones van desde: 0000h hasta 063Fh ---------------------------------------------------------------------------------------------------------------------------- MODO GRAFICO Para configurarlo en forma grafica solo cambia el SET de la primera instrucción a (32H) y usa el resto de la configuración tal cual. 00 INST: MODE CONTROL 32 <-- SET para modo grafico 01 77 02 13 -- -- etc. la segunda tabla contendrá entonces los datos bit a bit para el display Recuerda que el llenado en forma grafica es horizontal de IZQ a DER de ARRIBA a ABAJO, Entonces inicia en el ángulo superior izquierdo. Byte Byte Byte Byte <--- 20bytes x 8 bits = 160 puntos 1 2 3 20 01234567 01234567 01234567 ............ 01234567 <--- renglón 1 01234567 01234567 01234567 ............ 01234567 <--- renglón 2 01234567 01234567 01234567 ............ 01234567 <--- renglón 3 01234567 01234567 01234567 ............ 01234567 <--- renglón 4 01234567 01234567 01234567 ............ 01234567 <--- renglón 5 ---------- ---------- ---------- 01234567 01234567 01234567 ............ 01234567 <--- renglón 80 10 Como crear imágenes para el modo grafico: Para editar las imágenes de una forma "rápida" he utilizado el programa PAINT de Windows: Ir al menú IMAGEN y dentro de el a ATRIBUTOS se abrirá una pequeña ventana, modifiquen el ancho a: 160 y el alto a: 80, ahí mismo seleccionen PIXELES y BLANCO Y NEGRO. De esta forma tendrán ya la plantilla de 160x80 a un bit por "pixel" (B/N). A partir de aquí pueden escribir (modifiquen el tamaño y tipo de letra adecuado a la plantilla) copiar alguna imagen o dibujo, solo recuerden que debe ser en ByN y que no se salga de la plantilla sino recórtenlo. Pueden trabajar primero en las imágenes por separado. mas adelante explico como editar, fotos, etc. si quieren dibujar punto a punto denle al zoom personalizado y seleccionen 600% y ahí mismo en ZOOM seleccionen MOSTRAR CUADRICULA, de esta forma es más fácil trabajar. una vez terminado denle en IMAGEN -> VOLTEAR/GIRAR -> VOLTEAR VERTICALMENTE; Nuestra imagen esta ahora de cabeza, luego denle nuevamente en IMAGEN -> INVERTIR COLORES; Nuestra imagen queda como un negativo y así la almacenamos con el nombre que sea.BMP Nota: durante la edición Windows puede cambiar de B/N a colores sin darnos cuenta, asegúrense de que su dibujo se conserve en B/N antes de almacenarlo. Posteriormente necesitamos quitarle el encabezado interno (datos de el archivo en formato.BMP) y hacer una conversión de bytes para generar el archivo .BIN únicamente con los datos de nuestro dibujo, como no he encontrado ningún programa que haga eso, modifique un programa viejito que había hecho en pascal para hacer esa tarea el cual lo encuentran en la página como "bmp2bin.ZIP" este corre en DOS pero no se preocupen Windows lo reconoce, así que funciona de la siguiente manera: El programa debe estar en la misma carpeta donde esta su dibujo.BMP El nombre que le den a su dibujo no debe ser mayor de ocho caracteres (por el formato viejito) con el explorador de Windows pueden ejecutar el programa o bien crear un acceso directo. (no es necesario ir a DOS) una vez puesto en marcha el programa pregunta por el nombre del archivo BMP Escribir el nombre de el archivo solamente, SIN la extensión BMP y dar (ENTER) el programa ejecuta la conversión y se cierra automáticamente. Una vez realizado esto, en la carpeta aparece un archivo con el mismo nombre pero de tipo binario (nombre.BIN), el cual ya esta listo para usarlo en una memoria para que sea leída por su micro y transferir los datos al display de manera secuencial. Conversión de fotos o dibujos: Si quieren convertir alguna imagen en color o algún otro dibujo ya existente, toma en cuenta que el display es de 160 x 80 monocromático por lo que la conversión tendrá que reducirlo dependiendo que tan grande este y tal vez se pierda mucha calidad, es recomendable que las fotos o imágenes sean de baja resolución, para evitar la perdida. si ya tienes la imagen edítala por ejemplo en Corel photo-paint (te da mejores resultados que paint de Windows): 1 Cárgalo en baja resolución ahí te da la opción de definir el tamaño de la imagen, colócalo a 160 de ancho, si esta activado la auto proporción, la altura la da automáticamente. 2 primero conviértelo a tonos grises (8bits), cambia el brillo y contraste, tratando de obtener una imagen con menos grises y más blancos y negros, esto ayudara en la siguiente conversión. (este paso es opcional con la práctica te darás cuenta que imágenes lo necesitan). 3 luego conviértela en Blanco y negro ahí te pregunta el algoritmo de conversión de inicio te da la de medios tonos, cámbiala seleccionando FLOYD-STEINBERG. 4 recórtala y almacénala en formato BMP. Posteriormente cárgala en paint y anéxale texto o lo que necesites ahí es más fácil darle el terminado que necesitamos descrito anteriormente. Con la práctica te darás cuenta que es muy sencillo, además puedes importar a través del portapapeles iconos, dibujos de power point, de la web y convertirlos, algunos ya vienen en blanco y negro. TOUCHSCREEN Bien para el Touch screen describiré brevemente el conexionado y la técnica para censarlo, mas sin embargo, es necesario desarrollar algoritmos de calibrado, presión y que eliminen las lecturas por capacitancia parasita, etc. deberán de leer un poco de la teoría con respecto a los Touch screen de 4 terminales, en la pagina he subido dos archivos PDF con algo de teoría ojala les sean útiles. Físicamente es fácil identificar las cuatro barras en la periferia del touch-PANEL Visto de frente el display, tenemos a la derecha la conexión del PANEL con cuatro terminales nombrados de arriba -> abajo y quedan como sigue: -------------------- | | | | | | | |------ 1 Y+ OJO: ESTAS 4 TERMINALES DEL FLEXIBLE DEL PANEL TOUCH | display |------ 2 Y- NO SON SOLDABLES !!!! | |------ 3 X+ USE UN CONECTOR APROPIADO, EL CUAL SI SE PUEDE SOLDAR A SU CIRCUITO | |------ 4 X- | | | | | | -------------------- ||||||||||||| 1 PINOUT 20 Esquema representativo: IZQ,DER= X+,X- y ARR,ABA= Y+,Y- Y+ | R | R | X+ --R--R---R--R-- X- | R | R | Y- En la siguiente tabla se resume cual es el método para dar lectura al panel: Escaneo X+ X- Y+ Y- Stand By GND Hi-Z Hi-Z Int** Coord X GND Vcc Hi-Z ADC Coord Y Hi-Z ADC GND Vcc Entonces la lectura se da de la siguiente manera: Stand BY: X+ lo colocamos a GND y la terminal Y- a la interrupción y a su vez a Vcc a través de un resistor, cuando tocamos el PANEL obtendremos una transición de 1 a 0 la cual es usada para indicar que el touch-screen ha sido presionado. **(Int) en seguida vamos a "leer" el valor de "X" , para lo cual conectamos X+=GND y X-=Vcc y usamos Y- para tomar la lectura a través de un ADC (10bits de preferencia) Y+ no se conecta (Hi-Z) . posteriormente tomamos la lectura de "Y" conectando Y+=GDN y Y-=Vcc y tomamos la lectura en X- con el ADC, X+ no se conecta. Estas lecturas deben ser tomadas rápidamente para evitar que cambien los valores de X y Y. Un buen algoritmo seria una rutina donde se toman varias lecturas de "X" y "Y" rápidamente (escaneo) hasta el momento que deja de presionar el PANEL, hay que tomar en cuenta que al momento de presionar el PANEL, las lecturas no son absolutas, si las graficáramos obtendríamos algo así como una campana. Posteriormente aplicar algún algoritmo para desechar los valores que están fuera del promedio y poder definir cual es el valor exacto donde se presiono. También es importante tomar en cuenta que hay que aplicar un algoritmo para determinar cual fue la presión que se ejerció en el PANEL ya que también depende de eso el valor resultante, esto es: si tocamos el panel en un mismo punto con diferente presión obtendremos lecturas diferentes. Usando un PIC con ADC resulta muy fácil ya que el PANEL puede conectarse directamente, y a través del programa generar todos los switcheos que se necesitan entre las cuatro terminales, para lo cual también usaremos el voltaje de referencia y GND internos, ver el manual de el chip que vayan a usar para determinar entre que terminales(pins) les permite cambiar estos valores y el ADC. también he subido un pequeño esquema electrónico para quienes quieran practicar con un ADC independiente. Analizándolo se ve la aplicación de la técnica que estamos usando. BACKLIGHT En el demo utilizamos el: INV-TH-203(2), es un inversor destinado para EL's Pronto subiré un esquema para conectar el Back light Electroluminiscente. recuerden que este se alimenta con 100 VCA rms a 400Hz. subí un hoja técnica de uno de los tantos chips que se usan en los PDAs, celulares, etc. como referencia para aquellos que les gusta experimentar. ------------------------------------------------------------------------------------------------------------------------ circuito y programa demo para PIC's NOTA IMPORTANTE En el manual(pag13) nos indica lo siguiente: Vlcd=Vcc-Vadj y el siguiente esquema: | +5v | | Vcc|---| | \ | / Vlcd|-->\ VR= 10K-20K | / Vadj|---| | | El pin Vlcd es una salida de voltaje negativo para alimentar el ICdrive del LCD Si se usa la configuración que muestra el manual, cuando VR disminuye su valor entre +Vcc y -Vlcd, se produce un "corto" entre las dos fuentes de Voltaje, provocando que se caliente el CI: SCI7661 que esta incluido en el display. He colocado el pot de 10K como se muestra en el siguiente esquema (diagrama 2) y funciona igual, checando las corrientes entre pines están dentro de parámetros normales de funcionamiento. diagrama 2 PIC Display ----------- ---------- +5v | | | | | | RB0 |-------|D0 Vcc|---| | RB1 |-------|D1 | \ | RB2 |-------|D2 | / | RB3 |-------|D3 Vadj|-->\ 10K | RB4 |-------|D4 | / | RB5 |-------|D5 Vlcd|---| | RB6 |-------|D6 | | RB7 |-------|D7 | | | | Dsp OFF|--- nc | | | | | RA0 |-------|RS | | RA1 |-------|E CS |---| | | | R/W|---| | | |--|Res Vss|---| ----------- | ---------- | | EL| |EL | +5v <--10K--| | | GND | | nc nc programa: lo he escrito en base al ejemplo del texto de ayuda, solo cambie la segunda tabla por un texto mas largo de 199 caracteres, con el propósito de que al final, se vea el cursor parpadeando. Si enviara los 200 caracteres el cursor quedaría en una posición fuera del display. nótese que el cursor parpadea en una posición de RAM de display que puede contener un carácter basura. Funciona para el diagrama 2. configurar el oscilador interno a 4Mhz. ;aquí va la configuración de puertos dependiendo del uC a usar goto ini ;saltamos las tablas de datos ;**************** Tablas de datos tbl1 addwf 02,1 dt 00,38,01,77,02,13,03,4F,04,07,08,00,09,00,0A,00,0B,00,0C tbl2 addwf 02,1 dt " Prueba de Display " ;<-- 20 caracteres x 10 renglones dt " Este Demo envía " dt " 199 caracteres " dt " en modo texto " dt " Puede conectarse a " dt " cualquier CPU o " dt " Micro controlador " dt " *** GIOSYS *** " dt "** ELECTRONICA **" dt " 8 - Junio - 2012 " ;<-- aquí he eliminado un carácter para el cursor ini bcf 05,0 ;pone RS=0 movlw 0x13 movwf 20 ;variable X=13h (19 datos de la primer tabla) ;**************** ciclo 1 Inicializa display C1 movlw 0x01 xorwf 05,1 ;pone RS=RS xor 1 bsf 05,1 ;Pone E=1 movf 20,0 ;usamos a variable x como apuntador de tabla sublw 0x13 ;ajustamos el apuntador para leer tabla en forma ascendente: 0,1,2,3...12h call tbl1 ;Lee dato de TABLA1 movwf 06 ;manda dato al puerto B (display) bcf 05,1 ;pone E=0 ;rutina de retardo (opcional) <---------------------- no se uso decfsz 20,1 ;decrementa en uno a variable X goto C1 ;si variable X es diferente de cero regresa a ciclo1 bcf 05,0 ;pone RS=0 movlw 0xC7 movwf 20 ;variable X=C7h (199 datos de la segunda tabla) ;**************** ciclo 2 envía datos al display C2 bsf 05,1 ;pone E=1 movf 20,0 ;usamos a variable x como apuntador de tabla sublw 0xC7 ;ajustamos el apuntador para leer tabla call tbl2 ;Lee dato de TABLA2 movwf 06 ;manda dato al puerto (display) bcf 05,1 ;pone E=0 ;rutina de retardo (opcional) <---------------------- no se uso decfsz 20,1 ;decrementa en uno a variable X goto C2 ;si variable X es diferente de cero regresa a ciclo2 Fin goto Fin end en el ciclo 1 dejamos el algoritmo para que coincidiera con el texto, pero pueden cambiar lo siguiente: C1 movlw 0x01 xorwf 05,1 ;pone RS=RS xor 1 bsf 05,1 ;Pone E=1 por solo estas dos instrucciones: C1 movlw 0x03 xorwf 05,1 ;pone RS=RS xor 1 y E=1