# Envio y recepción de datos con dos lcd y dos pics 16f877



## vjap55 (Nov 14, 2014)

Saludos amigos, mi pregunta va directo al grano, cual es el comando en mickro C, para enviar un mensaje cuando este este listo, me explico teno un programa que con 2 lcd estas envie y reciven datos siul=taneamente, pero quiero que solo envie cuando le de al enter me explico, ? adjunto dejo el programa..... ...




```
unsigned short rec,kp, cnt, oldstate = 0;
char txt[6];

// Keypad module connections
char  keypadPort at PORTD;
// End Keypad module connections

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

void main() {
  cnt = 0;                                 // Reset counter
  Keypad_Init();                           // Initialize Keypad

  Lcd_Init();                              // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);                     // Clear display
  UART1_Init(9600);               // Initialize UART module at 9600 bps
  Delay_ms(100);
  //Lcd_Cmd(_LCD_CURSOR_OFF);                // Cursor off
  //Lcd_Out(1, 1, "1");
  //Lcd_Out(1, 2, "Key  :");                 // Write message text on LCD
  //Lcd_Out(2, 1, "Times:");

  do {
    kp = 0;                                // Reset key code variable
    rec=0;
    // Wait for key to be pressed and released
    do{
      // kp = Keypad_Key_Press();          // Store key code in kp variable
      kp = Keypad_Key_Click();
      if (UART1_Data_Ready()) {     // If data is received,
          kp= UART1_Read();     // read the received data,
          rec=1;
      //UART1_Write(uart_rd);       // and send data via UART
    }
             // Store key code in kp variable
       }
    while (!kp);
    if (rec!=1)
     UART1_Write(kp);
     
     rec=0;
   // Prepare value for output, transform key to it's ASCII value
    switch (kp) {
      //case 10: kp = 42; break;  // '*'   // Uncomment this block for keypad4x3
      //case 11: kp = 48; break;  // '0'
      //case 12: kp = 35; break;  // '#'
      //default: kp += 48;

      case  1: kp = 55; break; // 7        // Uncomment this block for keypad4x4
      case  2: kp = 50; break; // 2
      case  3: kp = 51; break; // 3
      case  4: kp = 65; break; // A
      case  5: kp = 50; break; // 4
      case  6: kp = 53; break; // 5
      case  7: kp = 54; break; // 6
      case  8: kp = 66; break; // B
      case  9: kp = 55; break; // 7
      case 10: kp = 56; break; // 8
      case 11: kp = 57; break; // 9
      case 12: kp = 67; break; // C
      case 13: kp = 47; break; // *
      case 14: kp = 48; break; // 0
      case 15: kp = 35; break; // #
      case 16: kp = 68; break; // D

    }

    if (kp != oldstate) {                  // Pressed key differs from previous
      cnt = 1;
      oldstate = kp;
      }
    else {                                 // Pressed key is same as previous
      cnt++;
      }
    if (kp==55){
       if (cnt==1){
        kp=42;                             //A
        }
       if (cnt==2){
        kp=43;                             //B
        }
       if (cnt==3){
        kp=44;                             //C
        }
    }
    if (kp==50){
       if (cnt==1){
        kp=65;                             //A
        }
       if (cnt==2){
        kp=66;                             //B
        }
       if (cnt==3){
        kp=67;                             //C
        }
    }
    Lcd_Chr_cp(kp);                    // Print key ASCII value on LCD

    if (cnt == 4) {                      // If counter varialble overflow
      cnt = 0;
      //Lcd_Out(2, 10, "   ");
      }

    WordToStr(cnt, txt);                   // Transform counter value to string
    //Lcd_Out(2, 10, txt);                   // Display counter value on LCD
  } while (1);
}
```


----------



## D@rkbytes (Nov 16, 2014)

vjap55 dijo:


> Saludos amigos, mi pregunta va directo al grano, cual es el comando en mickro C, para enviar un mensaje cuando este este listo, me explico teno un programa que con 2 lcd estas envie y reciven datos siul=taneamente, pero quiero que solo envie cuando le de al enter me explico, ?


A ver, yo no te entendí nada.
Comando para cuando algo esté listo, no hay. Eso lo determinas tú en el programa.
¿Qué cosa vendría siendo el "Enter"?

Veo que el código que pones, es el ejemplo modificado de mikroC para el uso de un teclado matricial 4x4.
¿Podrías explicar mejor qué es lo que quieres hacer?


----------



## vjap55 (Nov 16, 2014)

ok disculpa por no explicarme bien, la cosa es la siguiente: este codigo va  a ir cargado a dse PICs, este codigo se encarga de que al escribir algo en el teclado matricial  aparezca en la LCD que esta conectada a otro pic, en total hay dos pics y 2 lcd, lo que quiero es que cuando escriba algo en una lcd no aparezca directamente en la otra, sino que habilite un boton "como un enter o algo asi" para que cuando el mensaje este listo este se envie , adjuntare el archivo en proteus para que se vea mejor...

