Autor Tema: CONFIGURAR TECLADO 4X4 CON KBD2.C  (Leído 18628 veces)

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

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
CONFIGURAR TECLADO 4X4 CON KBD2.C
« en: 22 de Junio de 2009, 18:18:19 »
hola les comento que estoy teniendo un problema con el codigo o la conexion del teclado que aparese en proteus 4x4. por ejemplo presiono el 1 y me aroja cualquier otro valor y eso me pasa con todos los numeros, osea al momento de preionar el numero que corresponde me arrija cualquier otra cosa, buno espero que me puedan ayudar grax les dejo el codigo.
a bueno estoy usando l pic 16f877a y estoy trabajando en c con el compilador ccs c

#include <16F877a.h>
#device adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=20000000) //Fosc=20Mhz
#include<kbd2.c> //libreria manejo keypad
#define use_portb_kbd TRUE
#define use_portd_lcd TRUE //definir salida del puerto D para la lcd
#include<lcd.c> //libreria manejo lcd
#use fast_io(B)

///PROGRAMA
void main(void)
{   
char c;   //tabla y variable definida
int j;

lcd_init();         //inicializa lcd

port_b_pullups(TRUE);   //necesario para teclado
while(TRUE){

  c=kbd_getc();
  j=c;
  printf(lcd_putc,"tecla:%i",j );                  //...presentacion
  lcd_gotoxy(1,1);
 
  }     
}



Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #1 en: 22 de Junio de 2009, 18:24:31 »
por que no trabajas la Lcd y el Teclado juntos ?¿

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #2 en: 22 de Junio de 2009, 18:38:50 »

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #3 en: 22 de Junio de 2009, 18:58:00 »
no puedo trabajar las dos cosas juntas si la LCD no tiene problemas, me funciona bien pero es el teclado el que me esta dando problemas..

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #4 en: 22 de Junio de 2009, 19:12:17 »
no puedo trabajar las dos cosas juntas si la LCD no tiene problemas, me funciona bien pero es el teclado el que me esta dando problemas..

Yo  te lo comentaba por que asi Ahorras puertos xD

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #5 en: 22 de Junio de 2009, 19:25:29 »
hola darckkhronos bueno te comento que para poder trabajar si no me equivoco con las dos cosas osea lcd y teclado nessito una parte del puerto A y ese puerto lo tengo ocupado si se puede de otra manera..... no me la se XD saludos.. por eso teno que hacer que trabajen en forma independiente.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #6 en: 22 de Junio de 2009, 23:53:35 »
hola bueno te comento que ya pude hacer funcionar el teclado 4x4 en el puerto b y la lcd en el puerdo d, pero ahora tengo una duda grande y grave >:O  es que como puedo un numero de mas de dos sifras, me explico supongamos que quiero escrivir el numero 15 y que este se vea reflejado en pantalla ???

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #7 en: 23 de Junio de 2009, 00:18:43 »
Vas guardando el numero en un buffer y luego muestras el string.
El papel lo aguanta todo

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #8 en: 24 de Junio de 2009, 17:02:59 »
hola otra vez, mmmm e estado intentando hacer funcionar el teclado con la lcd pero esta e 20x4 y no me funciona perolo raro es que si la cambio a una 16x2 me funciona impeque, e estado tratando de hacer el teclado denuevo y no puedo, si me pudieran echar una ayudadita pliss ya sea como activar la lcd 20x4 en el puerto D del pic o activar el teclado 4x4 en el puerto D, o como dijo darck_khronos  todo en el puerto B pero sin que ocupe el puerto A y C que ya los tengo ocupados, bueno espero que me puedan ayudar saludos a to2s

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #9 en: 24 de Junio de 2009, 17:13:39 »
a lo otro se me olvidava e estado asiendo un codigo para rastrear el boton delteclado pero este solo me la primera columna. por ejemplo estoy en la fila 1 y columna 1, este me arroja un 1 eso esta bien, pero cuando cambia a la fila 2 y columna 1 aun asi me arroja el 1, y me pasa lo mismo con las demas filas, y bueno las columnas igual solo que al cambiar de columna osea columna1 me cambia al valor de la primera fila y se repite este valor para las demas filas, bueno y lo demas pasa lo mismo, aver si tambien me pueden ayudar con el codigo, o cualquier de las tres cosas que e pedido que me ayuden.

