# Touch Screen GLCD 160x80, desarrollo con ASM + PIC18F4550



## nietzche (Feb 20, 2012)

De tema de tesis tengo que hacer algo con xbee, el punto es que compre una pantalla touch 160x80 http://www.infinitumpage.mx/GIOSYS/pagina2680.html
El manual esta adjuntado.
Leyendo el mini-manual que viene en .txt me dispuse a trabajarlo y logre satisfactoriamente enviar una cadena de caracteres al GLCD.
La mayor parte de las instrucciones las saque del manual.
No quiero trabajar con C, ya que se me hace algo muy complejo, en especial la modificacion de librerias.

Tenemos 3 pines de control: E,R/W y RS:

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.

Para trabajar con el 18F4550 debemos declarar su propia libreria y los configuration bits:


```
LIST P=18F4550 ;Directiva para definir el procesador
    #include <P18F4550.INC> ;Definicion de SFRs para el procesador
  ;******** Configuracion del Oscilador **********
           CONFIG FOSC = INTOSCIO_EC        ;Osc interno, RA6 como pin, USB usa Osc EC
    ;******** Otros bits de configuracion **********
    CONFIG PWRT = ON ;PWRT habilitado
    CONFIG BOR  = OFF ;Brown out reset deshabilitado
    CONFIG WDT = OFF ;Watchdog deshabilitado
    CONFIG     MCLRE = OFF ;MCLR como entrada
    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

    #DEFINE    pine    LATE,1   
    #DEFINE    pinrs    LATE,0 

Iniciando perifericos

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

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:


```
;******************INICIA GLCD********************
    bcf    pinrs
    movlw    0x13        ;
    movwf    0x003    
    movlw    0x0B
    movwf    0x004    ;

    clrf     TBLPTRU
    clrf    TBLPTRH ; limpia TBLPTRU
    movlw    0x82
    movwf     TBLPTRL  ; carga a 82 en TBLPTRL

ciclo:    
    movlw      0x01
    xorwf        LATE,1,.0
    bsf            pine
    TBLRD*+  ; TABLAT++
    movf        TABLAT, W ; W <- TABLAT
    movwf     LATD     ; dato <- W
    bcf            pine
    rcall         retarm
    decfsz     0x003,f
    goto        ciclo     ; bucle eterno

    bcf    pinrs
    goto    pruebas

    ORG     0x82
    DB    0X00,0X38,0X01,0X77,0X02,0X13,0X03,0X4F,0X04,0X07,0X08,0X00,0X09,0X00,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 señala 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.


----------



## Daniel Meza (Feb 20, 2012)

Saludos... hace algunos meses trabajé con ese mismo GLCD, pero con el uC PIC16F874A. El proyecto consistía básicamente en un contador de oscilaciones en un determinado tiempo programado por el usuario.
De igual manera está hecho en ASM. Te dejo el código, allí viene la rutina que usé para el borrado del GLCD y están declarados los puertos que controlan cada pin del GLCD.

Otra cosa es que revises también la señal de contraste, ya que esta no se conecta como comunmente en los demás LCD's.


----------



## nietzche (Feb 21, 2012)

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.


----------



## Daniel Meza (Feb 21, 2012)

