Autor Tema: lcd serial ks0108 128 x 64 winstar + pic 18f4550 + bootloader  (Leído 6033 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jaalm741

  • PIC10
  • *
  • Mensajes: 10
lcd serial ks0108 128 x 64 winstar + pic 18f4550 + bootloader
« en: 10 de Septiembre de 2010, 18:27:02 »
Hola gente de todo pic soy nuevo en este foro, siempre me ayudaron con sus respuestas,(todavia no estaba registrado)  se los agradezco, muchas gracias.  :mrgreen:

Les quiero contar que pude hacer andar el pic 18f4550 con bootloader gracias a ustedes. El problema es que no me funciona el LCD wg12864a tim winstar conectado al pic y tambien lo probe con un circuito de puerto paralelo, pero no hay caso no lo logro hacer funcionar. Me lei todos los foros posibles, lei el datasheet pero no me dice nada. Vi el datasheet del Ks0108 y no me ayuda de mucho, probe la libreria CSS de Ks0108 la traduje a C18 y no funciona. Tambien traduje programas del pic 16f877 en ensamblador y lo migre a C18 para el 18f4550 con bootloader.  No se si mi lcd funciona o no, tengo dos lcd y ninguno lo logro hacer andar. La verdad es que estoy desesperado, no me puedo recibir hasta que no haga andar este bendito lcd.
Les juro que si lo hago andar voy a publicar mi proyecto en este foro. Es un osciloscopio digital con conexion a pc, que muestra las señales por este lcd, y tiene como corazon al 18f4550. Desde  ya muchas gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: lcd serial ks0108 128 x 64 winstar + pic 18f4550 + bootloader
« Respuesta #1 en: 10 de Septiembre de 2010, 18:53:45 »
Si confiamos que el hardware esta bien realizado el problema es la librería del GLCD.  :mrgreen: Muéstranos el esquema que estas utilizando para conectar el GLCD y la librería que estas implementado, sino difícil ayudar  :?



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 666
Re: lcd serial ks0108 128 x 64 winstar + pic 18f4550 + bootloader
« Respuesta #2 en: 11 de Septiembre de 2010, 07:17:23 »
Bienvenido al foro, ahora bien como dice el colega suky si no das muchos detalles sera imposible ayudarte dinos en que estas fallando que error de da si es al compilar o si muestra la lcd imagen o caracteres en fin se mas explicito y veras que proto entre la comunidad del foro y mas que nada tu propio esfuerzo logras que ese proyecto te ande.

Saludos y esperamos tus detalles, y nuevamente bienvenido  y espero venter mas amenudo en el foro.
Atten.
Alexander Santana.
Barcelona-Venezuela.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado jaalm741

  • PIC10
  • *
  • Mensajes: 10
Re: lcd serial ks0108 128 x 64 winstar + pic 18f4550 + bootloader
« Respuesta #3 en: 12 de Septiembre de 2010, 17:35:26 »
gracias por responder tan pronto. les prometo que lo mas pronto posible voy a subir los esquemas y las conexiones y si necesitan ayuda sobre el bootloader me preguntan y les ayudo. Es que estoy por rendir examenes.  mañama a mas tardar subo los esquemas ok.

Desconectado jaalm741

  • PIC10
  • *
  • Mensajes: 10
Re: lcd serial ks0108 128 x 64 winstar + pic 18f4550 + bootloader
« Respuesta #4 en: 13 de Septiembre de 2010, 18:07:32 »
Aqui les dejo mi codigo, la imagen del hardware pesa mas de 500 kb asi que despues la subo
Código: C
  1. /* ------------------------------------------  */
  2. /*  Programa que funciona con USB Bootloader   */
  3. /* ------------------------------------------  */
  4. /*  E-mail: Jaalm741@yahoo.com.ar              */
  5. /*---------------------------------------------*/
  6. /*   Cambios para que funcione el Bootloader   */
  7. /*---------------------------------------------*/
  8. /* Correr el vector de reset a la direccion    */
  9. /* 0x000800 en vez la opcion normal  0x00.     */    
  10. /* correr el vector de interrupcion a la       */
  11. /* direccion 0x000808 (parte alta) en vez de   */
  12. /* la opcion normal 0x8 y la parte baja a la   */
  13. /* direccion 0x000818 en vez de la normal 0x18 */  
  14. /* configurar el pin RB4 del puertoB como      */
  15. /* entrada digital y no usar ese pin para nada */  
  16. /* Reset y RB4 deben estar a +Vcc (+5V) para   */
  17. /* trabajar en modo normal.                    */
  18. /* para entrar en modo Bootloder debo poner RB4*/
  19. /* a 0V(GND) y luego reset a 0V(GND).          */
  20. /* usar mr18f4550.lkr en vez del 18f4550.lkr   */
  21. /* que viene en el MCHPDFUSB                   */
  22. /* (si no lo consiguen me lo piden por e-mail  */
  23. /* pero en la pagina de microchip seguro esta.)*/
  24. /* poner a masa la bornera para que ande la    */
  25. /* placa sino no funciona, con el usb conectado*/
  26. /* a la pc.                                    */
  27. /*---------------------------------------------*/
  28.  
  29. /*------------------------------------------------------------*/
  30. /* Esta libreria para manejar el LCD Winstar es el resultado  */
  31. /* de varias librerias que andaban dando vuelta por la red.   */
  32. /* Las probe a todas por separado y ninguna funciono, asi que */
  33. /* decidi escribir la mia propia que tiene un poco de cada    */
  34. /* una de ellas y ahora tambien les pertenece a ustedes.      */
  35. /* La mayoria de ellas estaba escrita en lenguaje ensamblador */
  36. /* para pic 16f87X, alguna de ellas escrita en CSS. pero vi en*/
  37. /* varios foros que a la mayoria no les funcionaba, y cada uno*/
  38. /* tenia que realizar sus propio ajustes en el estrobe del    */
  39. /* enable ( los tiempos diferian mucho a los del data sheet ).*/
  40. /* espero que la podamos hacer funcionar entre todos.         */
  41. /*------------------------------------------------------------*/
  42.  
  43. #include <p18f4550.h>
  44. #include <delays.h>
  45.  
  46. /*----------------------------------------------------------*/
  47. /* Definiciones de pines de control y Bus de datos del LCD  */
  48. /* Winstar WG 12864A TMI VN                                 */
  49. /* -------------------------------------------------------- */
  50. #define LCD_DI            PORTBbits.RB7  // dato o instruccion
  51. #define LCD_LE            PORTBbits.RB6  // lectura o escritura
  52. #define LCD_E             PORTBbits.RB5  // habilitacion
  53. #define LCD_CS1           PORTBbits.RB3  // seleccion de chip 1
  54. #define LCD_CS2           PORTBbits.RB2  // seleccion de chip 2
  55. #define LCD_Reset         PORTBbits.RB1  // reset del lcd
  56. #define LCD_Bus_de_datos  PORTD          // bus de datos del lcd      
  57.  
  58. /*----------------------------------------------------------*/
  59. /* Codigos internos de instrucciones basicas del LCD Winstar*/
  60. /* -------------------------------------------------------- */
  61. /* Saque las instrucciones del data sheet del KS018B        */
  62. /* No si este LCD maneja KS0108A o KS0108B esa es mi duda   */
  63. /* lo unico que varia es el reset que esta complementado y  */
  64. /* y en el otro no.                                         */
  65. /* -------------------------------------------------------- */
  66.  
  67. #define i_LCD_encendido        0x3F
  68. #define i_LCD_apagado          0x3E
  69. #define i_LCD_pagina_0         0xB8
  70. #define i_LCD_columna_0        0x40
  71. #define i_LCD_linea_inicial_0  0xC0
  72.  
  73. /*----------------------------------------------------------*/
  74. /*  Definiciones basicas y tipos de datos fundamentales     */
  75. /* -------------------------------------------------------- */
  76. typedef unsigned int ui;
  77. typedef unsigned short int byte;
  78. typedef unsigned short int usi;
  79.  
  80. #define lado_izquierdo_LCD  0  
  81. #define lado_derecho_LCD    1  
  82. #define modo_instruccion  0
  83. #define modo_dato         1
  84. #define modo_escritura 0
  85. #define modo_lectura   1
  86.  
  87. /*----------------------------------------------------------*/
  88. /* Cabeceras o prototipos de funciones del programa         */
  89. /*----------------------------------------------------------*/
  90. void conf_puertos (int opcion);
  91. void delay(usi opcion);
  92. void delay2(usi opcion);
  93. void envia_dato_o_instruccion(usi lado,usi d_i,byte dato);
  94. byte LCD_leeBYTE (usi lado);
  95. void LCD_limpiar (usi color);
  96. void LCD_inicializar (void);
  97. byte bit_clear ( byte x, usi n);
  98. byte bit_set (byte x, usi n);
  99. void LCD_pixel (usi a,usi b, usi color);
  100.  
  101. /* ---------------------------------- */
  102. /*  Declaracion del vector de reset   */
  103. /* ---------------------------------- */
  104. extern void _startup (void);  // mira tu c018i.c en tu directorio de compilador C18
  105. #pragma code _RESET_INTERRUPT_VECTOR = 0x000800
  106. void _reset (void)
  107. {
  108.     _asm goto _startup _endasm
  109. }
  110.  
  111. /* ------------------------------------------ */
  112. /*  Declaraciones del vector de interrupcion  */
  113. /* ------------------------------------------ */
  114. /*  En este programa no uso interrupciones    */
  115. /*  pero lo dejo como esqueleto para otros    */
  116. /*  programas que si las usen.                */
  117. /* ------------------------------------------ */
  118.  
  119. #pragma code  
  120. #pragma code _HIGH_INTERRUPT_VECTOR = 0x000808
  121. void _high_ISR (void)
  122. {
  123.         ;
  124. }
  125.  
  126. #pragma code _LOW_INTERRUPT_VECTOR = 0x000818
  127. void _low_ISR (void)
  128. {
  129.         ;
  130. }
  131.  
  132. #pragma code // vuelve a la seccion de codigo por defecto
  133.  
  134. /* -------------------------------- */
  135. /*  funcion principal del programa  */
  136. /* -------------------------------- */
  137. void main (void)
  138. {
  139.         int i;
  140.         conf_puertos (0);
  141.         LCD_inicializar();     
  142.         while(1)
  143.         {      
  144.                 LCD_pixel (10,10,1);           
  145.                 for (i=1;i<=10;i++) // espera casi 10 segundos
  146.                 {
  147.                 Delay10KTCYx(250);  //espera 0,5 segundos HS=20MHz
  148.                 Delay10KTCYx(250);  //espera 0,5 segundos
  149.             }  
  150.         }
  151. }
  152.  
  153. /* ------------------------------------------------------------- */
  154. /*  Configuraciones de los puertos y pines del microcontrolador  */
  155. /* ------------------------------------------------------------- */
  156.  
  157. void conf_puertos (int opcion)
  158. {                
  159.         ADCON1=0x0D; /* AN0,AN1         :  analógicas       */
  160.                      /* AN2..AN12       :  digitales        */
  161.                      /* Vref- = VSS                         */
  162.                      /* Vref+ = VDD                         */
  163.                      /* RA0/AN0: entrada 1 del osciloscopio */
  164.                      /* RA1/AN1: entrada 2 del osciloscopio */
  165.                      
  166.         /* --------------------------------------- */
  167.         /*   Configuracion de los puertos de E/S   */
  168.         /* --------------------------------------- */
  169.        
  170.         if (opcion == 0 )  // si opcion == 0  puerto D como salida
  171.                            // si opcion <> 0  puerto D como entrada
  172.         {
  173.                 PORTD = 0;  /* Pines que se comunican con los pines del LCD winstar */
  174.                 LATD  = 0;  /* para enviar y recibir datos                          */
  175.                 TRISD = 0;  /* Configuro todos los bits del puerto D como Salida    */
  176.         }
  177.         else
  178.         {
  179.                 PORTD = 0;    /* Pines que se comunican con los pines del LCD winstar */
  180.                 LATD  = 0;    /* para enviar y recibir datos                          */
  181.                 TRISD = 255;  /* Configuro todos los bits del puerto D como entradas  */
  182.         }
  183.        
  184.         PORTB = 0;  /* Pines que se comunican con los pines del LCD winstar   */
  185.         LATB  = 0;  /* para manejar los pines de control                      */
  186.         TRISB = 17; /* Configuro todos los bits del puerto B como Salida      */
  187.                     /* Salvo RB0 y RB4 que son de lectura. RB0 va a GND y     */
  188.                     /* RB4 que en modo normal va a +Vcc (tambien reset a +Vcc)*/
  189.                     /* y en modo bootloader va RB4 a 0V (tambien reset a 0V)  */                          
  190.        
  191.         PORTA = 0;
  192.         LATA  = 0;
  193.         CMCON = 7;
  194.         TRISA = 255;/* Configuro todos los bits del puerto A como entradas */
  195.                     /* RA0,RA1         : entradas anlógicas                */
  196.                     /* RA2,RA3,RA4,RA5 : entradas digitales                */  
  197. }
  198.  
  199. void delay(usi opcion)
  200. {
  201.         /*-------------------------------------------------*/
  202.         /* Ciclo de instruccion = 4 *( 1 / 20MHz )= 0,2 Us */
  203.         /* ( 5 * Ciclo de instruccion )= 1 Us              */
  204.         /* (10 * Ciclo de instruccion )= 2 Us              */
  205.         /* Delay1TCY = 0,2 Us = Nop                        */
  206.         /*-------------------------------------------------*/
  207.        
  208.         if (opcion == 0) // espera 1 Us
  209.         {
  210.                 Delay1TCY();
  211.                 Delay1TCY();
  212.                 Delay1TCY();
  213.                 Delay1TCY();
  214.                 Delay1TCY();
  215.         }
  216.         else             // espera 2 Us
  217.         {
  218.                 Delay1TCY();
  219.                 Delay1TCY();
  220.                 Delay1TCY();
  221.                 Delay1TCY();
  222.                 Delay1TCY();
  223.                 Delay1TCY();
  224.                 Delay1TCY();
  225.                 Delay1TCY();
  226.                 Delay1TCY();
  227.                 Delay1TCY();
  228.         }
  229. }
  230.  
  231. void delay2(usi opcion)
  232. {
  233.         /*-------------------------------------------------*/
  234.         /* Ciclo de instruccion = 4 *( 1 / 20MHz )= 0,2 Us */
  235.         /* ( 100 *  50 * Ciclo de instruccion ) = 1 ms     */
  236.         /* ( 100 * 100 * Ciclo de instruccion ) = 2 ms     */
  237.         /* Delay1TCY = 20 Us                               */
  238.         /*-------------------------------------------------*/
  239.        
  240.         if (opcion == 0) // espera 1 ms
  241.         {
  242.                 Delay100TCYx(50);              
  243.         }
  244.         else             // espera 2 ms
  245.         {
  246.                 Delay100TCYx(100);             
  247.         }
  248. }
  249.  
  250. /*---------------------------------------------------------*/
  251. /*  Escribe un byte en una de las mitades de la pantalla   */
  252. /*  lado == 0 (parte izq lcd)| lado == 1 (parte der lcd)   */
  253. /*---------------------------------------------------------*/
  254. void envia_dato_o_instruccion(usi lado,usi d_i, byte  dato)
  255. {
  256.         // lado debe valer 0 o 1                  
  257.         // dato puede tomar los siguientes valores : 0 .. 255
  258.        
  259.         /* selecciono la mitad del LCD correspondiente */
  260.         if (lado == 0)
  261.         {
  262.                 LCD_CS1 = 0;
  263.                 LCD_CS2 = 1;
  264.         }      
  265.     else
  266.     {
  267.             LCD_CS1 = 1;
  268.             LCD_CS2 = 0;
  269.         }
  270.        
  271.     LCD_LE = modo_escritura;      
  272.     LCD_DI = d_i;
  273.         LCD_Bus_de_datos = dato;          
  274.                
  275.     // genero el flanco descendente para el pin enable del LCD
  276.         delay(0);    // espero 1 us
  277.         LCD_E = 1;   // pongo el bit enable en alto    
  278.         delay(1);    // espero 2 us    
  279.         LCD_E = 0;   // pongo el bit enable en bajo    
  280.         delay(0);    // espero 1 us    
  281.         /* libero las lineas CS1 y CS2 */      
  282.         LCD_CS1=0;
  283.         LCD_CS2=0;
  284. }
  285.  
  286. /*------------------------------------------------------*/
  287. /* Lee un byte de una de las dos mitades de la pantalla */
  288. /*------------------------------------------------------*/
  289. byte LCD_leeBYTE (usi lado)
  290. {
  291.         byte dato;
  292.         conf_puertos (1);        
  293.         LCD_LE = modo_lectura;    
  294.        
  295.         /* selecciono la mitad del LCD correspondiente */
  296.         if (lado == 0)
  297.         {
  298.                 LCD_CS1 = 0;
  299.                 LCD_CS2 = 1;
  300.         }      
  301.     else
  302.     {
  303.             LCD_CS1 = 1;
  304.             LCD_CS2 = 0;
  305.         }
  306.            
  307.     // genero el flanco descendente para el pin enable del LCD
  308.     delay2(0);                // espero 1 us
  309.         LCD_E = 1;                // pongo el bit enable en alto    
  310.         delay2(1);                // espero 2 us
  311.         dato = LCD_Bus_de_datos;  // leo los datos del LCD     
  312.         LCD_E = 0;                // pongo el bit enable en bajo    
  313.    
  314.     /* libero las lineas CS1 y CS2 */  
  315.         LCD_CS1=0;
  316.         LCD_CS2=0;
  317.         conf_puertos (0);
  318.         return dato;
  319. }
  320.  
  321. void LCD_limpiar (usi color)
  322. {
  323.         usi i,j,k;             
  324.     for(i = 1; i <=8 ;i++)
  325.     {                  
  326.                 for(j = 1; j <=8 ;j++)
  327.                 {
  328.                         envia_dato_o_instruccion(lado_izquierdo_LCD,modo_instruccion,j+i_LCD_pagina_0);
  329.                         envia_dato_o_instruccion(lado_derecho_LCD,modo_instruccion,j+i_LCD_pagina_0);
  330.                 }
  331.                 envia_dato_o_instruccion(lado_izquierdo_LCD,modo_instruccion,i_LCD_columna_0);
  332.                 envia_dato_o_instruccion(lado_derecho_LCD,modo_instruccion,i_LCD_columna_0);
  333.                 for(k = 1; k <=64 ;k++)
  334.                 {
  335.                         envia_dato_o_instruccion(lado_izquierdo_LCD,modo_dato,0);
  336.                         envia_dato_o_instruccion(lado_derecho_LCD,modo_dato,0);
  337.                 }
  338.         }
  339. }
  340.  
  341. void LCD_inicializar (void)
  342. {  
  343.         LCD_E = 0;
  344.         LCD_Reset = 0;
  345.         LCD_Reset = 1;    
  346.         envia_dato_o_instruccion(lado_izquierdo_LCD,modo_instruccion,i_LCD_apagado);
  347.         envia_dato_o_instruccion(lado_derecho_LCD,modo_instruccion,i_LCD_apagado);  
  348.         LCD_limpiar (0);
  349.         envia_dato_o_instruccion(lado_izquierdo_LCD,modo_instruccion,i_LCD_encendido);
  350.         envia_dato_o_instruccion(lado_derecho_LCD,modo_instruccion,i_LCD_encendido);    
  351. }
  352.  
  353. /* rutina que pone en 0 el n bit del registro x */
  354. byte bit_clear (byte x, usi n)
  355. {
  356.         /* n puede tomar los valores : 0..7 */
  357.         usi i,s=0;     
  358.         for(i=7 ; i>=n ; i--)
  359.         {
  360.                 s+=pow(2,i);
  361.         }
  362.         x&=(s-1);
  363.         return x;
  364. }
  365.  
  366. /* rutina que pone en 1 el n bit del registro x */
  367. byte bit_set (byte x, usi n)
  368. {
  369.         usi aux=pow(2,n);
  370.         x|=aux;
  371.         return x;
  372. }
  373.  
  374. /*=========================================== */
  375. /*= Funcion que dibuja un pixel por pantalla =*/
  376. /*=========================================== */
  377. void LCD_pixel (usi a,usi b, usi color)
  378. {
  379.     /* a : 0..127      b: 0..63 */
  380.        
  381.         byte dato;
  382.         usi  lado = lado_izquierdo_LCD; // Lado en el que voy a dibujar
  383.         if(a > 63)     
  384.         {
  385.                 a-=64;
  386.                 lado = lado_derecho_LCD;
  387.         }                        
  388.                 a=bit_clear (a,7);     // limpio el bit MSB
  389.                 a=bit_set(a,6);        // pongo el bit 6 en 1
  390.                 envia_dato_o_instruccion(lado,modo_instruccion,a); // envio la direccion de la coordenada a
  391.                
  392.                 /* Calculo en que pagina de las 8 cae */
  393.                 envia_dato_o_instruccion(lado,modo_instruccion,(b/8 & 191)|184);  
  394.                 LCD_DI = modo_dato;
  395.                
  396.                 //Se necesitan dos lecturas para que devuelva el dato en la nueva direccion
  397.                 LCD_leeBYTE (lado);
  398.                 dato = LCD_leeBYTE (lado);
  399.                
  400.                 // De acuerdo al valor de color ...
  401.                 if(color == 1) dato=bit_set(dato,b%8);   //enciendo el pixel
  402.                 else           dato=bit_clear(dato,b%8); //apago el pixel              
  403.                  
  404.                 envia_dato_o_instruccion(lado,modo_instruccion,a);    // fijo el lado a escribir
  405.        
  406.                 envia_dato_o_instruccion(lado,modo_dato,dato); // dibujo el pixel      
  407. }

Aqui les dejo otro codigo adicional que tambien probe pero no me funciono

Código: C
  1. /* ------------------------------------------  */
  2. /*  Programa que funciona con USB Bootloder    */
  3. /* ------------------------------------------  */
  4. /*  E-mail: Jaalm741@yahoo.com.ar              */
  5. /*---------------------------------------------*/
  6. /* Esta es otra version de la libreria para el */
  7. /* LCD WG 12864A TIM VN Winstar                */
  8. /* algunas partes se parecen a la otra pero en */
  9. /* el fondo es bastante distinta a la anterior */
  10. /*---------------------------------------------*/
  11.  
  12. #include <p18f4550.h>
  13. #include <delays.h>
  14.  
  15. /*----------------------------------------------------------*/
  16. /* Definiciones de pines de control y Bus de datos del LCD  */
  17. /* Winstar 12864A                                           */
  18. /* -------------------------------------------------------- */
  19. #define LCD_DI    PORTBbits.RB7  
  20. #define LCD_LE    PORTBbits.RB6
  21. #define LCD_E     PORTBbits.RB5
  22. #define LCD_CS1   PORTBbits.RB3
  23. #define LCD_CS2   PORTBbits.RB2
  24. #define LCD_Reset PORTBbits.RB1
  25. #define LCD_Bus_de_datos PORTD
  26.  
  27. /*----------------------------------------------------------*/
  28. /* Codigos internos de instrucciones basicas del LCD Winstar*/
  29. /* -------------------------------------------------------- */
  30. #define i_LCD_encendido       0x3F
  31. #define i_LCD_apagado         0x3E
  32. #define i_LCD_pagina_0        0xB8
  33. #define i_LCD_columna_0       0x40
  34. #define i_LCD_linea_inicial_0 0xC0
  35.  
  36. /*----------------------------------------------------------*/
  37. /*  Definiciones basicas y tipos de datos fundamentales     */
  38. /* -------------------------------------------------------- */
  39. typedef unsigned int ui;
  40. typedef unsigned short int byte;
  41. typedef unsigned short int usi;
  42.  
  43. #define lado_izquierdo_LCD  0  
  44. #define lado_derecho_LCD    1  
  45. #define modo_instruccion  0
  46. #define modo_dato         1
  47. #define modo_escritura 0
  48. #define modo_lectura   1
  49.  
  50. /*----------------------------------------------------------*/
  51. /* Cabeceras o prototipos de funciones del programa         */
  52. /*----------------------------------------------------------*/
  53. void conf_puertos (int opcion);
  54. void delay(usi opcion);
  55. void delay2(usi opcion);
  56. void LCD_enviaBYTE(usi lado, byte dato);
  57. byte LCD_leeBYTE (usi lado);
  58. void LCD_limpiar (usi color);
  59. void LCD_inicializar (usi modo);
  60. byte bit_clear ( byte x, usi n);
  61. byte bit_set (byte x, usi n);
  62. void LCD_pixel (usi a,usi b, usi color);
  63.  
  64. /* ---------------------------------- */
  65. /*  Declaracion del vector de reset   */
  66. /* ---------------------------------- */
  67. extern void _startup (void);  // mira tu c018i.c en tu directorio de compilador C18
  68. #pragma code _RESET_INTERRUPT_VECTOR = 0x000800
  69. void _reset (void)
  70. {
  71.     _asm goto _startup _endasm
  72. }
  73.  
  74. /* ------------------------------------------ */
  75. /*  Declaraciones del vector de interrupcion  */
  76. /* ------------------------------------------ */
  77. #pragma code  
  78. #pragma code _HIGH_INTERRUPT_VECTOR = 0x000808
  79. void _high_ISR (void)
  80. {
  81.         ;
  82. }
  83.  
  84. #pragma code _LOW_INTERRUPT_VECTOR = 0x000818
  85. void _low_ISR (void)
  86. {
  87.         ;
  88. }
  89.  
  90. #pragma code // vuelve a la seccion de codigo por defecto
  91.  
  92. /* -------------------------------- */
  93. /*  funcion principal del programa  */
  94. /* -------------------------------- */
  95. void main (void)
  96. {
  97.         int i;
  98.         conf_puertos (0);
  99.         LCD_inicializar(0);
  100.         LCD_inicializar(1);
  101.         while(1)
  102.         {      
  103.                 LCD_pixel (10,10,1);
  104.                 for (i=1;i<=5;i++) // espera casi 5 segundos
  105.                 {
  106.                 Delay10KTCYx(250);  //espera 0,5 segundos HS=20MHz
  107.                 Delay10KTCYx(250);  //espera 0,5 segundos
  108.             }  
  109.         }
  110. }
  111.  
  112. /* ------------------------------------------------------------- */
  113. /*  Configuraciones de los puertos y pines del microcontrolador  */
  114. /* ------------------------------------------------------------- */
  115.  
  116. void conf_puertos (int opcion)
  117. {                
  118.         ADCON1=0x0D; /* AN0,AN1         :  analógicas       */
  119.                      /* AN2..AN12       :  digitales        */
  120.                      /* Vref- = VSS                         */
  121.                      /* Vref+ = VDD                         */
  122.                      /* RA0/AN0: entrada 1 del osciloscopio */
  123.                      /* RA1/AN1: entrada 2 del osciloscopio */
  124.                      
  125.         /* --------------------------------------- */
  126.         /*   Configuracion de los puertos de E/S   */
  127.         /* --------------------------------------- */
  128.        
  129.         if (opcion == 0 )  // si opcion == 0  puerto D como salida
  130.                            // si opcion <> 0  puerto D como entrada
  131.         {
  132.                 PORTD = 0;  /* Pines que se comunican con los pines del LCD winstar */
  133.                 LATD  = 0;  /* para enviar y recibir datos                          */
  134.                 TRISD = 0;  /* Configuro todos los bits del puerto D como Salida    */
  135.         }
  136.         else
  137.         {
  138.                 PORTD = 0;    /* Pines que se comunican con los pines del LCD winstar */
  139.                 LATD  = 0;    /* para enviar y recibir datos                          */
  140.                 TRISD = 255;  /* Configuro todos los bits del puerto D como entradas  */
  141.         }
  142.        
  143.         PORTB = 0;  /* Pines que se comunican con los pines del LCD winstar   */
  144.         LATB  = 0;  /* para manejar los pines de control                      */
  145.         TRISB = 17; /* Configuro todos los bits del puerto B como Salida      */
  146.                     /* Salvo RB0 y RB4 que son de lectura. RB0 va a GND y     */
  147.                     /* RB4 que en modo normal va a +Vcc (tambien reset a +Vcc)*/
  148.                     /* y en modo bootloader va RB4 a 0V (tambien reset a 0V)  */                          
  149.        
  150.         PORTA = 0;
  151.         LATA  = 0;
  152.         CMCON = 7;
  153.         TRISA = 255;/* Configuro todos los bits del puerto A como entradas */
  154.                     /* RA0,RA1         : entradas anlógicas                */
  155.                     /* RA2,RA3,RA4,RA5 : entradas digitales                */  
  156. }
  157.  
  158. void delay(usi opcion)
  159. {
  160.         /*-------------------------------------------------*/
  161.         /* Ciclo de instruccion = 4 *( 1 / 20MHz )= 0,2 Us */
  162.         /* ( 5 * Ciclo de instruccion )= 1 Us              */
  163.         /* (10 * Ciclo de instruccion )= 2 Us              */
  164.         /* Delay1TCY = 0,2 Us = Nop                        */
  165.         /*-------------------------------------------------*/
  166.        
  167.         if (opcion == 0) // espera 1 Us
  168.         {
  169.                 Delay1TCY();
  170.                 Delay1TCY();
  171.                 Delay1TCY();
  172.                 Delay1TCY();
  173.                 Delay1TCY();
  174.         }
  175.         else             // espera 2 Us
  176.         {
  177.                 Delay1TCY();
  178.                 Delay1TCY();
  179.                 Delay1TCY();
  180.                 Delay1TCY();
  181.                 Delay1TCY();
  182.                 Delay1TCY();
  183.                 Delay1TCY();
  184.                 Delay1TCY();
  185.                 Delay1TCY();
  186.                 Delay1TCY();
  187.         }
  188. }
  189.  
  190. void delay2(usi opcion)
  191. {
  192.         /*-------------------------------------------------*/
  193.         /* Ciclo de instruccion = 4 *( 1 / 20MHz )= 0,2 Us */
  194.         /* ( 100 *  50 * Ciclo de instruccion ) = 1 ms     */
  195.         /* ( 100 * 100 * Ciclo de instruccion ) = 2 ms     */
  196.         /* Delay100TCY  = 20 Us = Nop                      */
  197.         /*-------------------------------------------------*/
  198.        
  199.         if (opcion == 0) // espera 1 ms
  200.         {
  201.                 Delay100TCYx(50);              
  202.         }
  203.         else             // espera 2 ms
  204.         {
  205.                 Delay100TCYx(100);             
  206.         }
  207. }
  208.  
  209. /*---------------------------------------------------------*/
  210. /*  Escribe un byte en una de las mitades de la pantalla   */
  211. /*  lado == 0 (parte izq lcd)| lado == 1 (parte der lcd)   */
  212. /*---------------------------------------------------------*/
  213. void LCD_enviaBYTE(usi lado, byte  dato)
  214. {
  215.         // lado debe valer 0 o 1                  
  216.         // dato puede tomar los siguientes valores : 0 .. 255
  217.        
  218.         /* selecciono la mitad del LCD correspondiente */
  219.         if (lado == 0)
  220.         {
  221.                 LCD_CS1 = 0;
  222.                 LCD_CS2 = 1;
  223.         }      
  224.     else
  225.     {
  226.             LCD_CS1 = 1;
  227.             LCD_CS2 = 0;
  228.         }
  229.        
  230.     LCD_LE = modo_escritura;      
  231.         LCD_Bus_de_datos = dato;          
  232.                
  233.     // genero el flanco descendente para el pin enable del LCD
  234.         delay2(0);     // espero 1 us
  235.         LCD_E = 1;    // pongo el bit enable en alto    
  236.         delay2(1);     // espero 2 us  
  237.         LCD_E = 0;    // pongo el bit enable en bajo    
  238.        
  239.         /* libero las lineas CS1 y CS2 */      
  240.         LCD_CS1=0;
  241.         LCD_CS2=0;
  242. }
  243.  
  244. /*------------------------------------------------------*/
  245. /* Lee un byte de una de las dos mitades de la pantalla */
  246. /*------------------------------------------------------*/
  247. byte LCD_leeBYTE (usi lado)
  248. {
  249.         byte dato;
  250.         conf_puertos (1);        
  251.         LCD_LE = modo_lectura;    
  252.        
  253.         /* selecciono la mitad del LCD correspondiente */
  254.         if (lado == 0)
  255.         {
  256.                 LCD_CS1 = 0;
  257.                 LCD_CS2 = 1;
  258.         }      
  259.     else
  260.     {
  261.             LCD_CS1 = 1;
  262.             LCD_CS2 = 0;
  263.         }
  264.            
  265.     // genero el flanco descendente para el pin enable del LCD
  266.     delay2(0);                 // espero 1 us
  267.         LCD_E = 1;                // pongo el bit enable en alto    
  268.         delay2(1);                 // espero 2 us
  269.         dato = LCD_Bus_de_datos;  // leo los datos del LCD     
  270.         LCD_E = 0;                // pongo el bit enable en bajo    
  271.    
  272.     /* libero las lineas CS1 y CS2 */  
  273.         LCD_CS1=0;
  274.         LCD_CS2=0;
  275.         conf_puertos (0);
  276.         return dato;
  277. }
  278.  
  279. void LCD_limpiar (usi color)
  280. {
  281.         /* color puede valer : 0 = apaga pixeles    */
  282.         /*                     1 = enciende pixeles */
  283.         usi i,j;
  284.        
  285.         // Recorre las 8 paginas (vertical)
  286.     for(i = 0; i <=7; ++i)
  287.     {
  288.                 LCD_DI = modo_instruccion;
  289.                
  290.                 /* Comienzo, en cada pagina, desde la direccion 0 */
  291.                 LCD_enviaBYTE(lado_izquierdo_LCD,i_LCD_columna_0);
  292.                 LCD_enviaBYTE(lado_derecho_LCD,i_LCD_columna_0);
  293.                
  294.                 //Selecciono la direccion dentro de la pagina
  295.                 LCD_enviaBYTE(lado_izquierdo_LCD,i | i_LCD_pagina_0);
  296.                 LCD_enviaBYTE(lado_derecho_LCD,i | i_LCD_pagina_0);
  297.                
  298.                 LCD_DI = modo_dato;
  299.                
  300.                 // Recorre las dos mitades (horizontales)
  301.         for(j = 0; j < 64; ++j)        
  302.         {
  303.                 LCD_enviaBYTE(lado_izquierdo_LCD,255 * color); // Enciende/apaga los pixeles
  304.                         LCD_enviaBYTE(lado_derecho_LCD,255 * color);   // Enciende/apaga los pixeles
  305.             }
  306.     }
  307. }
  308.  
  309. void LCD_inicializar (usi modo)
  310. {
  311.   /* modo puede valer: 0 = LCD apagado   */
  312.   /*                   1 = LCD encendido */
  313.    
  314.   /* Pone los pines de control en el estado correcto */
  315.         LCD_Reset = 1;   // RST=1 resteo el LCD
  316.         LCD_E = 0;       // pongo el bit enable en bajo  
  317.         LCD_CS1 = 0;     // CS1 = 0
  318.         LCD_CS2 = 0;     // CS2 = 0
  319.         LCD_DI = modo_instruccion;
  320.        
  321.   /* Envio datos de inicialización */
  322.         LCD_enviaBYTE(lado_izquierdo_LCD,i_LCD_linea_inicial_0);
  323.         LCD_enviaBYTE(lado_derecho_LCD,i_LCD_linea_inicial_0);  
  324.         LCD_enviaBYTE(lado_izquierdo_LCD,i_LCD_columna_0);
  325.         LCD_enviaBYTE(lado_derecho_LCD,i_LCD_columna_0);  
  326.         LCD_enviaBYTE(lado_izquierdo_LCD,i_LCD_pagina_0);
  327.         LCD_enviaBYTE(lado_derecho_LCD,i_LCD_pagina_0);  
  328.        
  329.         if (modo == 1)
  330.         {
  331.                 LCD_enviaBYTE(lado_izquierdo_LCD,i_LCD_encendido);
  332.                 LCD_enviaBYTE(lado_derecho_LCD,i_LCD_encendido);  
  333.         }
  334.         else
  335.         {
  336.                 LCD_enviaBYTE(lado_izquierdo_LCD,i_LCD_apagado);
  337.                 LCD_enviaBYTE(lado_derecho_LCD,i_LCD_apagado);  
  338.         }      
  339.         /* Limpio la pantalla */
  340.         //LCD_limpiar (0);
  341. }
  342.  
  343. /* rutina que pone en 0 el n bit del registro x */
  344. byte bit_clear (byte x, usi n)
  345. {
  346.         /* n puede tomar los valores : 0..7 */
  347.         usi i,s=0;     
  348.         for(i=7 ; i>=n ; i--)
  349.         {
  350.                 s+=pow(2,i);
  351.         }
  352.         x&=(s-1);
  353.         return x;
  354. }
  355.  
  356. /* rutina que pone en 1 el n bit del registro x */
  357. byte bit_set (byte x, usi n)
  358. {
  359.         usi aux=pow(2,n);
  360.         x|=aux;
  361.         return x;
  362. }

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: lcd serial ks0108 128 x 64 winstar + pic 18f4550 + bootloader
« Respuesta #5 en: 13 de Septiembre de 2010, 20:36:01 »
mmm... Yo el código que uso para la inicialización es el siguiente:


Código: C
  1. void vGLCD_Iniciar(unsigned char Modo){
  2.  
  3.         GLCD_RST=1;
  4.         GLCD_E=0;
  5.         GLCD_CS1=0;
  6.         GLCD_CS2=0;
  7.         GLCD_DI=0;
  8.         GLCD_DATA=0;
  9.         GLCD_BACK=0;
  10.  
  11.         GLCD_CS1_TRIS=0;
  12.         GLCD_CS2_TRIS=0;
  13.         GLCD_DI_TRIS=0;
  14.         GLCD_RW_TRIS=0;
  15.         GLCD_E_TRIS=0;
  16.         GLCD_RST_TRIS=0;
  17.         GLCD_BACK_TRIS=0;
  18.         GLCD_DATA_TRIS=0;
  19.        
  20.         vGLCD_Escritura_Byte(GLCD_LEFT,0xC0);
  21.         vGLCD_Escritura_Byte(GLCD_RIGHT,0xC0);
  22.         vGLCD_Escritura_Byte(GLCD_LEFT,0x40);  
  23.         vGLCD_Escritura_Byte(GLCD_RIGHT,0x40);
  24.         vGLCD_Escritura_Byte(GLCD_LEFT,0xB8);  
  25.         vGLCD_Escritura_Byte(GLCD_RIGHT,0xB8);
  26.  
  27.         if(Modo==ON){
  28.                 vGLCD_Escritura_Byte(GLCD_LEFT,  0x3F);
  29.                 vGLCD_Escritura_Byte(GLCD_RIGHT, 0x3F);
  30.         }else{
  31.                 vGLCD_Escritura_Byte(GLCD_LEFT,  0x3E);
  32.                 vGLCD_Escritura_Byte(GLCD_RIGHT, 0x3E);
  33.         }
  34.  
  35.    vGLCD_PintarPantalla(OFF);
  36. }

Y por ahora va joya  :?
No contesto mensajes privados, las consultas en el foro

Desconectado jaalm741

  • PIC10
  • *
  • Mensajes: 10
Re: lcd serial ks0108 128 x 64 winstar + pic 18f4550 + bootloader
« Respuesta #6 en: 22 de Septiembre de 2010, 17:19:44 »
Gracias Suky por el codigo lo pruebo y despues te cuento.

Desconectado jaalm741

  • PIC10
  • *
  • Mensajes: 10
Re: lcd serial ks0108 128 x 64 winstar + pic 18f4550 + bootloader
« Respuesta #7 en: 28 de Septiembre de 2010, 22:24:09 »
Probe la inicializacion que vos usas y no pasa nada mi lcd  no reacciona, creo que es un problema de hardware, espero no haber quemado el lcd. Tambien probe el lcd por puerto paralelo y no pasa nada. :5]  :?
             
« Última modificación: 28 de Septiembre de 2010, 22:41:09 por jaalm741 »


 

anything