Código: [Seleccionar]
#include <16F877a.h>
#device adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=20000000) //Fosc=20Mhz
#define use_portb_lcd TRUE //definir salida del puerto B para la lcd
#include<lcd.c> //libreria manejo lcd
#use standard_io(D)


///PROGRAMA
void main(void)
{   
int j;

lcd_init();         //inicializa lcd

While(TRUE){


SET_TRIS_D( 0xF1 );
delay_ms(60);
SET_TRIS_D( 0xF2 );
delay_ms(60);
SET_TRIS_D( 0xF4 );
delay_ms(60);
SET_TRIS_D( 0xF8 );
delay_ms(60);

if(input(PIN_D4)){  //¿se ha pulsado el boton?
j=1;}
if(input(PIN_D5)){                //¿se ha pulsado el boton?
j=2;}
if(input(PIN_D6)){               //¿se ha pulsado el boton?
j=3;}
if(input(PIN_D7)){               //¿se ha pulsado el boton?
j=4;}

printf(lcd_putc,"tecla:%i",j );                  //...presentacion
  lcd_gotoxy(1,1);
  }     
}



Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #10 en: 24 de Junio de 2009, 18:03:18 »
Esta sería una rutina sencilla para detectar la tecla pulsada:

Código: C
  1. #use fast_io(b);
  2.  
  3. // Por ejemplo teclado de calculadora del Proteus.
  4. char Teclas[17]={'7','8','9','/',
  5.                  '4','5','6','x',
  6.                  '1','2','3','-',
  7.                  '.','0','=','+',' '};
  8.  
  9. int TestTeclado(void){
  10.    int i,j,Filas;
  11.    Filas=0x0E; //xxxx1110.
  12.    output_b(Filas);
  13.    i=0;
  14.    for(j=0;j<4;j++){
  15.       if(input(PIN_B4)==0){break;}
  16.       i++;
  17.       if(input(PIN_B5)==0){break;}
  18.       i++;
  19.       if(input(PIN_B6)==0){break;}
  20.       i++;
  21.       if(input(PIN_B7)==0){break;}
  22.       i++;
  23.       rotate_left(&Filas,1);
  24.       output_b(Filas);   //Trasladamos el 0 a siguiente Pin.
  25.    }
  26.    output_b(0x00); // Se puede usar interrupción por RB4-RB7, y con esto queda
  27.                    // en espera de una proxima interrupcion.-
  28.    return(Teclas[i]);
  29. }
  30.  
  31. ///PROGRAMA
  32. void main(void){
  33.    set_tris_b(0xF0);//eeeessss.-
  34. .
  35. .
  36. .
  37. }
No contesto mensajes privados, las consultas en el foro

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #11 en: 25 de Junio de 2009, 02:35:53 »
holaaaaaaaaaaaaaaaa maestro como va e (suky) ???. que bueno tenerte por estos lados jijijijij. e echo lo que me dijiste pero ahora tengo un problema con el varrido, deveria ser 1000  01000  0010  0001 y de ahy empiesa denuevo siento esto en el puerto d desde RD0 a RD3 y  de RD4 a RD7 todos en 1111 con resistensia pull up. si es que no estoy mal, pero la linea rotate_left(&Filas,1);
output_d(Filas);   //Trasladamos el 0 a siguiente Pin.
no me hace lo que mensiono. maesto por favor nesesito de su saviduria alimentame de esos buenos pensamientos plisssssssssss jijijij, como dije tiene que ser en el puerto d. bueno dejo el codigo nuevamente y la foto de proteus. salu2.

Código: [Seleccionar]
#include <16F877a.h>
#device adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=20000000) //Fosc=20Mhz
#define use_portb_lcd TRUE //definir salida del puerto B para la lcd
#include<lcd.c> //libreria manejo lcd
#use standard_io(D)