aqui esta el comprimido con el archivo en proteus y mickroc


----------



## D@rkbytes (Nov 16, 2014)

Bueno, para empezar necesitas escribir dos códigos, uno para el PIC transmisor y otro para el PIC receptor.
No debes cargar el mismo código a los dos microcontroladores porque ambos harían lo mismo.

Para el transmisor, tendrías que realizar dos bucles, uno que incremente un contador para X caracteres ingresados y que al cumplirse el conteo pase al segundo bucle donde se compruebe que se ha presionado X tecla para que hagas el envió.
El valor de las teclas lo guardas en un arreglo de X dimensión y en el segundo bucle envías los datos usando un bucle for.

En el receptor, esperas los datos incrementando un contador y los vas almacenando en un arreglo, y cuando el contador llegue a X número, envías los datos recibidos a la pantalla, también usando un bucle for.
Enseguida, limpias el arreglo y regresas el contador a 0.


----------



## vjap55 (Nov 16, 2014)

ok muy buena tu acotación, solo que si debe ser el mismo código, puesto que ambos son emisores y receptores, y ademas de esto no se como establecer un salto de linea cuando la lcd llene los  caracteres...


----------



## D@rkbytes (Nov 16, 2014)

vjap55 dijo:


> Ok. Muy buena tu acotación, sólo que sí debe ser el mismo código, puesto que ambos son emisores y receptores, y además de esto, no sé cómo establecer un salto de línea cuando la lcd llene los  caracteres.


Bien, mira este ejemplo: *Envío de datos a LCD 16x2 con PIC por RS-232 *
Está escrito en PIC C de CCS pero si tienes los conocimientos suficientes, podrás migrar el código a mikroC

Suerte.


----------



## vjap55 (Nov 16, 2014)

mmm, me tomara un poco de tiempo , es que no tengo tanta agilidad con esto , pero muchas gracias


----------



## vjap55 (Nov 21, 2014)

ya tengo casi listo el proyecto, ya envía cuando yo le ordeno (presionando la tecla +), ahora tengo los siguientes inconvenientes: 
1) al momento de enviar se pirde el cursor, como hago para que este se valla a la izquierda ??
2) como hago para que el mensaje recibido se imprima en la segunda fila de la lcd?
3) como limito a la lcd , para que solo imprima los 16 caracteres de cada fila?
4) como borro el mensaje de la lcd?
Adjunto dejo el comprimido


----------



## D@rkbytes (Nov 21, 2014)

vjap55 dijo:


> Ya tengo casi listo el proyecto, ya envía cuando yo le ordeno (presionando la tecla +)
> Ahora tengo los siguientes inconvenientes:
> 1) al momento de enviar se pierde el cursor, ¿cómo hago para que este se vaya a la izquierda?


Revisa los temas de ayuda de mikroC.
Existen éstos comandos:
*_LCD_MOVE_CURSOR_LEFT* (Move cursor left without changing display data RAM)
*_LCD_MOVE_CURSOR_RIGHT* (Move cursor right without changing display data RAM)


vjap55 dijo:


> 2) ¿Cómo hago para que el mensaje recibido se imprima en la segunda fila de la lcd?


Esa parte viene en el código de ejemplo que mencioné anteriormente.

```
// 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;
      }
```
Puedes usar cualquier comando, yo usé el (") Valor ASCII = 34, pero puedes usar el más común (13),
que viene siendo un Retorno de carro, o la tecla "Enter/Intro" del teclado de la PC.


vjap55 dijo:


> 3) ¿Cómo limito a la lcd , para que sólo imprima los 16 caracteres de cada fila?


Esa parte también está dentro del código de ejemplo.

```
// Por si se excede el conteo a mas de 16
      if(char_cnt >= 17){
      char_cnt = 0;
      lcd_putc("\f"); // Borrar la pantalla.
      }
```



vjap55 dijo:


> 4) ¿Cómo borro el mensaje de la lcd?


Otra vez revisa la ayuda de mikroC.


			
				La ayuda de mikroC dijo:
			
		

> Lcd_Cmd(_LCD_CLEAR);


Sólo revisa bien el ejemplo y adapta esas partes de código a la sintaxis de microC o crea algo similar.


----------



## vjap55 (Nov 22, 2014)

Listo...! luego de pasar un buen rato en el código he podido solventar mis inconvenientes, ahora me estoy dando cuenta de algo que no habia notado, al momento de escribir , como hago para delimitar el tiempo de escritura de una letra, es decir que al pulsar una tecla pase un tiempo (2segundos mas o menos) y me permite presionar la misma si que est cambie de valor y se desplace a la siguiente posición, me explico?


----------