No estoy muy metido aún 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 temporización, utilicé 1 milisegundo para asegurar que no tenga problemas de temporización (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 imágenes si se alcanza a notar el llenado de datos.


----------



## nietzche (Feb 26, 2012)

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 ??????????


----------



## Daniel Meza (Feb 26, 2012)

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


----------



## nietzche (Feb 27, 2012)

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 ?.


----------



## Daniel Meza (Feb 27, 2012)

Es correcto como paso inicial, es decir, supongamos que "limpias" el GLCD, en seguida tienes que ajustar la posición del cursor, situándolo en donde quieres que aparezca tu texto (Esto se hace escribiendo la posición correspondiente en los registros de posición, 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 irán desplegando uno en seguida del otro en el orden que los envíes, esto es, internamente el GLCD actualiza el cursor para mostrar el siguiente caracter.


----------



## nietzche (Feb 27, 2012)

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 ???????


----------



## Daniel Meza (Feb 27, 2012)

Bien... para trabajar los gráficos te recomiendo el programa Bitmap2LCD, es muy fácil convertir imágenes en código para pegarlo en tu programa. Referente al modulo Touch no lo he usado, me he entretenido más intentando hacer funcionar su backlight... ¿ya lo has conseguido tu?


----------



## nietzche (Feb 27, 2012)

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.


----------



## Daniel Meza (Feb 27, 2012)

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).
Recién adquirí el módulo, solicité a la página del distribuidor que me enviara el diagrama para hacerlo funcionar, y aún 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 tésis.


----------



## nietzche (Feb 28, 2012)

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


----------



## Daniel Meza (Feb 28, 2012)

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

Ver el archivo adjunto Img.txt


----------



## nietzche (Feb 28, 2012)

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.


----------



## Daniel Meza (Feb 29, 2012)

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 dirección 0x800 (En este caso), estarán 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 leerán 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 dirección de inicio de la tabla por medio de las instrucciónes:

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 dirección formada por AdH y AdL se copian a los registros EEADRH y EADR para obtener los bytes de la imágen.
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 más cómoda, yo lo implementé así a modo de prueba. 

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


----------



## nietzche (Feb 29, 2012)

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 ?


----------



## Daniel Meza (Feb 29, 2012)

Si, es direccionamiento indirecto. ¿Usas algún simulador como proteus?, aunque este no disponga del módulo GLCD puedes ir viendo como salen los datos del uC. 
En este caso no utilicé la rutina de limpiar pantalla ya que la misma imágen 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 algún parecido con la imagen que piensas mostrar?, me refiero a que si medio se distingue alguna forma o figura familiar


----------



## nietzche (Mar 1, 2012)

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.


----------



## Daniel Meza (Mar 1, 2012)

> 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 gráfico y envía un patrón 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 envía al GLCD


----------



## nietzche (Mar 5, 2012)

Ahh,  ya vi el problema, era en los conteos de 1600 de los 2 bytes que concatene, estuvo buena esa idea de mandar los bytes 1600 veces, gracias por la ayuda, ahora a meterle graficos y el touch.


----------



## Daniel Meza (Mar 5, 2012)

Muy bien... de nada.. por acá andaremos si surgen más dudas...


----------



## nietzche (Mar 5, 2012)

ya le mete el grafico y ahora resulta que me da los graficos volteados, en el bitmap2lcd, no sabes como le puedo hacer ?


----------



## Daniel Meza (Mar 5, 2012)

¿A que te refieres con que te sale la imágen al revés? Los bytes sales volteados... recuerda la ponderación de los bits.. primero el menos significativo. Te dejo una imagen de la configuración que uso

Ver el archivo adjunto config.rar


----------



## nietzche (Mar 5, 2012)

gracias, ya vi ke era, era un icono que decia "most significant bits last", error mio, oye que te parece un multiplicador de voltaje para la lampara ?


----------



## Daniel Meza (Mar 6, 2012)

sería buena idea... no he probado con eso... hace algunas semanas intenté con este circuito pero me faltaron algunos ajustes.

También intenté armar un circuito propio basandome en el esquemático del SP4423



Te contaré que me pasó con este circuito. Resulta que lo armé y funcionó, el backlight comenzó a brillar de un color blanco... pero al mismo tiempo generó un sonido como de capacitor apunto de volar... de inmediato lo desconecte. Volví a hacer la prueba pero conectando esta vez el osciloscopio para ver la señal entregada; este me media 80 Volts aprox a una frecuencia de 400Hz, que según consideré estaba dentro de los límites. Pero me seguía haciendo esa pregunta del porqué el ruido en el backlight... pasó el tiempo y deje ese tema por la paz. Hasta que hace como 1 semana (error mío) descubrí que las puntas de osciloscopio que utilicé estaban atenuadas x10, es decir que haciendo cuentas, le estaba metiendo al pobre GLCD una tensión de unos 800 VAC :S, de allí contesté mi pregunta del porqué de ese ruido... ahora estoy a la espera de armar el circuito correcto y probarlo, claro está, esperando no haber hechado a perder el backlight.


----------



## nietzche (Mar 12, 2012)

oye una pregunta; Graficos + texto en la misma pantalla, se puede ???


----------



## Daniel Meza (Mar 12, 2012)

No es posible... lo que puedes hacer es hacer pequeñas imágenes con las letras que deseas y posicionarlas como si se tratara de texto comùn. Para esto es necesario ir modificando constantemente los dos apuntadores del GLCD


----------



## nietzche (Mar 12, 2012)

tenia pensado leer un reloj en tiempo real via I2C y abajo de mi grafico inicia quese mostrara la hora, cambiando minuto a minuto, entonces que podria hacer aqui?, o de plano no hacer eso. ?


----------



## Daniel Meza (Mar 12, 2012)

de que se puede se puede.. 
Se me ocurre, como te comenté, hacer unas pequeñas imágenes al tamaño de un caracter (7X5 pixeles) con los números del 0 al 9. y almacenarlas en tablas en la memoria del PIC.

Después ir enviando los datos de las "minimagenes" posicionando el cursor del GLCD (En modo gráfico el cursor apunta a un byte de datos espécifico, es decir un conjunto de 8 pixeles).
Por ejemplo. para mostrar en la esquina superior izquierda del GLCD el número 5, primero se posiciona el cursor del GLCD escribiendo 0x00 en la parte baja y 0x00 en la parte alta (1er byte, superior izquierda) del puntero, enseguida enviar el byte correspondiente al dato de la parte superior del caracter, volver a situar el cursor del GLCD pero esta vez en la 2da fila de bytes, primera columna, enseguida enviar el byte de datos de la imagen, y así hasta enviar los 8 bytes que componen la imágen

Dejo una imágen para ser un poco más claro


----------



## nietzche (Mar 13, 2012)

Ufff, un rollo todo esto, asi que entonces de ese modo trabaja el CCS con los glcd,  pero si ya tengo una imagen cargada puedo poner mas imagenes no es asi ?, la unica incompatibilidad esta en que no se puede poner modo texto + grafico. Ok lo hare, ahora estoy ocupado haciendo trabajar la touch con el esquematico que viene en el minimanual, haber si si funciona.
Grax.


----------



## Daniel Meza (Mar 13, 2012)

Si puedes poner más... obviamente la nueva imagen va a sustituir a la imagen anterior (en caso de que la nueva imágen mida 160X80 pixeles), o una parte de ella (si solo se modifican datos de la imagen que está actualmente en el GLCD). 



> la unica incompatibilidad esta en que no se puede poner modo texto + grafico



Es el inconveniente.

Suerte con ese esquemático...  un día de estos me pongo a hacerlo funcionar también.
Saludos


----------



## nietzche (Mar 23, 2012)

*pregunta, crees que el GLCD aguante 3.3 V de datos en lugar de 5v, osea, que tengo un integrado y el xbee, solo que ambos me pueden soportar 3.3v y el glcd, kien sabe, se podra ??


----------



## Daniel Meza (Mar 23, 2012)

Saludos...  según la hoja de datos del GLCD el mínimo voltaje de alimentación es de 4.75 Volts.. ahora, si te refieres a conectar un bus de datos de 3.3V, no creo que sea posible ya que se requiere de un nivel alto de 0.7(vdd)=3.5 volts como mínimo para que el GLCD reconozca un 1 lógico. Según recuerdo existen adaptadores de tensión para los módulos Xbee que elevan el voltaje hasta 5 volts.


----------



## hotpadrino (Mar 24, 2012)

Amigos, podrian compartir el programa bitmap2lcd?  lo he buscado mucho y nada que lo consigo, gracias.


----------



## Daniel Meza (Mar 24, 2012)

Recuerdo que en la página del programa esta la opción para su descarga libre...


----------



## fabyto69 (Abr 9, 2012)

disculpen q moleste por acá otra vez...peo alguien podría ayudarme con el programita..Bitmap2LCD...me dicen q es muy bueno para meter imágenes en un GLCD..y necesito hacer un proyecto con una TOUCH...mil gracias..


----------



## nietzche (May 19, 2012)

Si pues es facil de usar, cual es tu duda en general ?


----------



## fabyto69 (May 21, 2012)

nietzche dijo:


> Si pues es facil de usar, cual es tu duda en general ?



primero gracias por atender a mi inquietud...lo q yo necesito..es..el programa bitmap2lcd..xq en la página q lo publican ya no es gratis...se tiene q pagar...y aquí en el foro..un compañero quedó de pasarmelo..pero hasta la fecha nada...si lo tienes y puedes enviarmelo...
te lo agradecería muchísimo...


----------



## ReneGVx (May 22, 2012)

Hola recien acabo de recibir un GLCD y un PIC 18F4550, y me gustaria que me pasaras el codigo completo para mandar texto y/o graficos...  por cierto que compilador usas??

Gracias ^^


----------



## nietzche (May 26, 2012)

Fabyto69 en esta pagina http://bitmap2lcd.com/download.html dale donde dice "download and evaluation version", con esta esta mas que suficiente para hacer los graficos, y para empezar que GLCD tienes ?, y que codigo usas, yo tengo la GLCD 160x80, y para mandar un grafico primero lo dibujo en el paint con esa resolucion y en bmp monocromo, despues lo abres en el bitmap2lcd, en el menu de la izquierda elijes la imagen y le das doble click a la imagen, luego la imagen se pondra a la derecha de la pantalla del programa, le das doble click y te mandara a la pantalla de edicion, en esa pantalla le das Ctrl + V.
No se te olvide configurar las constantes, para esto te vas al menu: Output y le das a Show/hide data table configuration  y configuras el tipo de archivo que te genera, para asm en MPLAB lo configure asi:

Donde dice Constants prefix : DB
donde dice constant format: 0x+data
file text: none
constant separator: ,
comment prefix:  ;
end of line:  none

Ya despues te genera un archivo donde copias solo los datos en hex y el prefijo de comando(DB)
Ojo, la constante DB la uso porque programo en un PIC18, no se como sea en PIC16 o AVR o lo que sea.





ReneGVx dijo:


> Hola recien acabo de recibir un GLCD y un PIC 18F4550, y me gustaria que me pasaras el codigo completo para mandar texto y/o graficos...  por cierto que compilador usas??
> 
> Gracias ^^



Hola, si lees el post veras que Daniel Meza paso el codigo de su programa, veo que usas el mismo PIC que el mio, la cosa es que yo lo programe todo en ensamblador, en C nunca encontre la libreria para PICC, asi que lo hize en asm.


----------



## visual (Jun 7, 2012)

daniel meza dijo:


> saludos... Hace algunos meses trabajé con ese mismo glcd, pero con el uc pic16f874a. El proyecto consistía básicamente en un contador de oscilaciones en un determinado tiempo programado por el usuario.
> De igual manera está hecho en asm. Te dejo el código, allí viene la rutina que usé para el borrado del glcd y están declarados los puertos que controlan cada pin del glcd.
> 
> Otra cosa es que revises también la señal de contraste, ya que esta no se conecta como comunmente en los demás lcd's.



 ya baje el txt del tu programa q saca graficos pero no me funciona por que  sera 
no puedo echarlo a andar


----------



## Daniel Meza (Jun 7, 2012)

Revisa el conexionado, debe de aparecer al menos datos "basura" en el GLCD al momento de darle energía


----------



## visual (Jun 12, 2012)

tenias razon era un problema de cableado  pro ya lo pude visualizar graficos gracias


----------



## Daniel Meza (Jun 12, 2012)

Muy bien... y pues haber si alguien ha podido hacer funcionar su "backlight", aún no he podido de una manera práctica :S


----------



## visual (Jun 13, 2012)

Daniel Meza dijo:


> Muy bien... y pues haber si alguien ha podido hacer funcionar su "backlight", aún no he podido de una manera práctica :S



baje  de prueba y no se descargar la version completa  o algun otro prograama para editar imagenes

alguine sabe descargar el bitmap2lcd version 
completa


----------



## nietzche (Jun 13, 2012)

en la pagina del autor dice que subira un circuito para el backlight, he revisado y si a estado actualizando su mini manual, hasta subio un codigo en asm para el pic y sacar 200 caracteres, checenla http://www.infinitumpage.mx/GIOSYS/pagina2680.html


----------



## visual (Jun 13, 2012)

Alguien tendra algun archivo para  el touch screen   con pic


----------



## Daniel Meza (Jun 13, 2012)

Aún no lo he utilizado el módulo touch, pero en la página muestran el algoritmo para controlarlo. Básicamente son secuencias de lecturas con el ADC del uC y algunos cálculos para determinar la zona presionada del GLCD


----------



## nietzche (Jun 15, 2012)

No se ve muy dificil el touch, por cierto alguien sabe como se pone un pin en Hi-Z. ?


----------



## Daniel Meza (Jun 15, 2012)

> No se ve muy dificil el touch, por cierto alguien sabe como se pone un pin en Hi-Z. ?


  Esto se logra en los PIC's, configurando como entrada el pin que se requiere flotar (Hi-Z)


----------



## visual (Jun 15, 2012)

Daniel Meza dijo:


> si... una que otra imágen. Te dejo un programa que muestra una imágen, (aunque no recuerdo que imágen era), nuevamente está implementada para el PIC16F874, la puedes adaptar. Los datos de la imágen los obtuve de Bitmap2LCD
> 
> Ver el archivo adjunto 68207



oye me estuve basando en tu programa para sacar graficos por el lcd  ya encontre la forma de censar el touch   ahora vamos pòr partes  en la direccion  0x0000 empieza el programa  y el 0x800 esta los datos de la imagen a mandar..

despues de que presenta el grafico   hay una etiqueta que dice fin  la elimine  y  continue con mas programa  primero  le añadi  con versiones adc para el touch  y no hubo problema  cuando le empece  a meter mas lines para converciones del adc  empezo el problema despues de 70 lineas mas mi pic ya no hace nada  ni siquira  presenta  la imagen al panel cheque en mi programador del pic  y ni siquiera  allegado  alos primeros 2k de programa   cual sera el problema  no se si sea que acumulando todo el programa con el grafico sea  2k realmente  estoy un poco  confundido espero alguna ayuda de tu parte


----------



## Daniel Meza (Jun 15, 2012)

Puedes poner tu programa por aquí, en teoría debería de funcionar. Si tienes isis, puedes simularlo sin incluir el GLCD, si existe algún problema con la memoria del programa (un salto errático, etc) se visualizará en la simulación...


----------



## visual (Jun 15, 2012)

si mira   cuando ya no hace nada mi pic  le quito 2 o 3 lineas de programa y ya vuelve   acorrer normal  creo que estoy sobre pasando los  2k de programa  pero se supone que estoy en la pagina 0  y casi  esta vacia


----------



## Daniel Meza (Jun 15, 2012)

Puedes intentar ajustando los datos de la imagen en otro segmento de memoria, por ejemplo en otra página. O bien puedes implementar una memoria I2C de más capacidad y solo ir leyendo los datos de la imágen y enviarlos secuencialmente al GLCD


----------



## visual (Jun 15, 2012)

si ya hice eso lo puse en la pagina 2  0x1000  y ajuste los valores  de  adh adl  pero me sucede lo mismo  realmente   el pic apenas  si tiene 1/4  de su capacidad entonces  ya tengo tiempo intentando y no logro resolverlo


----------



## Daniel Meza (Jun 15, 2012)

Haz la prueba en isis de proteus como te mencioné anteriormente, y vas "debuggenado" poco a poco el programa hasta dar con el problema. Serguramente es por un salto incorrecto y tiene que ver con los registros PCLATH y PC del PIC. (Si es que usas la serie 16F, en la serie 18F no existen estos problemas ya que la memoria de programa no está segmentada)


----------



## visual (Jun 15, 2012)

si realmente creo que es PCLATH y PC   por que  estoy ocupando el 16f877   voy  correrlo en el proteus  y  espero resolverlo pronto


----------



## Daniel Meza (Jun 15, 2012)

vale... ve poniendo en tu programa fuente instrucciónes "sleep" para simularlo poco a poco. Especialmente enfócate en la rutina que leé los datos de la memoria y subrutinas de retardo que tengas. Tambíen fijate en la pestaña view->program memory para observar si el código no se mezcla entre páginas de memoria


----------



## visual (Jun 15, 2012)

si mira ya lo simule pero PCLATH siempre sta el cero el unico  que cambia de valor es el pc eso es normal porque es el contador de programa entonces creo que los datos del grafico siempre estan el la pagina 0 al igual q el resto del programa  y juntando ambos nos da 2k por eso es no brinca por si solo  ala siguiente pagina y no entiendo entonces por que  no estan los datos del grafico el la pagina 1 se supone  q el org  0x800 situa en esta parte del programa el grafico


----------



## Daniel Meza (Jun 15, 2012)

Revisa tu programa compilado como te comenté View->program memory y allí verificas que los datos de la imágen estén a partir de la dirección 0x0800... a mi me solía pasar que declaraba así los datos:

Tabla_Datos
ORG 0x0800
bla bla bla

cuando lo correcto es

ORG 0x0800
Tabla_Datos
bla bla bla

el orden de la etiqueta importa, revisa que no sea tu caso. Muchas veces tuve problemas por eso.


----------



## nietzche (Jun 17, 2012)

Esta pantalla me esta costando bastante, ya logre enviar numeros en modo grafico, solo que no los puedo insertarlos en otro grafico, hay un comando que permite insertar un pixel, la cosa es que si queremos posicionarla digamos en 2,2    en realidad se posicionara en el byte 2
0000                    0000000000000000
0100                    0000000010000000
osea que se posicionan cada 8 bits, para mi es un problema porque quiero hacer un algoritmo donde se pueda dibujar una linea, como en C: goto(x,y)


----------



## Daniel Meza (Jun 17, 2012)

Aún no he experimentado bien la idea. Pero tengo mas o menos entendido como se haría: Para comenzar se inicializaría un buffer de memoria en RAM para contener los 1600 bytes que requiere el GLCD (aquí el inconveniente de usar uC's), en este buffer se cargarían los datos que se vayan a enviar al GLCD. 

Para el caso de dibujar una línea, la idea sería ir calculando que pixeles se encenderían y cuales no, estos cálculos nos deberán arrojar que pixeles se ilumnarán y por medio de apuntadores ir modificando los 
bytes por medio de instrucciónes OR y AND para apagar y encender pixeles dentro del buffer del GLCD. 

Es una idea algo vaga, la concretaré por estos días que ya he salido de vacaciónes y tendré más tiempo para dedicarle.


----------



## nietzche (Jun 18, 2012)

o claro, yo voy a modificar un archivo en C para que se pueda manejar en PICC y asi disponible para ese lenguaje, a veces es preferible el C que el asm.


----------



## Daniel Meza (Jun 18, 2012)

En estos casos si es preferible un lenguaje de alto nivel, hace la tarea más fácil pero quizás retarde la genereción de imágenes y demandan mucha RAM para cálculos matemáticos


----------



## visual (Jun 20, 2012)

Este es un editor de imagenes muy bueno ymucho mas facil que el bitmap y es la version completa



Ami me funciona de maravilla


----------



## nietzche (Jun 21, 2012)

buen aporte, se agradece


----------



## visual (Jun 21, 2012)

Como sacar un grafico  en la mitad del lcd  o en otra parte que no sea la posicion  0x00


----------



## Daniel Meza (Jun 21, 2012)

> Este es un editor de imagenes muy bueno ymucho mas facil que el bitmap y es la version completa



Gracias



> Como sacar un grafico en la mitad del lcd o en otra parte que no sea la posicion 0x00



Esto se logra reescribiendo el apuntador de posición del LCD, byte alto y bajo, si no mal recuerdo se logra con los comandos 0x0A (byte bajo) y 0x0B (byte alto) en seguida de cada de estos comandos se escribe el número de la posición donde se comenzará a escribir. Consulta el PDF en la pág 21/30 
Saludos


----------



## nietzche (Jun 21, 2012)

En efecto, primero tienes la imagen digamos, la de fondo y despues mandas el otro grafico y lo apuntas donde quiere estar, asi se encima la segunda imagen con la primera que se queda "grabada" y se meter 2 o  las que sean.


----------



## visual (Jun 29, 2012)

he leido el foro y sigo teniendo la duda  ¿ no es posible ingresarle texto a una imagen ?  e hecho el intento pero no lo he logrado he leido que con otros glcd si es posible. no se si requiera alguna instruccion especial


----------



## Daniel Meza (Jun 29, 2012)

> he leido el foro y sigo teniendo la duda ¿ no es posible ingresarle texto a una imagen ? e hecho el intento pero no lo he logrado he leido que con otros glcd si es posible. no se si requiera alguna instruccion especial



No es posible ya que el GLCD solo puede trabajar en dos modos independientes, texto o gráficos, pero no simultáneamente. En el modo gráfico se puede ingresar texto como si fueran pequeñas imágenes (creadas por uno mismo) pero el algoritmo es un tanto complejo para ir posicionando cada "letra" en su respectiva posición de la palabra.


----------



## nietzche (Jul 4, 2012)

Claro es dificil hacer un algoritmo para poner texto en modo grafico, yo lo logré aunque no he podido insertar caracteres encima de otra imagen, luego posteo el codigo


----------



## Daniel Meza (Jul 4, 2012)

Yo me encuentro trabajando en un algoritmo similar. Con una función como mencionas "goto (x,y), en unos días subo el código explicado. Saludos


----------



## Daniel Meza (Jul 10, 2012)

Lo prometido es deuda... dejó aquí el programa con el algoritmo que les comenté. 
Esta hecho en ensamblador para el PIC18F2450 trabajando a 20 MHz y con un cristal de cuarzo de 32768Hz para generar retardos precisos en el TMR1. El bus de datos del GLCD está conectado de RB0 a RB7, 
EN->RA1 y RS a RA0.

Les explicaré como opera el algoritmo:

La idea es como les comenté anteriormente, en el programa están declaradas "minimágenes" de 8 bytes correspondientes a cada letra que se deseé mostrar, estos datos se encuentran a partir de la dirección 0x0900 y cada caracter está declarado por la etiqueta "Letra_A, Letra_B, etc"

Se tienen dos registros Cor_X y Cor_Y los cuales apuntan a las 200 posiciónes para mostrar texto en el GLCD, es decir si establecemos Cor_X=0 y Cor_Y=5, se mostrará el caracter en la fila 6 y columna 0 del GLCD



En el archivo de Excel está un bosquejo donde se observan las direcciones del cursor correspondientes a cada coordenada. (Una coordenada está compuesta por 8 bytes).



Cuando se desea mostrar algún caracter es necesario seguir 3 pasos
1-Cargar los registros "Cor_X" y "Cor_Y" en la posición donde se desee mostrar el caracter
2-Cargar el caracter a enviar en W por medio de la instrucción "movlw LOW Letra_A", de esta manera se apunta al inicio del grupo de 8 bytes que conforman a la letra A
3-Llamar a la subrutina GLCD_XY la cual se hará cargo de leer los datos del caracter y posicionarlos en las coordenadas especificadas.

La subrutina "GLCD_XY" básicamente lo que hace es recibir 3 parámetros: 2 datos coordenadas y un dato del caracter a mostrar. 

Para calcular la dirección del cursor el GLCD lo que hace es tomar el valor de la coordenada Y y multiplicarla por 160, a este resultado se le suma el valor de la coordenada X y se obtiene el inicio donde se escribirán consecutivamente los 8 bytes correspondientes al caracter



Como ejemplo muestro como escribir un caracter en la coordenada 2,1 del GLCD

La dirección del cursor es manipulada directamente por medio de los registros PRODL y PRODH, en estos registros se obtiene el resultado de la multiplicación, aproveche estos mismos registros para conformar el apuntador de 16 bits que tiene el GLCD para posicionar el cursor.

La misma subrutina "GLCD_XY" al terminar de escribir un caracter avanza a la siguiente coordenada en X para no tener que reescribir este dato al momento de enviar cadenas de caracteres
Espero haberme explicado, con este ejemplo, de todos modos en el archivo .asm viene comentado aún así cualquier duda que resulte pregunten por acá.

He de aclarar que no he terminado de formar la tabla para todo el abecedario en mayúsculas y minúsculas por lo que les solicito su coperación. Los datos de los caracteres los saco de la misma hoja de datos del GLCD formando byte por byte por lo que es algo pesado. 

Aún asi, ójala puedan optimizar más el direccionamiento de letras, ya que por la forma en que lo implementé solo es posible direccionar hasta 256/8 =32 caracteres diferentes de 8 bytes.
En fin, les dejo una foto con el resultado. 



Saludos


----------



## nietzche (Jul 10, 2012)

Ujule bien eres un maestraso, yo lo hize de forma diferente, hize los carcteres en el bitmap2lcd del 0 al 9 solamente, y despues los almacene en una parte de la memoria de programa, despues jalaba los datos con la funcion tablat. tengo una teoria, como se le podria hacer para agrandar los caracteres, si le ponemos size =1 saldra de tamaño natural, pero ke tal si multiplicamos un bit y se hace 4 bits, osea ke se desplaza a un bit a la derecha a la eskina derecha/abajo y abajo. No se si me explique, que ben trabajo mi rutina la verdad me costo trabajo,


----------



## Daniel Meza (Jul 10, 2012)

La idea en si es similar a la que comentas, salvo porque yo incluí en la rutina el algoritmo de posicionamiento en coordenadas (seguí la idea de la función gotoxy() en C++ que comentaste).
Tu idea de cambiar el tamaño de fuente es llamativa, incluso, no sé, se podría elegir entre diversos tipos de fuentes. 
Se me ocurre, para faciliar más la programación, elegir tamaños correspondientes a potencias de 2, por ejemplo en el caso anterior los caracteres están a 8X8 pixeles, se podrían agrandar después a 16X16 o 32X32. Ya pensaré en alguna forma de implementarlo.
Si es algo complicado sobre todo por la parte matemática jaja ahy que estarle pensando como enseñar al uC a calcular las posiciones del GLCD y como administrar su propia memoria. 
Pero no es imposible, que te parece si entre varios trabajamos en el programa para llevar a cabo todas estas ideas...


----------



## nietzche (Jul 11, 2012)

Exacto, yo tambien le agrege la funcion de gotoxy, Hize un caracter de 5x10, enviaba un byte y despues le sumaba 20 al puntero para el sig byte. esa idea de tamaño de la fuente es buena, voy a subir mi codigo mañana yo creo porque la tesis me esta matando horrible, tmbn ando desarrollando la rutina del touch, y con lo que pueda ayudaré, tengo la idea de hacer varias librerias como hacer figurillas o caracteres o cosas asi, casi casi como C para que asi se pueda interactuar.


----------



## Daniel Meza (Jul 11, 2012)

Muy bien, tengo curiosidad por la rutina del touch... pero vamos primero está la tésis


----------



## olinqui (Jul 12, 2012)

Hola amigos pues les comento que estoy siguiendo todo el post y en hora buena que esta de lujo yo estoy haciendo lo mismo que ustedes solo que traduciendo sus códigos de ASM a CCS y me encanta la propuesta de nietzche de generar algunas librerías para poder trabajar de manera más fácil con este GLCD por lo pronto aquí esta el alfabeto.


```
byte CONST Inicio[96] =
                        {0xA0 // SPACE
                         0x21 // !
                         0xDE // "
                         0x23 // #
                         0x24 // $
                         0x25 // %
                         0x26 // &
                         0x27 // '
                         0x28 // (
                         0x29 // )
                         0x2A // *
                         0x2B // +
                         0x2C // ,
                         0x2D // -
                         0x2E // .
                         0x2F // /
                         0x30 // 0
                         0x31 // 1
                         0x32 // 2
                         0x33 // 3
                         0x34 // 4
                         0x35 // 5
                         0x36 // 6
                         0x37 // 7
                         0x38 // 8
                         0x39 // 9
                         0x3A // :
                         0x3B // ;
                         0x3C // <
                         0x3D // =
                         0x3E // >
                         0x3F // ?
                         0x40 // @
                         0x41 // A
                         0x42 // B
                         0x43 // C
                         0x44 // D
                         0x45 // E
                         0x46 // F
                         0x47 // G
                         0x48 // H
                         0x49 // I
                         0x4A // J
                         0x4B // K
                         0x4C // L
                         0x4D // M
                         0x4E // N
                         0x4F // O
                         0x50 // P
                         0x51 // Q
                         0x52 // R
                         0x53 // S
                         0x54 // T
                         0x55 // U
                         0x56 // V
                         0x57 // W
                         0x58 // X
                         0x59 // Y
                         0x5A // Z
                         0x5B // [
                         0xCD // \
                         0x5D // ]
                         0x5E // ^
                         0x5F // _
                         0x60 // `
                         0x61 // a
                         0x62 // b
                         0x63 // c
                         0x64 // d
                         0x65 // e
                         0x66 // f
                         0x67 // g
                         0x68 // h
                         0x69 // i
                         0x6A // j
                         0x6B // k
                         0x6C // l
                         0x6D // m
                         0x6E // n
                         0x6F // o
                         0x70 // p
                         0x71 // q
                         0x72 // r
                         0x73 // s
                         0x74 // t
                         0x75 // u
                         0x76 // v
                         0x77 // w
                         0x78 // x
                         0x79 // y
                         0x7A // z
                         0x7B // {
                         0x7C // |
                         0x7D // }
                         0x7E // ->
                         0x7F // <-
                                  };
```

saludos cordiales.


----------



## Daniel Meza (Jul 13, 2012)

Gracias Olinqi, veamos que resulta de todo esto, por mi parte estoy más que dispuesto a apoyar en lo que se pueda... al parecer tengo que entrarle a todo eso del CCS Saludos


----------



## olinqui (Jul 13, 2012)

Si amigo si programas en ASM el CCS se te facilitara, no analice tu código antes por eso puse esa tabla pero creo que la que necesitamos es hacer a mano pixel por pixel las letras jajaja  perdon por la equivocacion ya me pongo a hacerla y la posteo.

P,D. estaría mal si voy subiendo el código en CCS aquí o en otro?

Saludos cordiales.


----------



## Daniel Meza (Jul 13, 2012)

> Si amigo si programas en ASM el CCS se te facilitara, no analice tu código antes por eso puse esa tabla pero creo que la que necesitamos es hacer a mano pixel por pixel las letras jajaja perdon por la equivocacion ya me pongo a hacerla y la posteo



Es cierto, un día de estos empezaré a ver que onda con esos lenguajes... si no te fijes, yo igual ando trabajando en esa tabla; y como le decía a Nietzche podríamos incluso hasta crear caracteres personalizados y diversas fuentes (a costa de más memoria pero bahh, venden EEPROM's I2C de 64KB por $30 jaja)



> P,D. estaría mal si voy subiendo el código en CCS aquí o en otro?



Compártelo por aqui mismo, así se tiene más a la mano la info y programas sobre este GLCD. 
Buen día


----------



## visual (Jul 14, 2012)

daniel meza dijo:


> muy bien, tengo curiosidad por la rutina del touch... Pero vamos primero está la tésis


luego te paso  la rutina del touch ya logre leer coordenadas con el adc del pic  es mucho mas facil  q*ue*  sacar graficos...  Y el electroluminicente  ya tengo un circuito ya  logre trabajar con  ambos luego paso el c*ó*digo  y el esquema  del electroluminicente



En la imagen muestro un teclado  el problema q*ue* tengo es como presentar en la parte de arriba la tecla q*ue* estoy oprimiendo ya tengo lo del touch solucionado


----------



## nietzche (Jul 15, 2012)

Muchas gracias, cada día se ve gente interesada por esta pantalla, pArece que vino un "lote chino" a vender aqui a Mexico y esta muy bien, respecto al alfabeto olinqui, enrealidad son 7 bytes que debemos de tener para cada caracter, porque? Porque debemos de enviar puntos por puntos para que asi se formen caracteres. Esto es datos de 5 x 7 bits, osea 5 bits de ancho por 7 de alto, fomando así 35 bits o lo que es lo mismo 7 bytes en total ya que en realidad no se ocupan tooodos los bits de un byte, lo que yo quiero preguntarle a Daniel es como usa el formato de cada caracter ? Empiezas arriba a la derecha? O en la segunda columna ? Ne explico? Para yo tambien hacerlos, ahora ya casi termino la rutina de la touch en asm, usa 4 canales c/d y una interrupcion externa, en la semana ya lo subo, saludos.



Comparemos librerias touch para que asi el cliente "eliga" o se puedan modificar o incluso hacer mini rutinas que detecten errores o la rutina para checar la presion ejercida en el touch. respecto a pasar la libreria a CCS he trabajado en varios foros y en http://www.ccsinfo.com/forum/viewtopic.php?p=99735 esta esta libreria, la unica situacion es que falta la rutina que va al principio porque si la intentan incluir en CCS les tira un error, chequenle porfas no? Me parece que es la declaracion de variables, no he tenido tiempo de checar la libreria con la ya conocida 128x64, peo pienso que ahí esta la respuesta.


----------



## olinqui (Jul 17, 2012)

Hola nietzche si ya estuve peleándome con esa librería pero la verdad es que no soy tan ducho en CCS y luego de analizarla y modificarla un montón me pareció más fácil empezar de cero y una vez entendidos en la operación básica y las rutinas correspondientes pretendo ir armando la librería de a poco asta llegar al touch.

Estoy muy atrasado en el trabajo con respecto a ustedes en ASM pero espero poderle dedicar más tiempo en esta semana y tener algunos avances.

Por lo pronto comparto este código para escribir en modo carácter.


```
#include <18F4550.h> 
 #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN 
 #use delay(clock=48000000) 
 #include "usb_bootloader.h"
 //Referencia de asicnacion de Pines

 // RS  =RC0
 // R/W =RE0
 // E   =RE1
 // CS  =RC2
 // Res =RE2
//****************************************************************************

byte CONST Inicio[19] = {0x00 // INST: MODE CONTROL
                         0x38 // Set:  Dsp on,Master,cursor ON char BLink,Mode CHAR,Built-in ROM CHAR
                         0x01 // INST: CHARACTER PITCH (-1)
                         0x77 // Set:  8 bits vertical CHAR, 8 bits horizontal x CHR => 20 chr x 10 rngl
                         0x02 // INST: NUM CHAR (-1)
                         0x13 // Set:  20 char  horizontalmente
                         0x03 // INST: DISPLAY DUTY (-1)
                         0x4F // Set:  80 (valor de puntos verticalmente)
                         0x04 // INST: CURSOR POsITION (-1)
                         0x07 // Set:  en el bit 8 (vertical)
                         0x08 // INST: DSP START ADD LOWER
                         0x00 // Set:  posicion 0
                         0x09 // INST: DSP START ADD UPPER
                         0x00 // Set:  posicion 0
                         0x0A // INST: RAM ADD LOWER
                         0x00 // Set:  posicion 0
                         0x0B // INST: RAM ADD UPPER
                         0x00 // Set:  posicion 0
                         0x0C // INST: WRITE DATA TO RAM
                             };
  
byte int8 Puntero[19] = {0x00,0x38,0x01,0x77,0x02,0x13,0x03,0x4F,0x04,0x07
                           0x08,0x00,0x09,0x00,0x0A,0x53,0x0B,0x00,0x0C};  
//                                                  /\  
//                                              Modifica posicion del puntero.

byte CONST Texto[14] = {0x50,0x52,0x55,0x45,0x42,0x41,0x00,0x00,0x4D,0x45,0x52,0x4C,0x49,0x4E};
  
byte CONST Borrar[200] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};



 

