You are on page 1of 27

Este documento esta elaborado con la finalidad de proporcionar ayuda en el uso de el display: DG-16080-11 (display grafico de 160x80 puntos).

Recomendamos abrir este texto con el block de notas y maximizar la ventana. Este texto se ira modificando y ampliando en funcion de las dudas que Uds nos hagan saber, con el proposito de compartir dicha informacion ya que tambien puede ser util para otros. Este texto se llamara en adelante: AYUDA+ddmmaa.TXT (ultima fecha de actualizacion) Descarga el siguiente archivo: DG-16080-11.PDF, este manual contiene los datos tcnicos de el display asi 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 venda el display, se uso un PIC16F54 con el objeto de demostrar que este Display puede ser usado con un chip sumamente bsico. Sin embargo puedes conectarlo y usarlo con otro microcontrolador, 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 graficos y texto que estan en el demo. El uso de una memoria externa es opcional, aqui no explicamos su uso, solo nos concentraremos en el display. Las conexiones quedaron como sigue:

PINOUT DISPLAY 1.Vss 2.Vcc 3.Vadj 4.RS 5.R/W 6.E 7.D0 8.D1 9.D2 10.D3 11.D4 12.D5 13.D6

CONEXION DEMO GND vCC pot RA2 GND RA3 RB0 RB1 RB2 RB3 RB4 RB5 RB6 0V 5V 10k ver manual (PIC) (PIC) (PIC) (PIC) (PIC) (PIC) (PIC) (PIC) (PIC)

14.D7 15./CS 16./RST 17.Vlcd 18.Dsp OFF 19.EL 20.EL

RB7 (PIC) GND al Vcc atravez de un resistor de 10k pot 10k ver manual No Conectar alimentacion para el Backlight Electroluminiscente

El esquema queda asi:

24LC256 PIC 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 configuracion las terminales R/W,/CS, se conectaron a 0v dejando unicamente Rs y E para controlarlo. OJO: El display tiene una bandera de espera (manual pag 13 y 14) la cual tiene que ser leida 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 comprobacion, etc. con la siguiente condicion: 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 perderian datos durante la comunicacion del uC al display.

Ya comprobamos que si funciona puesto que asi 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 unicamente la terminal E: RS=1: instruccion RS=0: datos E : habilita la funcion write durante la transicion de 1 a 0 (ver manual) Aqui se observa que para lograr comunicacion con el display solo tenemos que indicar si vamos a enviar una instruccion o un dato (RS), luego poner el dato en D(0-7), y despues generar la transicion de 1 a 0 en (E), para que el display acepte la informacion, asi por cada dato o inst. que enviemos. Una vez conectado realiza un programa en C o en el lenguaje que uses y con el que estes familiarizado, para el chip que vayas a usar. Genera dos tablas de datos una de ellas sera la inicializacion de el DISPLAY y en la otra los datos que quieras que aparezcan en el: para iniciarlo en modo caracteres: 20char x 10 renglones (200chrs) la configuracion es:

tabla1= 00,38,01,77,02,13,03,4F,04,07,08,00,09,00,0A,00,0B,00,0C datos TABLA1

RS

Descripcion

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 13 03 4F 04 07 08 00 09 00 1 0 1 0 1 0 1 0 1 0 INST: NUM CHAR (-1) set: 20 char horizontalmente INST: DISPLAY DUTY (-1) Set: 80 (valor de puntos verticalmente) INST: CURSOR POsITION (-1) Set: en el bit 8 (vertical) INST: DSP START ADD LOWER Set: posicion 0 INST: DSP START ADD UPPER Set: posicion 0

0A 00 0B 00 0C

1 0 1 0 1

INST: RAM ADD LOWER Set: posicion 0 INST: RAM ADD UPPER Set: posicion 0 INST: WRITE DATA TO RAM

Recuerda que los datos (SET) Estan menos UNO despues de cada instruccion sealada con (-1).

La secuencia es: coloca RS=1 y E=1,luego lee un dato de la TABLA1(8bits) y mandala al puerto (en el demo PIC-Puerto B) enseguida coloca E=0. En este momento el display recibe la instruccion. 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 instruccion anterior. Asi hasta terminar la primer tabla de datos, se observa que la instruccion WRITE DATA es la ultima, posteriormente coloca RS=0 y envia tu segunda tabla de datos sin modificar RS ya que apartir de aqui los datos entran en forma secuencial para llenar el display. La secuencia para la segunda tabla seria: ( E=1, Dato al display via puerto(PB), E=0) asi consecutivamente hasta terminar la tabla. recuerda no usar una misma instruccion en tu programa del uC, para los procesos de la secuencias esto con el proposito 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 50 52 55 45 42 41