///PROGRAMA
void main(void)
{   
int i,j,filas;
char Keypad[4][4] = { {'1','2','3','A'},
                      {'4','5','6','B'},
                      {'7','8','9','C'},
                      {'E','0','F','D'} };
lcd_init();         //inicializa lcd
filas=0xF1;
output_d(filas );
While(TRUE){

for(i=0;i<5;i++){
rotate_left(&Filas,1);
output_d(Filas);   //Trasladamos el 0 a siguiente Pin.

if(!input(PIN_D4)){  //¿se ha pulsado el boton?
j=1;}
if(!input(PIN_D5)){                //¿se ha pulsado el boton?
j=2;}
if(!input(PIN_D6)){               //¿se ha pulsado el boton?
j=3;}
if(!input(PIN_D7)){               //¿se ha pulsado el boton?
j=4;}
if(i==5){i=0;}
}
printf(lcd_putc,"tecla:%c",Keypad[j][i] );                  //...presentacion
  lcd_gotoxy(1,1);
  }     
}


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #12 en: 25 de Junio de 2009, 03:04:39 »
Es que tiene que ser exactamente al revés. Los pines RD4 a RD7 como entradas, que con las resistencias pull-up en estado normal estarán a uno lógico. Y si en los pines RD0 a RD3 vamos rotando el cero, ósea 0111, 1011, 1101 y 1110; al pulsarse un botón deberíamos detectar que unos de los pines de RD4 a RD7 a pasado a nivel bajo y de esa manera detectar la tecla pulsada.

Y en el código me equivoque, hay que reemplazar rotate_left(&Filas,1); por shift_left(&Filas,1,1); para que haga lo comentado. :wink:
No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #13 en: 25 de Junio de 2009, 03:39:04 »
También es cierto que el caso que propones debería funcionar  :mrgreen:

Código: C
  1. int TestTeclado(void){
  2.    int i,j,Filas;
  3.    Filas=0x01; //xxxx0001.
  4.    output_d(Filas);
  5.    i=0;
  6.    for(j=0;j<4;j++){
  7.       if(input(PIN_D4)==1){break;}
  8.       i++;
  9.       if(input(PIN_D5)==1){break;}
  10.       i++;
  11.       if(input(PIN_D6)==1){break;}
  12.       i++;
  13.       if(input(PIN_D7)==1){break;}
  14.       i++;
  15.       shift_left(&Filas,1,0);
  16.       output_b(Filas);   //Trasladamos el 1 a siguiente Pin.
  17.    }
  18.    return(Teclas[i]);
  19. }

No te olvides de break, para así salir del for al detectar la tecla presionada.
No contesto mensajes privados, las consultas en el foro

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
« Respuesta #14 en: 26 de Junio de 2009, 18:44:26 »
hola gracias por la ayuda a todos pero en fin ise un programita que funciona bien a pesar que es un poco tosco pero me funciona,
todo esto es para usar un teclado 4x4 en el puerto D del pic, bueno si le hacen mejoras me disen XD pero en fin a qui se los dejo.

Código: [Seleccionar]
#include <16F877a.h>
#device adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=20000000) //Fosc=20Mhz
#define use_portb_lcd TRUE //definir salida del puerto B para la lcd
#include<lcd.c> //libreria manejo lcd
#use standard_io(D)

int i,j,x;
char Teclas[4][4]={{'1','2','3','A'}
                   {'4','5','6','B'}
                   {'7','8','9','C'}
                   {'D','0','E','F'}};
void main(){
lcd_init();         //inicializa lcd

while(TRUE){
i++;
switch( i )
{
case 1:
output_high(PIN_D4);     
output_high(PIN_D5);
output_high(PIN_D6);
output_low(PIN_D7);

break;
case 2:
output_high(PIN_D4);     
output_high(PIN_D5);
output_low(PIN_D6);
output_high(PIN_D7);

break;
case 3:
output_high(PIN_D4);     
output_low(PIN_D5);
output_high(PIN_D6);
output_high(PIN_D7);

break;
case 4:
output_low(PIN_D4);     
output_high(PIN_D5);
output_high(PIN_D6);
output_high(PIN_D7);

break;
case 5:
break;
default:
}
if(i==5){i=0;}
if(!input(PIN_D0)){j=0;x=i;}
if(!input(PIN_D1)){j=1;x=i;}
if(!input(PIN_D2)){j=2;x=i;}
if(!input(PIN_D3)){j=3;x=i;}
printf(lcd_putc,"tecla:%c",Teclas[j][x]);                  //...presentacion
lcd_gotoxy(1,1);
}}

espero que les sea util en algun momento chao que esten bn.... bueno y como dije cualquier mejora que le agan me dicen nomas para probarlo OK jijijijiji a y les dejo el proteus + el C + el hex..