Autor Tema: Controlar LCD 16x2 con 2 pics  (Leído 1737 veces)

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

Desconectado Byakuya

  • PIC10
  • *
  • Mensajes: 38
Controlar LCD 16x2 con 2 pics
« en: 23 de Febrero de 2016, 17:21:23 »
Hola amigos del foro, quería consultarles, quiero diseñar un controlador de lcd 16x2, la idea es usar dos micro controladores uno hará el trabajo de esclavo y el otro de maestro, eh pensado que podría implementarse usando protocolo serial y entonces tener el control de la lcd con un solo hilo (TX), o tal ves usando (spi) yo generalmente uso ccs compiler. ayuda comentarios io sugerencias son bien aceptadas.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Controlar LCD 16x2 con 2 pics
« Respuesta #1 en: 23 de Febrero de 2016, 17:40:48 »
Definitivamente la forma mas sencilla es usar un solo hilo con comunicacion serial. Yo te recomiendo eso, por que si necesitas colocar la LCD (dispositivo esclavo) a una distancia considerable, simplemente implementas el RS-485 y listo. Pero no se cual sera tu aplicacion final. Pero lo recalco, usa un solo hilo con comunicacion serial.

Elreypic.

Desconectado Byakuya

  • PIC10
  • *
  • Mensajes: 38
Re:Controlar LCD 16x2 con 2 pics
« Respuesta #2 en: 23 de Febrero de 2016, 17:50:12 »
Gracias por tu respuesta elreypic2, hablando de aplicaciones finales, la idea es poder controlar la lcd de forma serial, hasta el momento escribo sobre la lcd desde el micro master, a una velocidad 9600 bauds, por alli mi problema comienza con la identificación del retorno de carro, o nueva linea, etc, quisiera comandar la lcd desde otro micro cuando mis pines están agotados. y se me ocurre que hacerlo de manera serial es la mejor forma.

Hasta aora digo esto,, estecodigo controla la lcd de forma serial, me echan una mano a control total de la lcd???

Código: [Seleccionar]

#INCLUDE <18F24K50.h>
#FUSES   INTRC_IO,PLLEN,PLL3X,NOCPUDIV,FCMEN,NOIESO,NOPUT,NOBROWNOUT,NOLPBOR,NOWDT
#FUSES   NOMCLR,STVREN,NOLVP,NOXINST,NODEBUG
#FUSES   NOPROTECT,NOCPB,NOCPD,NOWRTC,NOWRTB,NOWRTD,NOEBTRB //DE PROTECCION OR NOT
#USE     DELAY(CLOCK = 48MHZ)

#USE RS232(UART1,BAUD = 9600, PARITY = N, XMIT = PIN_C6, RCV = PIN_C7 ,BITS = 8)

#DEFINE LCD_RS_PIN      PIN_C0                                   
#DEFINE LCD_RW_PIN      PIN_C1                                 
#DEFINE LCD_ENABLE_PIN  PIN_C2
#DEFINE LCD_DATA4       PIN_A0                               
#DEFINE LCD_DATA5       PIN_A1                               
#DEFINE LCD_DATA6       PIN_A2                               
#DEFINE LCD_DATA7       PIN_A3 

#INCLUDE <LCD.c>   

VOID BORRAR(VOID);

UNSIGNED INT8 CHAR_CNT = 0, LINE = 1;

//=============================================//
// DESPLAZA AL DISPLAY (DDRAM NO SE MODIFICA)  //
//=============================================//

VOID LCD_DESPLAZA_DISPLAY(INT1 D_I)
{
 INT8 CODIGO = 0b00011000;
 IF(D_I)                            // D_I = 1, EL CURSOR SE DESPLAZA A LA DERECHA
  CODIGO = CODIGO + 0b00000100;     // D_I = 0, EL CURSOR SE DESPLAZA A LA IZQUIERDA
 LCD_SEND_BYTE(CODIGO,0);
}

//============================================//
// DESPLAZA AL CURSOR (DDRAM NO SE MODIFICA)  //
//============================================//

VOID LCD_DESPLAZA_CURSOR(INT1 D_I)
{
 INT8 CODIGO = 0b00010000;
 IF(D_I)                            // D_I = 1, EL CURSOR SE DESPLAZA A LA DERECHA
  CODIGO = CODIGO + 0b00000100;     // D_I = 0, EL CURSOR SE DESPLAZA A LA IZQUIERDA
  LCD_SEND_BYTE(CODIGO,0);             // EL CURSOR SE DESPLAZA DE LA POSICION 40 DE LA LINEA 1 A LA POSICION 0 DE LA LINEA 2
}


VOID MAIN (VOID)
{
 DELAY_MS(100);
 UNSIGNED INT8 B_DATA=0;
 LCD_INIT();
 LCD_CURSOR_ON(0);
 WHILE(TRUE)
   {                                                // Recibir los caracteres via serial RS2-232
 IF(KBHIT()) {                                   // Si el buffer contiene datos...
     B_DATA = GETCH();                           // Guardar el dato en la variable b_data
     CHAR_CNT++;                               // Se incrementa el contador de caracteres.
     LCD_GOTOXY(CHAR_CNT, LINE);             // Se posiciona el cursor en la pantalla según la línea.
      PRINTF(LCD_PUTC,"%c",B_DATA);       // Se escriben los caracteres.
                                           // Si se recibe el ASCII 8, entonces borrar el último caracter escrito.
     IF(B_DATA == 8) {
       BORRAR();
      }
     
      IF(B_DATA == 13) {      //SI SE RECIBE RETORNO DE CARRO
         CHAR_CNT = 0;
      }
                                       // Por si se excede el conteo a mas de 16
      IF(CHAR_CNT >= 17) {
         CHAR_CNT = 0;                 
         LCD_PUTC("\f");
      }
                                   // Pasar a la línea 1 con el comando !
      IF(B_DATA == 33) {
         CHAR_CNT++;
         BORRAR();
         LINE = 1;
         LCD_GOTOXY(1,1);
         LCD_PUTC("                ");
         CHAR_CNT = 0;
      }
                          // Pasar a la línea 2 con el comando "
      IF(B_DATA == 34) {
         CHAR_CNT++;
         BORRAR();
         LINE = 2;
         LCD_GOTOXY(1,2);
         LCD_PUTC("                ");
         CHAR_CNT = 0;
      }
    }
  }
}

VOID BORRAR(VOID)
{
                  // Rutina para borrar un caracter de la pantalla
   CHAR_CNT--;
   LCD_GOTOXY(CHAR_CNT,LINE);
   LCD_PUTC(" ");
   CHAR_CNT--;
   IF(CHAR_CNT > 16) {
      CHAR_CNT = 0;
   }
}



Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Controlar LCD 16x2 con 2 pics
« Respuesta #3 en: 23 de Febrero de 2016, 18:15:56 »
Que tal Byakuya,

Me imagino que cuando envias el retorno de carro lo haces con "\n". Al hacer eso estas enviando dos bytes, el 13 y el 10 para formar el retorno de carro, y creo que alli el problema ya que en el controlador solo esperas el 13 pero nunca el 10, y el buffer del USART se te desborda.

Elreypic.