Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

14/11/2014 #1


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

---------- Actualizado después de 5 minutos ----------

Código:
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);
}
16/11/2014 #2
Moderador

Avatar de D@rkbytes

vjap55 dijo: Ver Mensaje
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?
16/11/2014 #3


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
Archivos Adjuntos
Tipo de Archivo: zip pactica3b.zip (30,6 KB (Kilobytes), 2 visitas)
16/11/2014 #4
Moderador

Avatar de D@rkbytes

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.
16/11/2014 #5


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...
16/11/2014 #6
Moderador

Avatar de D@rkbytes

vjap55 dijo: Ver Mensaje
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.
16/11/2014 #7


mmm, me tomara un poco de tiempo , es que no tengo tanta agilidad con esto , pero muchas gracias
21/11/2014 #8


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
Archivos Adjuntos
Tipo de Archivo: zip pactica3b.zip (88,4 KB (Kilobytes), 3 visitas)
21/11/2014 #9
Moderador

Avatar de D@rkbytes

vjap55 dijo: Ver Mensaje
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: Ver Mensaje
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.
Código:
      // 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: Ver Mensaje
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.
Código:
      // 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: Ver Mensaje
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.
22/11/2014 #10


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?
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.