RS 0 0 0 0 0 0

Descripcion "P" "R" "U" "E" "B" "A"

Entonces las secuencias quedarian como sigue: (no usamos un lenguaje de programacion en especifico, intentando sea lo mas generico 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

(*) aqui tienes que ejecutar una funcion 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 instruccion, 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 exito estaras viendo en el Display: muchos caracteres basura que estan en la memoria de el display.

PRUEBA,

junto con

tienes que lograr comunicacion 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 practicamente en cualquier pic solo tienen que agregar la inicializacion 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, agragarle la configuracion de puertos y ensamblarlo

--------------------------------------------------------------------------------------------------------------El Display no posee instruccion alguna para borrar el contenido de la memoria RAM por lo que despues del ciclo de inicializacion apareceran caracteres basura. por lo tanto habra que realizar un ciclo de borrado (clear screen): --------- este ciclo va despues de la inicializacion TABLA1 variable X=C8h ciclo3 (200 caracteres)

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 pone E=0 pone RS=0 pone E=1 manda XX al puerto pone E=0 pone RS=0

**

(instruccion RAM ADD LOWER)

(direccion 00 a C7)

display

------- aqui continua el ciclo2 que envia la TABLA2 al

** Recuerda que al terminar la rutina de borrado, el apuntador interno de la memoria de el display estara en 00C8 el cual seala una posicion de RAM fuera de el display, tienes que volver a mandar el SET para la instruccion: RAM ADD lower y upper (instrucciones 8 y 9 en el manual) y juntas (16bits) forman la direccion para escribir en la memoria RAM destinada al display: En el ejemplo configuramos el display a 20x10 caracteres, quedando las direcciones(16bits) de memoria de la siguiente manera (hexadecimal):

0000 0001 0002 0003 20 caracteres renglon 1 0014 0015 0016 0017 20 caracteres renglon 2 -------

0004 0018

0005 0019

0006 ...... 0013 001A ...... 0027

<--<---

------------00B4 00B5 00B6 00B7 20 caracteres renglon 10

00B8

00B9

00BA ...... 00C7

<---

Se observa que los 8 bits de la izq (RAM ADD upper) siempre estan en cero, por lo que en modo texto no es necesario modificar 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 (aprox) de la pantalla el valor para LOWER seria 56h. esto pondria el apuntador en el 5o renglon y en la columna 8 entonces la palabra "PRUEBA" queda centrada. De esta manera indicas donde vas a empezar a "escribir" en la pantalla. En el modo grafico es lo mismo pero serian 1600 bytes (20 bytes x 80 renglones), los que ocupa el display de RAM, entonces se tienen que modificar los 16 bits de direccion: upper y lower.

--------------------------------------------------------------------------------------------------------------------------MODO GRAFICO Para configurarlo en forma grafica solo cambia el SET de la primera instruccion a (32H) y usa el resto de la configuracion tal cual. 00 32 01 77 02 13 --INST: MODE CONTROL <-- SET para modo grafico

etc.

la segunda tabla contendra 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 angulo superior izquierdo. Byte Byte bits = 160 puntos Byte Byte <--- 20bytes x 8

3 01234567 01234567 01234567 01234567 01234567 ............ ............ ............ ............ ............

20 01234567 01234567 01234567 01234567 01234567 <--<--<--<--<--renglon renglon renglon renglon renglon 1 2 3 4 5

01234567 01234567 01234567 01234567 01234567 01234567 01234567 01234567 01234567 01234567 ---------------------------01234567 01234567

01234567 ............ 01234567

<--- renglon 80

Como crear imagenes para el modo grafico:

Gracias al valioso aporte de un buen electrnico y lector de este texto, incluimos la siguiente liga: (http://bitmap2lcd.com/pages/download.html) este programa es una excelente herramienta para la creacion de imagenes para LCD

De todas formas dejo el texto que se habia escrito originalmente para aquellos que les gusta experimentar:

Para editar las imagenes de una forma "rapida" he utilizado el programa PAINT de Windows: Ir al menu IMAGEN y dentro de el a ATRIBUTOS se abrira una pequea ventana, modifiquen el ancho a: 160 y el alto a: 80, ahi mismo seleccionen PIXELES y BLANCO Y NEGRO. De esta forma tendran ya la plantilla de 160x80 a un bit por "pixel" (B/N). A partir de aqui pueden escribir (modifiquen el tamao 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 recortenlo. Pueden trabajar primero en las imagenes por separado. mas adelante explico como editar, fotos, etc. si quieren dibujar punto a punto denle al zoom personalizado y selecccionen 600% y ahi mismo en ZOOM seleccionen MOSTRAR CUADRICULA, de esta forma es mas facil 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 asi la almacenamos con el nombre que sea.BMP Nota: durante la edicion puede cambiar de B/N a colores sin darnos cuenta, asegurense de que su dibujo este en B/N antes de almacenarlo. Posteriormente necesitamos quitarle el encabezado BMP y hacer una conversion de bytes para generar el archivo .bin con los datos de nuestro dibujo, como no he encontrado ningun programa que haga eso, modifique un programa viejito que habia hecho en pascal para hacer esa

tarea el cual lo encuentran en la pagina como "bmp2bin.ZIP" este corre en DOS pero no se preocupen windows lo reconoce, asi 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 de el archivo BMP Escribir el nombre de el archivo solamente, SIN la extension BMP y dar (ENTER) el programa ejecuta la conversion y se cierra automaticamente. Una vez realizado esto, en la carpeta aparece un archivo con el mismo nombre pero de tipo BINario, el cual ya esta listo para usarlo en su micro y transferirlo al display de manera secuencial. Conversion de fotos o dibujos: Si van a convertir alguna imagen en color o algun otro dibujo ya existente, toma en cuenta que el display es de 160 x 80 monocromatico por lo que la conversion tendra que reducirlo dependiendo que tan grande este y talvez se pierda mucha calidad, es recomendable que las fotos o imagenes sean de baja resolucion, para evitar la perdida. si ya tienes la imagen editala por ejemplo en corel photo-paint (te da mejores resultados que paint de windows): 1 Cargalo en baja resolucion ahi te da la opcion de definir el tamao de la imagen, colocalo a 160 de ancho, si esta activado la autoproporcion, la altura la da automaticamente. 2 primero conviertelo a tonos grises (8bits), cambia el brillo y contraste, tratando de obtener una imagen con menos grises y mas blancos y negros, esto ayudara en la siguiente conversion. (este paso es opcional con la practica te daras cuenta que imagenes lo necesitan). 3 luego conviertela en Blanco y negro ahi te pregunta el algoritmo de conversion de inicio te da la de medios tonos, cambiala seleccionando FLOYD-STEINBERG. 4 recortala y almacenala en formato BMP. Posteriormente cargala en paint y anexale texto o lo que necesites ahi es mas facil darle el terminado que necesitamos descrito anteriormente. Con la practica te daras cuenta que es muy sencillo, ademas puedes importar a travez 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 describire brevemente el conexionado y la tcnica para sensarlo, mas sin embargo, es necesario desarrollar algoritmos de calibrado, presion y que eliminen las lecturas por capacitancia parasita, etc. deberan de leer un poco de la teoria con respecto a los Touch screen de 4 terminales, en la pagina he subido dos archivos PDF con algo de teoria ojala les sean utiles. Fisicamente es facil identificar las cuatro barras en la periferia de el touch-PANEL llamaremos IZQ,DER= X+,X- y ARR,ABA= Y+,Y-

Y+ | R | R | --R--R---R--R-| R | R | YVisto de frente el display, tenemos a la derecha la conexion del PANEL con cuatro terminales nombrados de arriba -> abajo y quedan como sigue:

X+

X-

-------------------| | | | | | | |------ 1 Y+ OJO: FLEXIBLE DEL PANEL TOUCH | display |------ 2 Y| |------ 3 X+ EL CUAL SI SE PUEDE SOLDAR A SU CIRCUITO | |------ 4 XRepublica de el Salvador No24 local 16 P.B. | | | | | | -------------------||||||||||||| 1 PINOUT 20

ESTAS 4 TERMINALES DEL NO SON SOLDABLES !!!! USE UN CONECTOR APROPIADO, pueden comprarlo en

En la siguiente tabla se resume cual es el metodo para dar lectura al panel: Escaneo Stand By Coord X Coord Y X+ GND GND Hi-Z XHi-Z Vcc ADC Y+ Hi-Z Hi-Z GND YInt** ADC Vcc

Entonces la lectura se da de la siguiente manera: Stand BY: X+ lo colocamos a GND y la terminal Y- a la interrupcion y a su vez a Vcc atravez de un resistor, cuando tocamos el PANEL obtendremos una transicion 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 atravez 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 rapidamente para evitar que cambien los valores de X y Y. Un buen algoritmo seria una rutina donde "X" y "Y" rapidamente (escaneo) hasta el el PANEL, hay que tomar en cuenta que al PANEL, las lecturas no son absolutas, si algo asi como una campana. se toman varias lecturas de momento que deja de presionar momento de presionar el las graficaramos obtendriamos

Posteriormente aplicar algun algoritmo para desechar los valores que estan fuera del promedio y poder definir cual es el valor exacto donde se presiono. Tambien es importante tomar en cuenta que hay que aplicar un algoritmo para determinar cual fue la presion que se ejercio en el PANEL ya que tambien depende de eso el valor resultante, esto es: si tocamos el panel en un mismo punto con diferente presion obtendremos lecturas diferentes. Usando un PIc con ADC resulta muy facil ya que el PANEL puede conectarse directamente, y atravez del programa generar todos los switcheos que se necesitan entre las cuatro terminales, para lo cual tambien 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. tambien he subido un pequeo esquema electronico para quienes quieran practicar con un ADC independiente. Analizandolo se ve la aplicaccion de la tecnica que estamos usando.

BACKLIGHT

En el demo utilizamos el: INV-TH-203(2), es un inversor destinado para EL's Pronto subire un esquema para conectar el Backlight Electroluminiscente. recuerden que este se alimenta con 100 VCA rms a 400Hz. subi un hoja tecnica de uno de los tantos chips que se usan en los PDAs, celurares, 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 de coneccion: +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 configuracion que muestra el manual, cuando VR disminuye su valor entre Vcc y Vlcd se produce un "corto" entre estas 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 y funciona igual, checando las corrientes entre pines estan dentro de parametros normales de funcionamiento.

| | | | | | | | | | | | | | |

PIC -----------

+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

Display ----------

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 proposito de que al final, se vea el cursor parpadeando. Si enviara los 200 caracteres el cursor quedaria en una posicion fuera de el display. notese que el cursor parpadea en una posicion de RAM de display que puede contener un caracter basura.

todas las lineas que conectan al PIC con el display configurarlas como out. Funciona configurando el oscilador interno a 4Mhz.

;aqui va la configuracion de puertos ;dependiendo de el chip 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 dt " Este Demo envia dt " 199 caracteres dt " en modo texto " " " "

dt dt dt dt dt dt

" Puede conectarse a " " cualquier CPU o " " Microcontrolador " " *** GIOSYS *** " "** ELECTRONICA **" " 8 - Junio - 2012 "

ini

bcf 05,0 movlw 0x13 movwf 20

;pone RS=0 ;variable X=13h (19 datos de la primer tabla)

;**************** ciclo 1 Inicializa display C1 movlw 0x01 xorwf 05,1 bsf 05,1 movf 20,0 sublw 0x13 call tbl1 movwf 06 bcf 05,1 ;pone RS=RS xor 1 ;Pone E=1 ;usamos a variable x como apuntador de tabla ;ajustamos el apuntador para leer tabla ;Lee dato de TABLA1 ;manda dato al puerto B (display) ;pone E=0 ;rutina de retardo (opcional) <----- no se uso ;decrementa en uno a variable X ;si variable X es diferente de cero regresa a

decfsz 20,1 goto C1 ciclo1

bcf 05,0 movlw 0xC7 movwf 20

;pone RS=0 ;variable X=C7h (199 datos de la segunda tabla)

;**************** ciclo 2 envia datos al display C2 bsf 05,1 movf 20,0 sublw 0xC7 call tbl2 movwf 06 bcf 05,1 ;pone E=1 ;usamos a variable x como apuntador de tabla ;ajustamos el apuntador para leer tabla ;Lee dato de TABLA2 ;manda dato al puerto (display) ;pone E=0 ;rutina de retardo (opcional) <----- no se uso ;decrementa en uno a variable X ;si variable X es diferente de cero regresa a

decfsz 20,1 goto C2 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 bsf 05,1

;pone RS=RS xor 1 ;Pone E=1

por solo estas dos instrucciones:

C1

movlw 0x03 xorwf 05,1

;pone RS=RS xor 1 y E=1

LIST P=18F4550 ;Directiva para definir el procesador #include <P18F4550.INC> ;Definicion de SFRs para el procesador ;******** Configuracion del Oscilador ********** CONFIG FOSC = INTOSCIO_EC pin, USB usa Osc EC ;******** Otros bits de configuracion ********** CONFIG PWRT = ON ;PWRT habilitado CONFIG BOR CONFIG = OFF ;Brown out reset deshabilitado MCLRE = OFF ;MCLR como entrada CONFIG WDT = OFF ;Watchdog deshabilitado CONFIG PBADEN = ON ;Todos los pines como entradas analogicas CONFIG LVP = ON ;Programacion en bajo voltaje apagado ;********* Bits de proteccion ****************** CONFIG CP0 = OFF ;los bloques del codigo de programa CONFIG CP1 = OFF ;no estan protegidos CONFIG CP2 = OFF CONFIG CP3 = OFF CONFIG CPB = OFF ;Sector Boot no esta protegido CONFIG CPD = OFF ;La EEPROM no esta protegida Despues debemos de considerar variables para hacer rutinas de retardo: CBLOCK 0x000 ;Variables en la ACCESS RAM (Banco 0) max 96 bytes Cantms:2 ;variable para generar hasta 65535 ms CantSeg ;Variable para producir retardos de hasta 255 seg ENDC ;Osc interno, RA6 como

#DEFINE #DEFINE

pine pinrs

LATE,1 LATE,0

Iniciando perifericos ORG 0x0000 goto Main ;Se va al inicio del codigo principal Main ;******************* Inicializamos perifericos *************************** clrf clrf movlw movwf movlw movwf clrf LATD TRISE,.0 B'01100000' OSCCON,.0 B'00001111' ADCON1,.0 TRISD,.0 ;Todos los pines como I/O digitales ;Ajustamos el oscilador interno a 4 MHz

Mandar datos a la GLCD es sencillo, como si se tratara de una 16x2, El problema es el PIN R/W, ya que el fabricante dice que: "el display tiene una bandera de espera la cual tiene que ser leiday comprobada antes de enviar el siguiente dato. Para evitar esto, solo debemos poner a tierra R/W para que siempre estemos escribiendo en el display, cuando mandemos un dato el PIN E debe de tener una cierta espera, yo le puse un retardo de casi 20 uS, con un oscilador interno a 4 Mhz.

Los pasos para configurar el GLCD modo caracter, 20 char x 10 renglones son los siguientes:

tabla1= 00,38,01,77,02,13,03,4F,04,07,08,00,09,00,0A,00,0B ,00,0C

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

En el MPLAB quedaria asi:

Cdigo:

Cdigo:

;******************INICIA GLCD******************** bcf movlw movwf movlw movwf clrf clrf movlw movwf ciclo: movlw xorwf bsf TBLRD*+ movf movwf bcf rcall decfsz goto bcf goto ORG pinrs pruebas 0x82 0x01 LATE,1,.0 pine ; TABLAT++ TABLAT, W ; W <- TABLAT LATD pine retarm 0x003,f ciclo ; bucle eterno ; dato <- W pinrs 0x13 0x003 0x0B 0x004 TBLPTRU TBLPTRH ; limpia TBLPTRU 0x82 TBLPTRL ; carga a 82 en TBLPTRL ; ;

DB 0X00,0X38,0X01,0X77,0X02,0X13,0X03,0X4F,0X04,0X07,0X08,0X00,0X09,0X0 0,0X0A,0X00,0X0B,0X00,0X0C ; *************FIN DE LA TABLA ****************


El proveedor recomienda ejecutar una funcion XOr entre el valor de el bit que se haya 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, observemos que se ha iniciado RS=0 para que en el primer ciclo esta se convierta en "1" para la primer instruccion, 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. Ahora enviamos caracteres al display, yo envie la palabra: "Hamburguesa". La secuencia es: variable X=11h (1 datos de la segunda tabla porque la palabra hamburguesa tiene 11 letras) 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 ;***********MANDA CARACTERES************* clrf TBLPTRU clrf TBLPTRH ; limpia TBLPTRU movlw 0XEE movwf TBLPTRL ; carga a 101 en TBLPTRL cicda: bsf pine TBLRD*+ ; TABLAT++ movf TABLAT, W ; W <- TABLAT movwf LATD ; dato <- W bcf pine rcall retarm decfsz 0x004,f goto cicda push goto sigue ORG 0XEE DB "Hamburguesa" ;*************FIN DE ENVIO DE CARACTERES************** sigue: retarm movlw 0x20 movwf 0x005 mass decfsz 0x005,f goto mass return END ;Directiva fin del programa

Bueno, el proveedor de esta pantalla dice que despues de configurar la GLCD apareceran caracteres basura, el recomienda una rutina sencilla que posteo con algunas de sus propias palabras:

El Display no posee instruccion alguna para borrar el contenido de la memoria RAM por lo que despues del ciclo de inicializacion apareceran caracteres basura. por lo tanto habra que realizar un ciclo de borrado (clear screen):

--------- este ciclo va despues de la inicializacion 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 (instruccion RAM ADD LOWER) pone E=0 pone RS=0 pone E=1 manda XX al puerto (direccion 00 a C7) pone E=0 pone RS=0

------- aqui continua el ciclo2 que envia la TABLA2 al display

Recordar que al terminar la rutina de borrado el apuntador interno de el display estara en 00C8 el cual seala una posicion de RAM fuera de el display, tienes que volver a mandar el SET para la instruccion: RAM ADD lower y upper y juntas (16bits) forman la direccion para escribir en la memoria RAM destinada al display.

En el ejemplo se configura el display a 20x10 caracteres, quedando la memoria de la siguiente manera (hexadecimal):

0000 0001 0002 0003 0004 0005 0006 ...... 0013 <--- 20 caracteres renglon 1 0014 0015 0016 0017 0018 0019 001A ...... 0027 <--- 20 caracteres renglon 2 ------------------00B4 00B5 00B6 00B7 00B8 00B9 00BA ...... 00C7 <--- 20 caracteres renglon 10

Se observa que los 8 bits de la izq (upper) siempre estan en cero, entonces si queremos "escribir" en el display desde el principio (angulo superior izq) solamente debemos mandar el set para LOWER=cero.

si preferimos ponerlo en cualquier valor de 00h a C7h. esto seria como un goto(xy) Ej: si ponemos "HOLA" al centro (aprox) de la pantalla el valor para LOWER seria 58h.

Asi indicaremos donde queremos empezar a "escribir" en la pantalla.

Realize una rutina para estas instrucciones, metiendolas justo entre el fin de la tabla 1 y el principio de donde dice: ENVIO DE CARACTERES quedando como sigue:

;*****LIMPIA LA PANTALLA*********** movlw 0x0C8 ;PARA LIMPIAR LA PANTALLA movwf 0x00A ;PARA LIMPIAR LA PANTALLA limpia bsf pine movlw 0x00 movwf LATD bcf pine rcall retarm ; ***********retardo decfsz 0x00A,f,.0 goto limpia bsf pinrs bsf pine movlw 0x0A movwf LATD bcf pine

bcf pinrs bsf pine movlw 0x00 ;*********GOTO(XY) movwf LATD ; ********GOTO(XY) bcf pine rcall retarm ; ***********retardo bcf pinrs ;*************FIN LIMPIAR LA PANTALLA***********

Bueno la cuestion es que no funciona, no se ve nada en la pantalla, se queda en blanco y no sirve esta minirutina, aqui pido su ayuda, ya que me es urgente hechar a andar esa screen, despues voy a meterle graficos y posteriormente el manejo de la touch, en 3 meses lo debo de terminar, asi que voy a decir siempre como lo hize, gracias.


Temas similares

Citar

1. 2. 3. 4. 5.

USB y PIC 18F2550 Desarrollo de proyectos en ASM

Microcontroladores y sistemas embebidos

Problema con modulo EUSART de PIC18F4550 en ASM

Microcontroladores y sistemas embebidos

Touch Resistivo, Manejo de Glcd mas Matriz de Resistencias

Microcontroladores y sistemas embebidos

LCD grafico GLCD basado en controlador KS0108, desarrollo en MikroC cable serial touch screen monitor
PC Hardware

Microcontroladores y sistemas embebidos

No es lo que buscabas? Intenta buscar un tema similar

116 Comentarios
20/02/2012 #2

Daniel Meza

Saludos... hace algunos meses trabaj con ese mismo GLCD, pero con el uC PIC16F874A. El proyecto consista bsicamente en un contador de oscilaciones en un determinado tiempo programado por el usuario. De igual manera est hecho en ASM. Te dejo el cdigo, all viene la rutina que us para el borrado del GLCD y estn declarados los puertos que controlan cada pin del GLCD.

Otra cosa es que revises tambin la seal de contraste, ya que esta no se conecta como comunmente en los dems LCD's.

21/02/2012 #3

Citar

nietzche

Muchas gracias Daniel, me funciona el codigo de limpiar la pantalla, pero no sabes porque razon no funciona mi rutina?, estoy haciendo cada paso como lo dice la nota del proveedor ??? Por cierto veo que le pusiste rutina de demora de 1 milisegundo cuando E =0, yo solo le coloco 20 microsegundos, sera suficiente ??? Por cierto, lo de la sennal del contraste la conecte tal y como el esquema de conexionado que aparece en la pagina de el proveedor.

21/02/2012 #4

Citar

Daniel Meza

No estoy muy metido an en el asm de los PIC18, pero me parece que el problema est en que utilizas los registros LATD en lugar de PORTD. Sobre la temporizacin, utilic 1 milisegundo para asegurar que no tenga problemas de temporizacin (peor caso), ese valor me pareci suficiente y no se nota el retardo al momento de mostrar texto en el GLCD, me parece que en el caso de imgenes si se alcanza a notar el llenado de datos.

26/02/2012 #5

Citar

nietzche

Oye daniel una pregunta, en tu codigo cuando mandas ya sea datos o comandos, mandas primero el dato al puerto y luego habilitas o desahbilitas los pines RS y E, en el manual dice que mandes RS a 0/1, E=1 mandes datos y luego E=0, es lo mismo ??????????

26/02/2012 #6

Citar

Daniel Meza

Es lo mismo, lo importante es que el byte, ya sea una instruccin o un dato estn estables al momento de mandar E a bajo, no hay falla entre activar primero RS y despus enviar el dato o enviar el dato primero y despus activar RS, siempre y cuando RS y el dato estn estables al momento de "escribir" los datos en el GLCD por medio de E=0

27/02/2012 #7

Citar

nietzche

Ahora la pregunta que sigue, despues de que envio caracteres al GLCD, tengo que situar el cursor en donde yo quiera poner el caracter y mandar las palabras no es asi ?.

Citar

27/02/2012

#8

Daniel Meza

Es correcto como paso inicial, es decir, supongamos que "limpias" el GLCD, en seguida tienes que ajustar la posicin del cursor, situndolo en donde quieres que aparezca tu texto (Esto se hace escribiendo la posicin correspondiente en los registros de posicin, si no mal recuerdo se accede a ellos por medio de los comandos 0x0A y 0x0B, corrobora en la hoja de datos). Una vez situado el cursor, los caracteres se irn desplegando uno en seguida del otro en el orden que los enves, esto es, internamente el GLCD actualiza el cursor para mostrar el siguiente caracter.

27/02/2012 #9

Citar

nietzche

Biem, tu ayuda me ha servido de mucho, me atore porque solo mandaba el lower del cursor sin mandar el upper, ahora intentare mandar graficos al glcd, o graficos y texto, haber como me sale. Has trabajado con su modulo Touch ???????

27/02/2012 #10

Citar

Daniel Meza

Bien... para trabajar los grficos te recomiendo el programa Bitmap2LCD, es muy fcil convertir imgenes en cdigo para pegarlo en tu programa. Referente al modulo Touch no lo he usado, me he entretenido ms intentando hacer funcionar su backlight... ya lo has conseguido tu?

27/02/2012 #11

Citar

nietzche

ok si tengo el bitmap, lo estoy usando, solo que me cuesta trabajo migrar al 18f4550, es muy diferente, sobre el backlight, en la pagina esa que dan, recomiendan el SP4423, pero no lo he visto en AG, no se si en el salvador lo tengan, supongo que desarmando algun modulo de alguna lcd que tenga backlight, pueda funcionar, o hacerlo con componentes pasivos, unos opamps que generen el pulso que dice es de aprox. 300Hz y algun circuito elevador de tension para los 150Vpp, manejar bien la corriente, y lo que me llama la atencion es poder variar la intensidad luminosa, yo creo que bajando el Vpp se logra, cuando tenga mayor avance de mi tesis hare esa parte, suena interesante.


27/02/2012 #12

Citar

Daniel Meza

Tampoco encontr ese integrado, intent armar algo con un inversor pero no me va por el uso de un transformador grande (no tengo mucho espacio). Recin adquir el mdulo, solicit a la pgina del distribuidor que me enviara el diagrama para hacerlo funcionar, y an no recibo respuesta .

En varios locales he visto que lo tienen como muestra y haciendo funcionar su backlight con un circuito bien sencillo, he pensado pedirles que me lo muestren para copiarlo jaja. En fin, ya es otro tema, saludos y suerte con esa tsis.

28/02/2012 #13

Citar

nietzche

gracias por la suerte, oye le has metido graficos a la lcd ?

28/02/2012 #14

Citar

Daniel Meza

si... una que otra imgen. Te dejo un programa que muestra una imgen, (aunque no recuerdo que imgen era), nuevamente est implementada para el PIC16F874, la puedes adaptar. Los datos de la imgen los obtuve de Bitmap2LCD

Img.txt

28/02/2012 #15

Citar

nietzche

Ahhh ya veo, como metes los datos en la memoria de programa?, es necesario escribir en los registros EECON?. Para mandar 1600 bytes usas la bandera Z, yo uso un decrementador en 2 registros de 8 bits, asi son 16 bits, para que

usas esa bandera?, la vdd nunca he podido mandar graficos a la GLCD.

28/02/2012 #16

Citar

Daniel Meza

Para almacenar los datos en la FLASH del PIC solamente se declaran como contantes con la directiva DT.

ORG 0x0800 Tabla2

DT 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00

De esta manera, al ensamblar el programa, a partir de la direccin 0x800 (En este caso), estarn los datos definidos por DT.

El registro EECON lo utilizo para controlar la lectura de datos de la tabla anterior, EEADRH y EADR son los bytes alto y bajo respectivamente del puntero de donde se leern los datos, EEDATA es el registro donde se devuelve el dato leido.

Con respecto a lo del conteo de datos, lo que hago es inicializar dos variables (Puntero alto y bajo) con la direccin de inicio de la tabla por medio de las instruccines:

movlw HIGH Tabla2 movwf AdH clrf AdL

de esta forma AdH contine 0x08 y Adl contiene 0x00, en conjunto apuntan a 0x0800, al inicio de la tabla. Durante la rutina de lectura de datos la direccin formada por AdH y AdL se copian a los registros EEADRH y EADR para obtener los bytes de la imgen. Una vez hecho esto, el registro AdL se incrementa para apuntar al siguiente byte, y as sucesivamente hasta que estos registros llegan a AdH=0x0E y AdL=0x40, es decir 0x0800 + 0x640 (1600 en decimal) momento en el cual se han enviado los 1600 bytes. He de aclarar que la forma que usas tu de 2 registros es ms cmoda, yo lo implement as a modo de prueba.

Espero haber sido claro... si no pues nos estamos comunicando


28/02/2012 #17

Citar

nietzche

Ahh es direccionamiento indirecto no es asi?, para mi micro yo uso los comandos TBLT que son un dolor de cabeza si no se sabe usarlos, lo malo es que simule el programa con la funcion de debugg y los datos salen uno por uno al glcd, pero por alguna razon la GLCD se ve con lineas raras que no son las que yo mando, lo que veo es que no pusiste la rutina aquella de limpiar la pantalla y poner el cursor en 0X00, ya no vale aqui o ke onda ?

29/02/2012 #18

Citar

Daniel Meza

Si, es direccionamiento indirecto. Usas algn simulador como proteus?, aunque este no disponga del mdulo GLCD puedes ir viendo como salen los datos del uC. En este caso no utilic la rutina de limpiar pantalla ya que la misma imgen sustituye a los datos "basura" del comienzo.

pero por alguna razon la GLCD se ve con lineas raras que no son las que yo mando

En este punto, Lo que se ve tiene algn parecido con la imagen que piensas mostrar?, me refiero a que si medio se distingue alguna forma o figura familiar

01/03/2012 #19

Citar

nietzche

respecto alo del proteus puedo usar el 128 x 64 como si fuera la glcd?, supongo que mas alla de esos limites la pantalla del proteus no mostrara los resultados no?. ala imagen la adjunto. Miniatura de Adjuntos

01/03/2012 #20

Citar

Daniel Meza

respecto alo del proteus puedo usar el 128 x 64 como si fuera la glcd?

No es posible. Esta GLCD tiene un controlador distinto al modelo que viene en proteus.

Haz una prueba del GLCD, configurala en modo grfico y enva un patrn de pixeles. Supongamos 0x55 1600 veces, de esta manera se tendr que ver una serie de lineas paralelas alternadas entre s. Si el GLCD pasa esta prueba el problema puede estar en el programa que toma los datos de la memoria del PIC y los enva al GLCD

Citar

Pgina 1 de 6

1 2 3 4 5 > ltima

Tienes una mejor respuesta a este tema? Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate
Herramientas

Mostrar Versin Imprimible

Buscar ms temas sobre:

Microcontroladores y sistemas embebidos Cerrar

Foros de Electrnica > Diseo digital > Microcontroladores y sistemas embebidos

You might also like