void main(void)
{
 output_low(pin_E0);         // R/W apagar “RE0 a 0
 output_low(pin_C2);         // CS apagar “RC2 a 0
 output_high(pin_C0);         // RS encendido “RC0 a 1 

byte Var1=0;

 //////////////////Tabla  de inicialización////////////////////////////////////

      for (Var1=0;Var1<19;Var1++)
            {
         output_high(pin_E1);       // E  encender “RE1 a 1
         OUTPUT_D(Inicio[Var1]);     // Digito unidades envio al puerto B
         output_toggle(PIN_E1);     // E Cambia el estado y apagalo “RE1 a 0
         delay_ms(1);              // Retardo Para evitar Datos
         output_toggle(PIN_C0);     // RS cambia el estado del pin RC0 y lo apago
         output_toggle(PIN_E1);     // E Cambia el estado y enciendelo “RE1 a 1
               }
 
 output_low(pin_C0);         // Apaga RS “RC0 a 0
 
 //////////////////Tabla  de Borrado////////////////////////////////////
          
          
 for (Var1=0;Var1<200;Var1++)
            {
         output_high(pin_E1);       // E  encender “RE1 a 1
         OUTPUT_D(Borrar[Var1]);     // Digito unidades envio al puerto B
         output_toggle(PIN_E1);     // E Cambia el estado y apagalo “RE1 a 0
         delay_ms(1);              // Retardo Para evitar Datos
//         output_toggle(PIN_C0);     // RS cambia el estado del pin RC0 y lo apago
         output_toggle(PIN_E1);     // E Cambia el estado y enciendelo “RE1 a 1
            }
 
  output_low(pin_E1);         // apagar   E  “RE0 a 0 

//////////////////Tabla  de Puntero////////////////////////////////////

 output_high(pin_C0);         // RS encendido “RC0 a 1 
      for (Var1=0;Var1<19;Var1++)
            {
         output_high(pin_E1);       // E  encender “RE1 a 1
         OUTPUT_D(Puntero[Var1]);     // Digito unidades envio al puerto B
         output_toggle(PIN_E1);     // E Cambia el estado y apagalo “RE1 a 0
         delay_ms(1);              // Retardo Para evitar Datos
         output_toggle(PIN_C0);     // RS cambia el estado del pin RC0 y lo apago
         output_toggle(PIN_E1);     // E Cambia el estado y enciendelo “RE1 a 1
               }
 output_low(pin_C0);         // Apaga RS “RC0 a 0

//////////////////Tabla  de Texto////////////////////////////////////

for (Var1=0;Var1<14;Var1++)
            {
         output_high(pin_E1);       // E  encender “RE1 a 1
         OUTPUT_D(Texto[Var1]);     // Digito unidades envio al puerto B
         output_toggle(PIN_E1);     // E Cambia el estado y apagalo “RE1 a 0
         delay_ms(1);              // Retardo Para evitar Datos
         output_toggle(PIN_E1);     // E Cambia el estado y enciendelo “RE1 a 1
               }
 }
