Autor Tema: Problema Teclado matricial con LCD 4 bits  (Leído 2786 veces)

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

Desconectado ppalou

  • PIC10
  • *
  • Mensajes: 36
Problema Teclado matricial con LCD 4 bits
« en: 23 de Febrero de 2005, 12:38:00 »
Buenas,

Tengo un programa que usa el LCD (4 bits de datos, en el high) en el puerto b y quiero conectar el teclado matricial a este mismo puerto b.

Para hacer estas pruebas hago un programa que imprima la tecla que apreto.

Lo que no se es si voy a tener problemas porqué de los 8 bits del puerto b no son todos datos, hay 3 de control (rs, rw y enable) y esto podria provocarme problemas en el LCD.

De hecho lo he probado y lo que me salen son carácteres sin orden alguno cuando pulso alguna tecla, algunos carácteres no son ni de los hexadecimales que posee el teclado.

Gracias por adelantado

Desconectado fenix_jn

  • PIC18
  • ****
  • Mensajes: 418
RE: Problema Teclado matricial con LCD 4 bits
« Respuesta #1 en: 24 de Febrero de 2005, 01:10:00 »
Ok, en primer lugar no nombras que PIC estas usando, supongo q un 16F84 o algo similar,  es necesario q publiques el programa para poder ayudarte, es posible que tengas un problema de inicializacion del LCD o que no estes enviando correctamente los datos al mismo o la rutina que usas para "publicar" el caracter en el teclado tenga algun problema... en fin pueden ser varias cosas, lo mejor es publicar el programa.

Desconectado ppalou

  • PIC10
  • *
  • Mensajes: 36
RE: Problema Teclado matricial con LCD 4 bits
« Respuesta #2 en: 24 de Febrero de 2005, 01:54:00 »
////////////////////////////////////// PREPROCESADO ///////////////////////////////////


#include <16F877.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPUT,NOLVP,NOBROWNOUT

#use fast_io(B)

#include <lcdb.c> //4 bits puerto B
#include <kbd2.c> //puerto B

////////////////////////////////////// PRINCIPAL //////////////////////////////////////

void main()
   {

   char i=0;    

   lcd_init();

   printf(lcd_putc, "%s", "HOLA FEO");

   

   while (TRUE)
      {
      i=kbd_getc(); //retorna 0 si no se ha pulsado tecla
      if(i != 0){
          printf(lcd_putc, "%c", i);
      }

   }

   lcd_gotoxy(1,2);
   printf(lcd_putc, "%s", "FIN");
}

Desconectado tornar

  • PIC18
  • ****
  • Mensajes: 342
RE: Problema Teclado matricial con LCD 4 bits
« Respuesta #3 en: 24 de Febrero de 2005, 02:56:00 »
Hola ppalou, supongo q las librerias para el teclado y el lcd han sido modificadas correctamente. De todas formas, no estoy seguro de q con solo la puerta B, vayas a tener suficiente para el LCD y el teclado, el LCD consume bastantes lineas el solito, pq como tu dices tambien tiene 3 señales de control. Quizas lo mejor seria usar alguna linea de E/S de alguna otra puerta, digo yo que de las 40 patitas que tiene el PIC16F877, alguna mas te sobrara, no?

Ademas, ten en cuenta que al usar fast_io, estas obligando al compilador, a q no reprograme la puerta b, como entrada o salida, en caso de que sea necesario, asi que si usas por ejemplo RB3 para teclado y LCD, creo q te podria dar algun problema.

Desconectado ppalou

  • PIC10
  • *
  • Mensajes: 36
RE: Problema Teclado matricial con LCD 4 bits
« Respuesta #4 en: 24 de Febrero de 2005, 04:00:00 »
Escrito originalmente por tornar
Hola ppalou, supongo q las librerias para el teclado y el lcd han sido modificadas correctamente. De todas formas, no estoy seguro de q con solo la puerta B, vayas a tener suficiente para el LCD y el teclado, el LCD consume bastantes lineas el solito, pq como tu dices tambien tiene 3 señales de control. Quizas lo mejor seria usar alguna linea de E/S de alguna otra puerta, digo yo que de las 40 patitas que tiene el PIC16F877, alguna mas te sobrara, no?



Sí, puedo hacerlo como dices, pero la libreria que uso (y la del ccs) estan hechas para 4 bits de datos. Teneis alguna para 8 bits que funcione bien?
Lo digo porqué sí que si he visto que la gente usa son 8 bits para los datos (en el puerto b) compartiendo con el teclado y luego los bits de control en otro puerto.

Escrito originalmente por tornar

Ademas, ten en cuenta que al usar fast_io, estas obligando al compilador, a q no reprograme la puerta b, como entrada o salida, en caso de que sea necesario, asi que si usas por ejemplo RB3 para teclado y LCD, creo q te podria dar algun problema.



Mmmm como es esto del fast_io? que no te acabo de entender. Lo puse porqué lo he visto en varios ejemplos.

Desconectado fenix_jn

  • PIC18
  • ****
  • Mensajes: 418
RE: Problema Teclado matricial con LCD 4 bits
« Respuesta #5 en: 24 de Febrero de 2005, 13:08:00 »
Efectivamente, parece que tienes un problema con los puertos, seria mejor mover el teclado o el LCD a otro puerto y prueba como keda.

Podrias enviarme esa libreria para LCD de 4 bits??

Desconectado ppalou

  • PIC10
  • *
  • Mensajes: 36
RE: Problema Teclado matricial con LCD 4 bits
« Respuesta #6 en: 25 de Febrero de 2005, 01:21:00 »
Escrito originalmente por fenix_jn
Efectivamente, parece que tienes un problema con los puertos, seria mejor mover el teclado o el LCD a otro puerto y prueba como keda.

