TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: japifer_22 en 22 de Junio de 2009, 18:18:19

Título: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: japifer_22 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);
 
  }     
}


Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: darck_khronos en 22 de Junio de 2009, 18:24:31
por que no trabajas la Lcd y el Teclado juntos ?¿
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: darck_khronos en 22 de Junio de 2009, 18:38:50
(http://img14.imageshack.us/img14/9154/sshot34.png)
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: japifer_22 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..
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: darck_khronos 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
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: japifer_22 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.
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: japifer_22 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 ???
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: MLO__ en 23 de Junio de 2009, 00:18:43
Vas guardando el numero en un buffer y luego muestras el string.
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: japifer_22 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
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: japifer_22 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);
  }     
}


(http://C:\Documents and Settings\Administrator\My Documents\My Pictures\4x4.JPG)
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: Suky 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. }
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: japifer_22 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);
  }     
}

Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: Suky 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:
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: Suky 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.
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: japifer_22 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..
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: japifer_22 en 28 de Junio de 2009, 16:29:52
hola estaba pensado,..... como ago para formar un valor de dos o mas digitos con la keypad, o por ejemplo con decimal, me refiero a que como ago por ejemplo el numero 10.5 con la keypad y que aparesca en la lcd ese numero, si solo yo pulso el 1 el 0 el . y el 5 como uno todo eso para formar un numero nomas ???????.
salu2s
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: Rodricity en 01 de Julio de 2009, 17:02:01
 unsigned long varibale;

 variable = (variable * 10) + leer_teclado();

 Sorry si no te sirve algo tan tonto pero elemental, es que yo no trabajo en CCS; yo trabajo en hitech PICC; y como no tiene librerias, hice una funcion yo mismo que me retorna el valor de la tecla pulsada.

 te adjunto la "libreria" que hice por si te sirve de algo.

Código: [Seleccionar]
char leer_teclado(void)
{
while(1)
{
PORTB = 0b0001<<4;
if(columna1){ while(columna1); return '1';}
if(columna2){ while(columna2); return '2';}
if(columna3){ while(columna3); return '3';}
if(columna4){ while(columna4); return 'A';}
PORTB = 0b0010<<4;
if(columna1){ while(columna1); return '4';}
if(columna2){ while(columna2); return '5';}
if(columna3){ while(columna3); return '6';}
if(columna4){ while(columna4); return 'B';}
PORTB = 0b0100<<4;
if(columna1){ while(columna1); return '7';}
if(columna2){ while(columna2); return '8';}
if(columna3){ while(columna3); return '9';}
if(columna4){ while(columna4); return 'C';}
PORTB = 0b1000<<4;
if(columna1){ while(columna1); return '*';}
if(columna2){ while(columna2); return '0';}
if(columna3){ while(columna3); return '#';}
if(columna4){ while(columna4); return 'D';}
}
return 0;
}

 PD: El PORTB<<4 es por que los bits que energizan las filas del teclado están en el nibble mas alto de PORTB.

 En todo caso, yo te sugeriría leer el teclado por ADC, y el LCD controlarlo con un registro de desplazamiento, como el 4094, asi controlas el LCD por 3 pines, y el teclado por uno, en vez de 19231823 pines.
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: japifer_22 en 01 de Julio de 2009, 22:26:30
hola rodricity bueno gracias por la respuesta pero te comento que ya tengo solucionado el problema. pero de todas formas gracias
lo que hice fue ocupar la libreria keypad y sacarla mediante interrupciones esta misma, y luego hice una pequeñisima funcion matematica para detectar que numero era el presionado el cual es la siguiete
int a;
a=key-48; y listo dondeel 48 equivale al 0 en acsii
hay tengo el valor de la tecla pulsada y sin nesesidad de andar cambiando de char a float y esas cosas.
saludo.

key= es el valor que toma al presionar una tecla,
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: Rodricity en 02 de Julio de 2009, 11:06:28
 pero si eso es elemental hombre XD
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: japifer_22 en 04 de Julio de 2009, 20:20:16
hola otra vez, bueno ahora tengo un drama, no se como incrementar una variable en 1 cuando se pulse un boton en la keypad, e probado con una bariable a++ puesta en ia interrupcion int_RB, pero esta me incrementa en dos y yo solo nesesito que incremete en una y solo cuando pulse un tecla es codigo se los dejo aqui, espero que me puedan ayudar..............

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_portd_lcd TRUE //definir salida del puerto D para la lcd
#include<lcd420.c> //libreria manejo lcd
#include <keypad.c>   //Libreria de teclado 4x4
#include <stdlib.h>

unsigned char key;   //Variable global tecla
char variable;
int i;
// Interrupcion RB4 - RB7 /////////////////////////////////////////////////////
#INT_RB
void interrupt_keypad()               
{
   key=read_keypad();         //Asigna la tecla pulsada
   clear_interrupt(INT_RB);   //Limpia bandera RBIF

}
// Programa Principal /////////////////////////////////////////////////////////
void main()
{   
lcd_init();
while(true)
   {
   init_keypad();
   variable=key;
   if(variable>=48){
   i=variable-48;}
   printf(lcd_putc,"Escriba:%i",i);
   lcd_gotoxy(1,1);
}}
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: japifer_22 en 04 de Julio de 2009, 22:14:36
hola bueno despues de un par de horas esperimentado la solucion la tenia adelante de mis ojos y no la veia jajaajaj pero bueno que se le va hacer  es if(key==read_keypad()){a++;}.
saludos que esten bien
Título: Re: CONFIGURAR TECLADO 4X4 CON KBD2.C
Publicado por: japifer_22 en 05 de Julio de 2009, 01:23:23
............