```

Y este otro en modo gráfico aun que con errores ya que se me repite la imagen y aún no descubro por que, no e tenido mucho tiempo para trabajar en esto pero como dije le daré más tiempo en esta semana.


```
#include <18F4550.h> 
 #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN 
 #use delay(clock=48000000) 
 #include "usb_bootloader.h"
 //Referencia de asicnacion de Pines

 // RS  =RC0
 // R/W =RE0
 // E   =RE1
 // CS  =RC2
 // Res =RE2
//****************************************************************************

byte CONST Inicio[19] = {0x00 // INST: MODE CONTROL
                         0x32 // Set:  Dsp on,Master,cursor ON char BLink,Mode CHAR,Built-in ROM CHAR
                         0x01 // INST: CHARACTER PITCH (-1)
                         0x77 // Set:  8 bits vertical CHAR, 8 bits horizontal x CHR => 20 chr x 10 rngl
                         0x02 // INST: NUM CHAR (-1)
                         0x13 // Set:  20 char  horizontalmente
                         0x03 // INST: DISPLAY DUTY (-1)
                         0x4F // Set:  80 (valor de puntos verticalmente)
                         0x04 // INST: CURSOR POsITION (-1)
                         0x07 // Set:  en el bit 8 (vertical)
                         0x08 // INST: DSP START ADD LOWER
                         0x00 // Set:  posicion 0
                         0x09 // INST: DSP START ADD UPPER
                         0x00 // Set:  posicion 0
                         0x0A // INST: RAM ADD LOWER
                         0x00 // Set:  posicion 0
                         0x0B // INST: RAM ADD UPPER
                         0x00 // Set:  posicion 0
                         0x0C // INST: WRITE DATA TO RAM
                             };