Podrias enviarme esa libreria para LCD de 4 bits??


La probé de modificar para que funcionara en el puerto d pero no me funcionó.

Claro, te la pego aquí:

//*************************************************************************

// LCD para 2 líneas (2*16)
// Rutina de CCS original lcd.c retocada con los bits de control en:
// PORTB: RB0=RS,RB1=RW,RB2=E RB4=D4,RB5=D5,RB6=D6,RB7=D7

//*************************************************************************

#define use_portb_lcd true

struct lcd_pin_map { // This structure is overlayed
boolean rs; //enable en CCS // on to an I/O port to gain
boolean rw; //rs en CCS // access to the LCD pins.
boolean enable; //rw en CCS // The bits are allocated from
boolean unused; // low order up. ENABLE will
int data : 4; // be pin B0.
} lcd;

#byte lcd = 6

#define set_tris_lcd(x) set_tris_b(x)


#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the second line


byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};

STRUCT lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
STRUCT lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in


byte lcd_read_byte() {
byte low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
}


void lcd_send_nibble( byte n ) {
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}


void lcd_send_byte( byte address, byte n ) {

lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}


void lcd_gotoxy( byte x, byte y) {
byte address;

if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}

void lcd_putc( char c) {
switch (c) {
case "f" : lcd_send_byte(0,1);
delay_ms(2);
break;
case "
" : lcd_gotoxy(1,2); break;
case "" : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}

char lcd_getc( byte x, byte y) {
char value;

lcd_gotoxy(x,y);
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}


void lcd_init() {
byte i;
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING);
}

Desconectado tornar

  • PIC18
  • ****
  • Mensajes: 342
RE: Problema Teclado matricial con LCD 4 bits
« Respuesta #7 en: 25 de Febrero de 2005, 04:11:00 »
fast_io, sirve para que el compilador no te vuelva a reprogramar las puertas de E/S cada vez que uses sentencias tales como output_bit, o input(PIN_A0), etc. repercutiendo en una mayor velocidad de ejecucion, al haber menos sentencias que ejecutar. Pero si usas fast_io, deberas ser cuidadoso a la hora de usar set_tris_a, set_tris_b, etc. para establecer las patitas de cada puerta como entrada o salida, ya que de lo contrario tendras problemas.

Yo en tu caso, que usas librerias, que no creo q hayas estudiado completamente para ver si hay problemas con lo que te acabo de decir, no usaria fast_io.

Espero que haya quedado claro, un saludo.

Desconectado ppalou

  • PIC10
  • *
  • Mensajes: 36
RE: Problema Teclado matricial con LCD 4 bits
« Respuesta #8 en: 25 de Febrero de 2005, 04:21:00 »
Escrito originalmente por tornar
fast_io, sirve para que el compilador no te vuelva a reprogramar las puertas de E/S cada vez que uses sentencias tales como output_bit, o input(PIN_A0), etc. repercutiendo en una mayor velocidad de ejecucion, al haber menos sentencias que ejecutar. Pero si usas fast_io, deberas ser cuidadoso a la hora de usar set_tris_a, set_tris_b, etc. para establecer las patitas de cada puerta como entrada o salida, ya que de lo contrario tendras problemas.

Yo en tu caso, que usas librerias, que no creo q hayas estudiado completamente para ver si hay problemas con lo que te acabo de decir, no usaria fast_io.

Espero que haya quedado claro, un saludo.


Gracias,

lo he probado sin fast_io y la cosa mejora bastante, lo que me "pinta" el LCD es bastantes veces la tecla que pulso, sobretodo las primeras veces pero no se porqué me pinta espacios en blanco y a veces carácteres raros (quiero dejar claro que el LCD sólo me funciona perfectamente, es en combinación con el teclado que tiene un funcionamiento extraño).

Desconectado tornar

  • PIC18
  • ****
  • Mensajes: 342
RE: Problema Teclado matricial con LCD 4 bits
« Respuesta #9 en: 25 de Febrero de 2005, 04:58:00 »
Pues lo unico que te puedo sugerir, es que si sigues teniendo el mismo problema, postees aki el codigo y veremos lo que podemos hacer, porque si ya te escribe la tecla que pulsas, pero te la escribe varias veces, parece ser que el problema puede venir del codigo del programa principal.

Desconectado ppalou

  • PIC10
  • *
  • Mensajes: 36
RE: Problema Teclado matricial con LCD 4 bits
« Respuesta #10 en: 25 de Febrero de 2005, 06:00:00 »
Ok, os pasteo el programa principal:

char i,tecla;

void main()
   {

   lcd_init();

   printf(lcd_putc, "%s", "INICIO");

   i=0;
   tecla=0;
   
   while (TRUE)
      {
      i=kbd_getc();
     
      if ((i==0)&&(tecla!=0)){ //ENTRA CUANDO HAS DEJADO DE APRETAR
         printf(lcd_putc, "%c", tecla);
         tecla=0;
      }        
      if (i!=0){
         tecla=i;
      }      
     
   }

   lcd_gotoxy(1,2);
   printf(lcd_putc, "%s", "FIN");
}

Desconectado tornar

  • PIC18
  • ****
  • Mensajes: 342
RE: Problema Teclado matricial con LCD 4 bits
« Respuesta #11 en: 25 de Febrero de 2005, 08:49:00 »
Prueba a ver si te funciona con este codigo..supongo q es un LCD de solo una linea.


main()
{
  int x=1
  char k;

  lcd_init();   

  while(1)
  {
    k = kbd_getc();
    if(k != 0 )
     {
        lcd_gotoxy(x,0);
        lcd_putc(k);
        x++;
        if(x>16)     //16 o el numero de caracteres maximo que admita el LCD
        {
          x=1;
         }
     }

 }