byte CONST Grafico[1600] = {

 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0xBF,0xCF,0xE7,0xE7
 0xF0,0xFC,0xFC,0x3F,0x1F,0x8F,0xCF,0x7F
 0xBE,0xFF,0x3D,0xFE,0x7B,0xF9,0xF7,0xBD
 0x9F,0xB7,0xDB,0xE3,0xFE,0xFB,0x7D,0xFE
 0xEF,0x77,0xB7,0x3F,0x9E,0x7E,0xDC,0xFD
 0xB9,0xF8,0xF3,0xDB,0xAF,0xBF,0xDF,0xF1
 0xF8,0x7F,0xBE,0xFE,0xEF,0x77,0xB3,0x5F
 0xAE,0xBE,0xFD,0x7D,0xFA,0xFC,0x75,0xE7
 0xBF,0xDF,0xE7,0xF4,0xF6,0x78,0x3F,0x7F
 0x1F,0x0F,0xBB,0x7F,0xBE,0xFF,0x7D,0xFE
 0x7B,0xFD,0x37,0xF7,0xDC,0x6E,0x1F,0x10
 0x87,0xC3,0xA3,0x70,0xE8,0x3C,0x3B,0xB8
 0xDF,0x71,0xBE,0xE1,0xFD,0xC4,0x3B,0xEB
 0xDF,0xF7,0xDD,0xFB,0xF7,0x7B,0xBF,0xBE
 0xEF,0xB7,0xDB,0xBF,0xDF,0x7F,0xDE,0xFD
 0xDD,0xFE,0xFB,0xCD,0xDF,0xC3,0xE3,0xFB
 0xF8,0xFC,0x7F,0xBF,0x1F,0xCF,0xE7,0xBF
 0xDF,0x7F,0x0E,0xFE,0x3D,0xFE,0xFB,0xDE
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 0x00,0x00,0x00,0x00,0x00,0x00,0x00  0x00
 };
  

  

void main(void)
{
 output_low(pin_E0);                 // R/W apagar “RE0 a 0
 output_low(pin_C2);                 // CS apagar “RC2 a 0
 output_high(pin_C0);                // RS encendido “RC0 a 1 
byte Var1=0;

 //////////////////Tabla  de inicialización////////////////////////////////////

      for (Var1=0;Var1<19;Var1++)
            {
         output_high(pin_E1);         // E  encender “RE1 a 1
         OUTPUT_D(Inicio[Var1]);      // Digito unidades envio al puerto B
         output_toggle(PIN_E1);       // E Cambia el estado y apagalo “RE1 a 0
         delay_ms(1);                 // Retardo Para evitar Datos
         output_toggle(PIN_C0);       // RS cambia el estado del pin RC0 y lo apago
         output_toggle(PIN_E1);       // E Cambia el estado y enciendelo “RE1 a 1

 }
 
 output_low(pin_C0);                  // Apaga RS “RC0 a 0
 output_low(pin_E1);                  // Apaga E  “RE0 a 0  
 
 //////////////////Tabla  de Grafico////////////////////////////////////

for (Var1=0;Var1<1600;Var1++)
            {
         output_high(pin_E1);         // E  encender “RE1 a 1
         OUTPUT_D(Grafico[Var1]);     // Digito unidades envio al puerto B
         output_toggle(PIN_E1);       // E Cambia el estado y apagalo “RE1 a 0
         delay_ms(1);                 // Retardo Para evitar Datos
         output_toggle(PIN_E1);       // E Cambia el estado y enciendelo “RE1 a 1


 }


         }
```

Dejo unas imágenes del GLCD y si quieren el PCB se los paso o incluso si están en el DF que intuyo que así es se los puedo hacer ya hice el marco de serigrafia para grabarlos.



Ver el archivo adjunto 76038

Ver el archivo adjunto 76037


 Utilizo el Bootloader del CCS para cargar el código al micro por eso llamo la librería "usb_bootloader.h"

Agradeseria si me pudieran pasar el esquema del backlight para modificar el PCB y pasarselos completo ya que en el de la imagen no lo tiene implementado pero le deje la opcion en el bloque de coneccion inferior de color verde.


----------



## nietzche (Jul 17, 2012)

Realmente como descanza uno al hacer trabajos en C, la diferencia es enoooormeee, gracias por el aportaso, ahora te cuento que daniel y yo hemos trabjaado en el bcklight y no lo hemos conseguido, el distribuidor no pasó el esquema, aunque dio un CI pero no lo encontramos por ningun lado, aqui esta el esquema original que en realidad es un simple CI SOIC http://www.infinitumpage.mx/GIOSYS/SP4423CN.pdf a mi me habia funcionado un esquema pero no llegue a probatlo en la glcd, en problema fue encontrar la bobina porque esta un poco rara, checa aca: http://www.nerdkits.com/videos/backlight/ si lo puedes hacer nos cuentas, la onda cuadrada la sacas del pic, Si baja la frecuencia tambien baja el brilllo.

Y sere curioso?, como funciona ese bootloader ?????


----------



## nietzche (Jul 17, 2012)

Puedes probar esta libreria haber si sirve porfa?, la modifique para CCS y no me tiro error


----------



## visual (Jul 17, 2012)

nietzche dijo:


> Realmente como descanza uno al hacer trabajos en C, la diferencia es enoooormeee, gracias por el aportaso, ahora te cuento que daniel y yo hemos trabjaado en el bcklight y no lo hemos conseguido, el distribuidor no pasó el esquema, aunque dio un CI pero no lo encontramos por ningun lado, aqui esta el esquema original que en realidad es un simple CI SOIC http://www.infinitumpage.mx/GIOSYS/SP4423CN.pdf a mi me habia funcionado un esquema pero no llegue a probatlo en la glcd, en problema fue encontrar la bobina porque esta un poco rara, checa aca: http://www.nerdkits.com/videos/backlight/ si lo puedes hacer nos cuentas, la onda cuadrada la sacas del pic, Si baja la frecuencia tambien baja el brilllo.
> 
> Y sere curioso?, como funciona ese bootloader ?????



para el electroluminicente ocupa un 555 y un transformador  es bastante facil


----------



## nietzche (Jul 17, 2012)

visual dijo:


> para el electroluminicente ocupa un 555 y un transformador  es bastante facil



La cosa es que andamos viendo que no ocupe mucho espacio


----------



## olinqui (Jul 18, 2012)

Hola a todos, nietzche estaba diseñando un bcklight pero no se me prendía el foco en la cabeza de como elevar el voltaje, la idea de anular la fuerza contra electromotriz en una bobina de Inductancia - Choque es genial ya que con los picos de tensión solo se necesita ajustar la frecuencia y controlamos el nivel de carga de los capacitores y con esto el voltaje, bueno hoy compro lo que me falta y armo el circuito para probarlo y espero por la noche me de tiempo de darle un rato al código y probar tu librería esta madrugada ya no me alcanzo jejeje, estuve analizando un poco el circuito del link que posteaste y creo que la inductancia es un choque con núcleo de ferrita busque una y la tenia en stock y lo demás lo encontré en AG.

Lo del Boodloader es bien simple solo tienes que cargar el firware que viene en los ejemplos del CCS  declararlo en el código y asignar un pin con un  push button para entrar en modo bootloader, esto es presionando primero el de modo y luego el master clear, cuando win lo detecta te pide un controlador que esta en la carpeta PICC\Drivers le das esa ruta y te lo instala como un COM virtual en mi caso COM6,
luego de eso en el CCS compiler le das en Tools/Serial port monitor/File y por ultimo Download Software y con esto manda el código al pic, lo bueno de esto es que con la declaración del bootloader  CCS ajusta en automático la dirección de memoria de tu código para que no sobrescriba el firware.

Adjunto lo necesario para el Bootloader.

Saludos cordiales.


----------



## Daniel Meza (Jul 18, 2012)

Visual, gracias por el aporte



> Muchas gracias, cada día se ve gente interesada por esta pantalla, pArece que vino un "lote chino" a vender aqui a Mexico y esta muy bien, respecto al alfabeto olinqui, enrealidad son 7 bytes que debemos de tener para cada caracter, porque? Porque debemos de enviar puntos por puntos para que asi se formen caracteres. Esto es datos de 5 x 7 bits, osea 5 bits de ancho por 7 de alto, fomando así 35 bits o lo que es lo mismo 7 bytes en total ya que en realidad no se ocupan tooodos los bits de un byte, lo que yo quiero preguntarle a Daniel es como usa el formato de cada caracter ? Empiezas arriba a la derecha? O en la segunda columna ? Ne explico? Para yo tambien hacerlos, ahora ya casi termino la rutina de la touch en asm, usa 4 canales c/d y una interrupcion externa, en la semana ya lo subo, saludos.



parece que así es, en muchos localitos he visto que las venden.

El formato de llenado es de arriba a la derecha, como dicen el el datasheet en la esquina superior izquierda del GLCD tenemos el bit 0 del 1er byte, es decir los bytes están invertidos. No se si esa era la duda



> Lo del Boodloader es bien simple solo tienes que cargar el firware que viene en los ejemplos del CCS declararlo en el código y asignar un pin con un push button para entrar en modo bootloader, esto es presionando primero el de modo y luego el master clear, cuando win lo detecta te pide un controlador que esta en la carpeta PICC\Drivers le das esa ruta y te lo instala como un COM virtual en mi caso COM6,
> luego de eso en el CCS compiler le das en Tools/Serial port monitor/File y por ultimo Download Software y con esto manda el código al pic, lo bueno de esto es que con la declaración del bootloader CCS ajusta en automático la dirección de memoria de tu código para que no sobrescriba el firware



Definitivamente tengo que actualizarme en este rollo del C jaja... no he podido experimentar con el backlight, espero si, en esta semana igualmente yo consiga el material para hecharlo a andar


----------



## nietzche (Jul 18, 2012)

perfecto, les cuento que mi cuate me dio el circuito del backlight, que le dije a ustes, y aleluya, prende, fijense que parece que entrega mucha corriente, estaria bien un diseÑo con un diodo schottky o algo que limite el amperaje bajo, porque me dio un buen toquesote. respecto a las letras daniel voy a aportar, y tambien una minirutina para la touch, ahora que no me funciono mi tesis, la voy a rediseÑar toda, la duda que tengo es a visual:  conectaste una resistencia al pin del glcd para que te de la interrupcion cuando se toque ???


----------



## olinqui (Jul 19, 2012)

Hola nietzche donde conseguiste la inductancia por que lo acabo de terminar pero no trabaja pienso que puede ser eso, puedes poner una foto del circuito armado?

Gracias y saludos.


----------



## visual (Jul 19, 2012)

Para leer el touch nada mas ocupe una resistencia pullup  a la terminal y- y con el adc tomas el valor  de esta coordenada . En mi caso no era necesario  ocupar interrupciones solo con prueba de bit fue suficiente . Tienes que hacer combinaciones entre los bits de pic para realizar la lectura de y,x  no es necesasrio ocupar mas componentes solo con el pic  16f877 o cualquier otro q tenga adc  lo puedes hacer..


Alguien sabe  si el color  azul del electroluminicente es el correcto por q  si le aumento la frecuencia me cambia a blanco..


----------



## Daniel Meza (Jul 19, 2012)

> Alguien sabe si el color azul del electroluminicente es el correcto por q si le aumento la frecuencia me cambia a blanco.



Cuando expermenté con el electrolumincente me dió un color blanco, y si bajaba la frecuencia solamente se iba bajando su intensidad. Lo extraño es que en los demos el electroluminicente enciende de color amarillo regular


----------



## nietzche (Jul 20, 2012)

visual una resistencia a Y- ?, solamente?, para que sirve esa resistencia ?. 

Mi idea es que cuando el usuario  toque la pantalla el programa se interrumpa, porque puede estar haciendo otras cosas el micro o simplemente este "durmiendo". Entonces en tu conexion siempre esta escaneando la GLCD?.

En la foto adjunta se muestra cuando el micro esta en espera a que la pantalla sea tocada.

La bobina la consigues enfrente del 24 al fondo, luego subo las fotos porque no tengo conmigo los mosfets.


----------



## Daniel Meza (Jul 20, 2012)

> Para leer el touch nada mas ocupe una resistencia pullup a la terminal y- y con el adc tomas el valor de esta coordenada . En mi caso no era necesario ocupar interrupciones solo con prueba de bit fue suficiente



¿Como que prueba de bit?... para conseguir generar la interrupción se me ocurre utilizar un comparador de voltaje cuya salida sea conectada al PIC. Habría que ver lo de la referencia de voltaje adecuada para que cada que se toque el touch el comparador conmute su salida y genere la int


----------



## nietzche (Jul 20, 2012)

Muy bien visual, podre conectar el bit con el que haces la btfsc y  ponerlo simultaneamente en RB0 que es la interrupcion externa ???
Gracias


----------



## Daniel Meza (Jul 20, 2012)

Lo olvidaba, con respecto al código del amigo Olinqui, me parece que se puede optimizar más la parte donde aparecen los 0x00's, supongo que es para el borrado del GLCD, en ves de mandar toda esa tabla se puede implementar un ciclo "For" para el borrado no?...



> Muy bien visual, podre conectar el bit con el que haces la btfsc y ponerlo simultaneamente en RB0 que es la interrupcion externa



Adelantandome a Visual, supongo que si se puede, pero ya no será necesario el "testeo" por medio de btfsc, la simple interrupción invocará al código de lectura del touch


----------



## visual (Jul 23, 2012)

Si claro solo es necesario ocupar una de los dos el test o la interrupci*ó*n todo depende de lo q*ue* necesites


----------



## nietzche (Jul 23, 2012)

olinqui podrias pasar un esquematico de tu bootloader, porfas ?


----------



## Daniel Meza (Jul 25, 2012)

¿Alguien sabe si a este GLCD se le pueden meter caracteres personalizados en modo texto como en los demás LCD's alfanuméricos?


----------



## nietzche (Jul 26, 2012)

Estaria bueno investigar eso.


----------



## Daniel Meza (Jul 26, 2012)

Ando leyendo sobre eso, me parece que es necesario agregar otra ROM al controlador LC7981. Por el momento me encuentro investigando como configurar el GLCD para mostrar 10x26 letras en modo caracter.

Por cierto, en la web encontré Ver el archivo adjunto glcd_160x80.rar esta libreria para CCS para controlar este GLCD... me parece muy completa aunque aún no la pruebo. Supongo ha de funcionar


----------



## nietzche (Jul 27, 2012)

Hombre gracias por compartir la libreria que pienso yo es la definitiva para CCS, ahora no se que hacer porque al tener esta libreria puedo migrar mi proyecto a C.  ¬¬

Por cierto no sabes si hay un hilo sobre esa libreria?, porque tengo varias dudas.


----------



## Daniel Meza (Jul 27, 2012)

Saludos... la encontré por acá:

http://www.todopic.com.ar/foros/index.php?topic=38850.0


----------



## nietzche (Jul 30, 2012)

Gracias, alguien ha hecho algo con la touch ?, a mi solo me leen las coordenadas en X pero las Y no, no se si este conectado mal o si mi touch no funciona.


----------



## Daniel Meza (Jul 31, 2012)

> Gracias, alguien ha hecho algo con la touch ?, a mi solo me leen las coordenadas en X pero las Y no, no se si este conectado mal o si mi touch no funciona.



En el mismo link de la librería viene el archivo de prueba... supongo allí viene declarada la función para leer el touch. Pruebalo haber si te anda bien.

Ahora les comento que ya logré mostrar caracteres personalizados en este GLCD en el modo alfanumérico. 

He de aclarar que para lograr esto es necesario modificar el Hardware y en algunos casos puede ser riesgoso...
Aclarado este punto, manos a la obra...

Primero que nada hay que explicar como es que el GLCD muestra el texto y para eso ahy que recurrir a la hoja de datos del controlador principal: el LC7981.



La sección que nos interesa es la que está encerrada en el recuadro color aguamarina, así como los buses rojo (datos), azul (direcciónes) y amarillo (datos de entrada provenientes del CG Externo).

La memoria RAM que se aprecia en el diagrama es en donde se almacenan los datos de imágenes (1600 bytes en modo gráfico) o los caracteres ASCII (en modo alfanúmerico). En el GLCD, esta memoria es equivalente a una RAM 62256 (32 KB) de la cual solo se tiene acceso a los primeros 4 KB de datos (las líneas de dirección A12, A13, y A14 están conectadas a tierra). 

El recuadro con el nombre "Character Generator" es una ROM interna al uC la cual se encarga de generar los códigos de bits para cada caracter (algo así como las miniimágenes a las que me referia en los comentarios anteriores cuando tratabamos de enviar texto en modo gráfico). Este CG tiene como entradas 8 bits provenientes de la RAM externa en donde se codifica el caracter ASCII a mostrar, y otros 4 bits provenientes del "ROW ADDRESS COUNTER" el cual es  básicamente un contador de 4 bits encargado del barrido del patrón de bits que componene al caracter; en conjunto estos 12 bits forman el código de entrada para la CG ROM la cual a su salida envía el patrón de bits correspondiente al caracter codificado en la RAM. 
A continuación dejo una explicación gráfica hasta este punto.



Ahora pasando a lo interesante... para generar nuestros propios caracteres es necesario generar los patrones de bits de ellos, bit pot bit. Para facilitar esta tarea he recurrido a dos programas: "Paint" con el cual dibujé cada caracter personalizado y "Bitmap2LCD" para generar el código binario para los caracteres. De esta manera podemos definir hasta 256 caracteres de 8x8 pixeles (o 512 caracteres utilizando una ROM de 4 Kbytes). A continuación muestro la tabla de caracteres y códigos que he generado; como verán son los mismos que trae el código ASCII más algunos de los símbolos más utilizados y aún así quedan varios espacios para definir algunos más.



Bien, pero ¿como añadir estos caracteres al GLCD?... Vayamos a eso.
Como mencioné anteriormente, el uC puede comunicarse al exterior por medio de 3 buses: direcciones, datos de RAM y el de datos de entrada del CG Externo. Este CG externo estará comprendido por una EPROM 27C16 (2KB) conexidonada de la siguiente manera:



Como se puede observar el bus de datos de salida de la RAM es utilizado como el byte alto del bus de direcciónes de la EPROM, los 3 bits inferiores A0, A1 y A2 están conectados a MA12, MA13 y MA14 del bus de direcciónes del uC; estos 3 bits fungen con el "RAC" para el barrido del patron de caracteres almacenado en la EPROM, en realidad MA15 también debería ser conectado pero como los caracteres que definí tienen una altura de máx 8 bytes con 3 bits es suficiente para direccionarlos.
El bus de datos de salida de la EPROM es conectado a las líneas RD0..RD7 del uC, en este bus se tendrán los patrones  de bits de cada caracter personalizado.

Para acceder a ellos es necesario enviar al GLCD el comando que le indicará que conmute al CG externo, es decir enviar la siguiente secuencia de bytes:

RS=1 0x00	Comando de configuración
RS=0 0x31	Selecciona CG Externo sin visualización del cursor en modo texto

Con esto, el CG interno es ignorado y en su lugar se toman los datos provenientes de la EPROM externa. 

Por ejemplo: 
Supongamos que en la localidad de RAM 0x0000 (Inicio de la primera fila) se tiene el código ASCII del caracter "M" 0x4D; entonces para que el uC lea este dato primero coloca en su bus de direcciones el código 0xX000 (recordemos que los 4 bits de mayor peso son ignorados por la RAM), enseguida la RAM devuelve el código de la "M" 0x4D el cual sirve como byte alto de dirección para la EPROM, las líneas MA12-MA14 comienzan el conteo progresivo de las direcciónes 0x4D0, 0x4D1..0x4D7 para obtener los datos del patrón de bits correspondiente al caracter "M"; por esta razón en las localidades 0x4D0..4D7 debe de estar guardado dicho patrón. 
Una vez terminado el barrido, el bus de datos MA0..MA11 se incrementa y apunta al siguiente 
caracter en RAM y una vez más se repite el proceso hasta finalizar el barrido completo del GLCD.

Ahora, pasando al software para la EPROM, les dejo la imágen con el patrón de bits de los caracteres en tamaño real para que la puedan modificar con paint y las instrucciónes necesarias para generar el código con el Bitmap2LCD.


Configuración en el Bitmap2LCD



Patrón de bits en tamaño real


Instrucciónes


Finalmente una foto con el resultado, disculpen la calidad de la imágen pero solo tenía a la mano la cámara del celular 



Como recomendación si es que desean hacer la modificación, utilicen alambre de bobina para hacer las conexiónes entre el LC7981 y la EPROM de esta manera podrán soldar con mayor comodidad. Nadamás tenga a la mano una buena cámara posteo fotos de el conexioando físico de la EPROM y el PCB que diseñé para ella. 

Saludos


----------



## nietzche (Jul 31, 2012)

Gracias por esto, eres un hacker en todo esto, entonces debes meter la 27C16 en algun espacio de l a glcd para digamos: darle mas memoria y con  A3 y MA15 se  direcciona a la nueva memoria no ?.
Ahora le podre poner los iconos de las redes sociales para que se vea mas loco =P

Oye una pregunta cambiaste el backlight por uno de led? lo venden por separado ?

En mi tesis dira: Gracias a Daniel Meza por ayudarme con mi pantalla.  =)


----------



## Daniel Meza (Ago 1, 2012)

> Gracias por esto, eres un hacker en todo esto, entonces debes meter la 27C16 en algun espacio de l a glcd para digamos: darle mas memoria y con A3 y MA15 se direcciona a la nueva memoria no ?.
> Ahora le podre poner los iconos de las redes sociales para que se vea mas loco =P
> 
> Oye una pregunta cambiaste el backlight por uno de led? lo venden por separado ?
> ...



jajaja esque necesitaba mostrar esos caracteres y comprar otro GLCD que los tenga está difícil, son muy costosos... 

Exacto, aunque en realidad se direcciona con MD0-MD7 y con MA12, MA13 y MA14.

Con respecto al backlight creo que optaré por adaptarle una tirita de leds que le quitaré a otro LCD de deshecho... enseguida dejo las fotos que prometí.. allí se ve la placa para la EPROM y la tira de leds que pienso adaptarle











PD: Sobre la tésis.. jaja, con que quede tu proyecto está bien... saludos


----------



## olinqui (Ago 2, 2012)

Daniel Meza mis sinseros respetos es usted un experto y sus aportes geniales muchas gracias por compartirlos


----------



## asherar (Ago 2, 2012)

Me sumo al halago, y ya _enlacé_ el post 109 a mi tema sobre GLCD. 
Saludos.


----------



## Daniel Meza (Ago 3, 2012)

Gracias compañeros... espero les sirvan... por el momento me dedicaré a lo del electroluminicente y a la adaptación de la tirita de leds, pronto les informaré sobre los avances...
Saludos


----------



## olinqui (Sep 4, 2012)

nietzche dijo:


> olinqui podrias pasar un esquematico de tu bootloader, porfas ?



Hola espero no sea muy tarde jeje el esquema de mi tarjeta con el Bootloader implementado es este y las instrucciones y el código están en el adjunto del post anterior.


Agregué unas resistencias de pull down para la lectura del  panel touch esto con la intención de tener una lectura más estable estoy probando el código que escribió falflores en otro foro en CCS pero no tengo suerte para echarlo a andar me pregunto si alguien logro hacerlo en ASM igual lo entiendo mejor y resuelvo mi problema.

Saludos cordiales.


----------



## nietzche (Sep 17, 2012)

Yo si lo hise pero solamente pase de ccs a asm y las coordenadas se arrojan a un registro de 16 bits


----------



## Daniel Meza (May 13, 2013)

Saludos, hace tiempo que no me paseo por este tema pero en esta ocasión vengo a dejar una pequeña aplicación de este GLCD. 

Consiste en un "juego de gato" (en otros lugares conocido como 3 en línea, etc) usando el touchscreen que viene incorporado en el GLCD como teclado.

Como procesador uso el PIC18F2450, dejo de todos modos el .ASM por si alguien desea adaptarlo a otro PIC de esta serie.


----------



## nietzche (Oct 21, 2013)

Programaste tu todo ? Tengo curiosidad por hacer tambien juegos en ese pic


----------



## Daniel Meza (Oct 22, 2013)

Saludos.. así es, decidí darle alguna otra aplicación al panel touch GLCD y pensé en este proyecto.


----------



## nietzche (Oct 23, 2013)

Como seria pensar un juego tipo Wan pero comunicado por xbee's, asi dos jugadores jugarian el mismo juego inalambricamente, oye una duda como sabe el programa donde se coloca el x o el O, es decir en que casilla se coloco la X?


----------



## Daniel Meza (Oct 23, 2013)

Fíjate que no había pensado en algo así, de dos jugadores inalambricos, suena muy interesante... la elección de la casilla lo hace por medio de un promedio de lecturas de la sección pulsada en el touch, una vez calculada la posición se llama a una de las rutinas que puse en el asm Cor11, Cor12, Cor13, Cor21 y así. Considero que el ASM está bien comentado pero si hay más dudas en alguna sección con gusto aclararé


----------



## Daniel Meza (Ago 2, 2014)

Hola, saludos nuevamente; verán por andarle metiendo mano a la plaquita del LCD estropeé la etapa del oscilador del LC7981  y no se de que valor son la Rf y el Cf, en base a la suya ¿me podrían decir el valor de estos componentes? Están situados  junto al LC7981

Gracias


----------

