# Teclado programado en ccs



## maverick_007 (Mar 11, 2010)

hola asiendo unos experimento con una pantalla lcd y un teclado me encontre con el incombeniente de que no me funcionaba la libreria  KBD.c, intente usar otras que abia encontrado en la red pero tampoco me funciono T_T, asique programe mi propio teclado de 4x4 funciona perfecta mente casi = a como deberia funcionar la libreria original, pero agradeceria si altien tiene una forma mas efectiva de poder realizar este tipo de tareas ( me refiero a manejar el teclado ). dejo aki una foto del sistema en proteus y el programa para que lo revisen si a alguien le interesa ^^.


----------



## picmangeorge (Jul 15, 2010)

Que tal maverick, te comento que yo tambien he tenido problemas con la KBD.C al simular con proteus, he leido por ahi, googleando un poco, que se trata de uno de los tantos bug`s del proteus. La pregunta es ¿alguien sabe la manera de simular el teclado en proteus?, he provado activando las resistencias pull-up internas del pic, tambien colocandole externas, pero nada.
Saludos.


----------



## Rijiru (Ago 11, 2010)

Lo que pasa tambien es que el driver KBD.c es para teclados 4x3, si deseas alterar ese driver tienes que declarar una columna y ademas char const KEYS[4][3], esta decalaracion dice el numero de filas y columnas,es decir char const KEYS [fila][columna], espero y esta info sea de utilidad


----------



## picmangeorge (Ago 14, 2010)

gracias igual, pero solo necesito un teclado de 3x4 ademas solucione el problema que tenia al simular en proteus era las resistencias PULL-UP deben ser componentes y no activar las que trae el pic internamente.
Saludos.


----------



## smg8827 (Ago 19, 2010)

Buenas es que tengo el mismo problema me gustaria saber si lo unico es desactivar el PULLUPS y colocar unas cuantas resistencias muchas graciass


----------



## Rijiru (Ago 20, 2010)

La verdad yo tengo el mismo problema con el driver kbd.c y me tome la libertad de crear una libreria esta esta ubicada para que el teclado sea instalado en el puerto B del PIC, hace el escaneo y ademas si el boton ha sido pulsado captura el caracter y si el boton no se suelta no captura hasta que el boton ha sido abierto, espero y sea de ayuda.
El archivo en TXT solo es cuestion de grabarlo a extencion .c


----------



## loloco (Oct 28, 2010)

hola a Rijiru,

He probado tu librería y todo funciona bien (gracias de verdad), solo que quisiera saber como hacer para que si aun no se suelta el boton siga escaneando el puerto y cuando se suelte regrese un 0.

Gracias.


----------



## Rijiru (Nov 4, 2010)

Te convendria usar la libreria de CCS. 


```
#define use_portb_kbd // comenta esta linea si deseas utilizar puerto D en el teclado
#if defined(__PCH__)
#if defined use_portb_kbd
   #byte kbd = 0xF81                   // This puts the entire structure
#else
   #byte kbd = 0xF83                   // This puts the entire structure
#endif
#else
#if defined use_portb_kbd
   #byte kbd = 6                  // on to port B (at address 6)
#else
   #byte kbd = 8                 // on to port D (at address 8)
#endif
#endif
#if defined use_portb_kbd
   #define set_tris_kbd(x) set_tris_b(x)
#else
   #define set_tris_kbd(x) set_tris_d(x)
#endif
 
//Keypad connection:   (for example column 0 is B2)
//                Bx:
#define COL0 (1 << 0)
#define COL1 (1 << 1)
#define COL2 (1 << 2)
#define COL3 (1 << 3)
#define ROW0 (1 << 4)
#define ROW1 (1 << 5)
#define ROW2 (1 << 6)
#define ROW3 (1 << 7)
#define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)
#define ALL_PINS (ALL_ROWS|COL0|COL1|COL2|COL3)
// Keypad layout:
char const KEYS[4][4] = {{'1','2','3','A'},
                         {'4','5','6','B'},
                         {'7','8','9','C'},
                         {'#','0','*','D'}};
#define KBD_DEBOUNCE_FACTOR 33    // Set this number to apx n/333 where
                                  // n is the number of times you expect
                                  // to call kbd_getc each second

void kbd_init() {
}
char kbd_getc( ) {
   static BYTE kbd_call_count;
   static int1 kbd_down;
   static char last_key;
   static BYTE col;
   BYTE kchar;
   BYTE row;
   kchar='\0';
   if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
       switch (col) {
         case 0   : set_tris_kbd(ALL_PINS&~COL0);
                    kbd=~COL0&ALL_PINS;
                    break;
         case 1   : set_tris_kbd(ALL_PINS&~COL1);
                    kbd=~COL1&ALL_PINS;
                    break;
         case 2   : set_tris_kbd(ALL_PINS&~COL2);
                    kbd=~COL2&ALL_PINS;
                    break;
         case 3   : set_tris_kbd(ALL_PINS&~COL3);
                    kbd=~COL3&ALL_PINS;
                    break;
       }
       if(kbd_down) {
         if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
           kbd_down=FALSE;
           kchar=last_key;
           last_key=0x00; // Aqui se altero el valor si no se pulsa ninguna tecla regresa Cero
         }
       } else {
          if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
             if((kbd & ROW0)==0)
               row=0;
             else if((kbd & ROW1)==0)
               row=1;
             else if((kbd & ROW2)==0)
               row=2;
             else if((kbd & ROW3)==0)
               row=3;
             last_key =KEYS[row][col];
             kbd_down = TRUE;
          } else {
             ++col;
             if(col==4)
               col=0;
          }
       }
      kbd_call_count=0;
   }
  set_tris_kbd(ALL_PINS);
  return(kchar);
}
```
 

esta libreria esta para se utilizada en el puerto B


----------



## loloco (Nov 4, 2010)

Gracias Rijiru,

Te cuento que modifiqué la librería kbd del css, logré hacer lo que comentaba de que cuando presionaras la tecla deseada indicara el número de ella y cuando se soltara mandara "cero", en estos momentos no cuento con ella pero si te interesa la puedo postear en estos días.

El proyecto que estoy realizando se trata de enviar el código de la tecla presionada por medio de un control remoto, recibo el dato de la tecla presionada en un pic18F4550 con un receptor de rf y lo mando por el USB a la pc con una aplicación en Labview, misma que realiza la activación de unos motores de pasos para ser movidos a voluntad, igual si a alguien le puedo ayudar con algo estoy para servirles.

Saludos y gracias.


----------



## mydogshadow (Dic 13, 2010)

picmangeorge dijo:


> Que tal maverick, te comento que yo tambien he tenido problemas con la KBD.C al simular con proteus, he leido por ahi, googleando un poco, que se trata de uno de los tantos bug`s del proteus. La pregunta es ¿alguien sabe la manera de simular el teclado en proteus?, he provado activando las resistencias pull-up internas del pic, tambien colocandole externas, pero nada.
> Saludos.



hola yo estaba tambien con el problema pero me diste la respuesta. se colocan pullups al teclado y descativas las del pic esto solo para simular en la vida real corre bien con las pullups del pic.


----------



## pepechip (Dic 20, 2010)

Hola
La siguiente libreria envia el caracter de la tecla pulsada, pero tiene el inconveniente que el valor de la tecla pulsada me la envia despues de haber soltado el pulsador, y yo necesito que la envie antes.
Tengo muy pocos conocimientos de CCS y no consigo adaptarla a mis necesidades, si alguien pudiera ayudarme aunque solo fuera añadiendo comentarios a la actual libreria para yo poder comprenderla y modificarla me seria de gran ayuda.

Saludos 


```
// Las funciones que contiene la librería son las siguientes:
// 
// void Kbd_init(void); // Inicializa el teclado matricial, esta función hay que llamarla antes de poder usar el teclado. 
// Función que usaremos solo si usamos el puerto B.
// char kbd_getc(void); // Función que retorna el caracter de la tecla pulsada.
// CONDICIONES: Es posible usar cualquier puerto del PIC ya sea el B,C,D..etc, teniendo en cuenta 
// como trabaja la librería. Para que funcione correctamente el teclado tiene que tener conectado las resistencias pull - up
// en las columnas y filas...si usamos el puerto B, esto no es necesario debido a que tiene pull-up internas.
 
#define use_portb_kbd TRUE // Declaramos el uso del puerto B del PIC para conectar nuestro teclado.
#define PUERTO_PIC18 0xF83 // Puerto D. (PODEMOS PONER CUALQUIERA QUE CUMPLA CON LAS CONDICIONES).
 
#if defined(__PCH__) // Si trabajamos con PIC18...
#if defined use_portb_kbd // Si hemos definido el puerto B para trabajar...
#byte kbd = 0xF81 // Dirección PORTB = 0xF81.
#else // Caso contrario...
#byte kbd = PUERTO_PIC18 // Trabajamos con el puerto elejido...
#endif
#endif
#if defined use_portb_kbd // Si hemos definido el puerto B para trabajar...
#define set_tris_kbd(x) set_tris_b(x) // La configuración del teclado se hará según el registro "TRIS" del puerto B.
#else // si no...
#define set_tris_kbd(x) set_tris_d(x) // La configuración del teclado se hará según el registro "TRIS" del puerto elejido.
#endif
 
// Definimos columnas y filas usadas.
// Nota: Cuando dice (1 << 1) , quiere decir PUERTO << PIN DEL PUERTO
// Ejemplo: Si puerto B.... COL0 (PORTB << PIN_B1).
#define COL0 (1 << 1) // Columna 1, puerto B1.
#define COL1 (1 << 2) // Columna 2, puerto B2.
#define COL2 (1 << 3) // Columna 3, puerto B3.
#define ROW0 (1 << 4) // Fila 1, puerto B4.
#define ROW1 (1 << 5) // Fila 1, puerto B5.
#define ROW2 (1 << 6) // Fila 1, puerto B6.
#define ROW3 (1 << 7) // Fila 1, puerto B7.
 
#define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)
#define ALL_PINS (ALL_ROWS|COL0|COL1|COL2)
// Distribución de las teclas.
char const KEYS[4][3] = {{'1','2','3'}, // Es posible poner cualquier caracter disponible...para HID
{'4','5','6'}, // hay que traducir el valor del caracter para ser enviado por USB...
{'7','8','9'}, // Los caracteres "*" y "#" no tenían traducción directa viable...por lo que se implementó 
{'a','0','b'}}; // los caraceres a y b.
#define KBD_DEBOUNCE_FACTOR 5 // Cantidad de iteraciones que se hacen para leer la matriz, está directamente relacionado con la
// velocidad y la estabilidad de datos mostrados. Para la mejor estabilidad/velocidad del teclado
// se ha configurado el valor en 5..(recomendado no cambiarlo).
 
void kbd_init(void){ // Función implementada solo si se usa el puerto B.
port_b_pullups(TRUE); // Activamos las resistencias pull - up del puerto B.
}
// Función que entrega el caracter de la tecla pulsada.
char kbd_getc(void) {
static BYTE kbd_call_count;
static short int kbd_down;
static char last_key;
static BYTE col;
BYTE kchar;
BYTE row;
 
kchar='\0';
if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
switch (col) {
case 0 : set_tris_kbd(ALL_PINS&~COL0);
kbd=~COL0&ALL_PINS;
break;
case 1 : set_tris_kbd(ALL_PINS&~COL1);
kbd=~COL1&ALL_PINS;
break;
case 2 : set_tris_kbd(ALL_PINS&~COL2);
kbd=~COL2&ALL_PINS;
break;
}
if(kbd_down) {
if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
kbd_down=FALSE;
kchar=last_key;
last_key='\0';
}
} else {
if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
if((kbd & ROW0)==0)
row=0;
else if((kbd & ROW1)==0)
row=1;
else if((kbd & ROW2)==0)
row=2;
else if((kbd & ROW3)==0)
row=3;
last_key =KEYS[row][col];
kbd_down = TRUE;
} else {
++col;
if(col==3)
col=0;
}
}
kbd_call_count=0;
}
set_tris_kbd(ALL_PINS);
 
return(kchar);
}
```


----------



## maverick_007 (Ene 6, 2011)

muy buen aporte rijiru yo el problema que tenia lo solucione con lo que postie al inicio, en cuanto tenga tiempo pruebo tu codigo, lamento aver estado tan ausente del hilo no e tenido mucho tiempo libre y e trabajado en unos preyectos que me han tenido ocupado saludos bye.


----------



## Rijiru (Ene 10, 2011)

ya somos dos, to tambien he estado con mucha carga en el trabajo, inclusive aun debo algunos Post, jejeejeje...    pero todo a su tiempo (=


----------



## ivanbv4 (Mar 2, 2011)

Hola muchachos, muy útiles sus aportes. Quisiera hacereles una consulta: ¿alguno ha trabajado con un teclado 4x3 en un 18f4550. Tengo problemas con la simulación y ya probe lo de las pull ups externas. El pin B1 permanece siempre en gris. Creo que el conflico es con la libreria kbd.c o sino algun inconveniente con proteus. Agradeceria cualquier aporte o sugerencia. A continuación adjunto mi código.


```
#include <18F4550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 20000000)        
#define use_portb_lcd TRUE
#define use_portb_kbd TRUE
#include <lcd.c>
#include <kbd.c>

void main() 
 {
   char k; 
   int  x;
  
   lcd_init(); 
   kbd_init();
   port_b_pullups(TRUE); 

   lcd_putc("\fListo...\n");
                                    
   while (TRUE)
    {
      k=kbd_getc(); 
      x=k-48;                             //Conversión numérica
      if(k!=0)
       {
        if(k=='*')  
          lcd_putc('\f'); 
        else
         { lcd_putc(k);             //Imprime carácter
           delay_ms(500);
           printf(lcd_putc,"\f Car=%c",k); //Imprime carácter
           delay_ms(500);
           printf(lcd_putc,"\f Car=%u",k); //Imprime valor ASCII
           delay_ms(500);
           printf(lcd_putc,"\f Num=%u",x); //Imprime valor numérico
           delay_ms(500);
           lcd_putc("\fListo...\n");
         }  
      }
   }
 }
```

tanto el teclado como el lcd se encuentran conectados al puerto b como lo indican las respectivas librerias. Ya vi hacer esto en un 16f88 e incluso arme el circuito.
Les agradeceria su ayuda
Saludos


----------



## COSMICO (May 17, 2011)

Hola amigos.
Tengo un programa con teclado matricial en ccs c; lo que necesito es lo siguiente y no lo he logrado.
debo introducir un numero entero de cinco cifras por el teclado, y capturarlo en una variable.
Ej: si pulso. 2,5,8,3,6, debo guardarlo en la variable, y recuperarlo como un entero
25836 para usarlo como contador en una funcion, por ahí he leido sobre la funcion atoi, pero no se bien como implementarla. Gracias a todos.


----------



## gustavo61709 (Jul 2, 2011)

COSMICO dijo:


> Hola amigos.
> Tengo un programa con teclado matricial en ccs c; lo que necesito es lo siguiente y no lo he logrado.
> debo introducir un numero entero de cinco cifras por el teclado, y capturarlo en una variable.
> Ej: si pulso. 2,5,8,3,6, debo guardarlo en la variable, y recuperarlo como un entero
> 25836 para usarlo como contador en una funcion, por ahí he leido sobre la funcion atoi, pero no se bien como implementarla. Gracias a todos.




amigo lo que tienes que hacer es muy sencillo, solo tienes que multiplpicar por 10000, por 1000
por 100 y por 10  ejemplo

2x10000 + 5x1000 + 8x100 + 3x10 + 6 = 20000+5000 + 800 +30 + 6

si lo que quieres es el caso mas general

almacenamos los numeros en un arreglo para luego convertirlo 
el arreglo debe de ser un int16 para poder almacenar datos mayores a 255

int16 cadena[5];

luego con los datos del teclado almacenados en el arreglo procedemos de la siguiente manera

valor=cadana[0]*10000 + cadana[1]*1000 +cadana[2]*100 + cadana[3]*10 + cadana[4]


----------



## Juanjogc (Jul 2, 2011)

Si modificas el driver original que está escrito para teclados 4x3 y añades un par de líneas de código y modificas la tabla KEYS[4] [3] a KEYS[4][4] te funciona perfectamente. Tienes que tener la precaución de grabar el driver en la carpeta "drivers" del CCS pero con otro nombre que no sea KBD.C para conservar el original.
Esta es una solución más sencilla que ponerte a programar desde cero el teclado.
Un saludo.


----------



## ivanbv4 (Jul 2, 2011)

Muchas Gracias por los aportes


----------



## arias887 (Sep 21, 2011)

loloco dijo:


> Modifiqué la librería kbd del css, logré hacer lo que comentaba de que cuando presionaras la tecla deseada indicara el número de ella y cuando se soltara mandara "cero", en estos momentos no cuento con ella pero si te interesa la puedo postear en estos días.



loloco, porque no la has posteado  ....

Yo tambien necesito que se envie el "dato" al oprimir o al manteber pulsada la tecla, mas nó, despues de soltarla, y que cuando la suelte envie el caracter nulo, osea '\0' asi aparece en esta libreria...

la libreria que estoy uasndo es la "KBD_LIB.C" para un 18F4455 con el teclado 4x4 ubicado en el Puerto B...

Van a notar que inverti los pines de ese puerto para facilidad de ponerlo en prtoboard pero igual funciona...

aca les dejo esa libreria en un .rar ya que no me deja subir el .c, para por si me pueden ayudar....


----------



## enmarquez (Jul 30, 2012)

Buenas tardes estoy tratando de diseñar un controlador de velocidad y quiero introducirle la velocidad por el teclado matricula y que se refleje en el lcd, pero no puedo llevar bien las variables de char a int ya que siempre me muestra que la velocidad es 0. Aquí les dejo el código a ver si reconocen el error. Gracias.



> char A;
> char B;
> char C;
> char D;
> ...



Me muestra bien cuando estoy escribiendo en el teclado pero cuando es hora de mostrar la velocidad me muestra o puros ceros o un disparate, creo q el error esta en la transformación de variables.


----------



## lizbethcorpus (Ago 8, 2012)

loloco.. hola a mi si me interesa tu proyecto, tengo el mismo problema del teclado pero con el pic18f4550.


----------



## elcucarachon (Oct 22, 2012)

Buenas tardes gente...

Les paso a comentar rápido y claro, en CCS utilizaba la librería kbd.c para estos asuntos, me surge el siguiente problema: *tengo que adaptarla a un teclado ya puesto*, consta de:

-Las filas van a RA2,RA3,RA4,RA5
-Las columnas RE0,RE1,RE2 y *estas tienen 3 Pull-down puestos* (osea una de 10k a GND por pin). 

Preguntaran porque tan jodido? Tenia otro tipo de lógica para detectar la pulsación de las teclas, y otro compilador.

*-Se puede adaptar kbd.c?*
-Los Pull-down se pueden llegar a eliminar (corto las resistencias)

Tengo la idea que se puede editar esta parte pero no se me ocurre como:

```
#if defined(__PCH__) 
#if defined use_portb_kbd 
   #byte kbd = 0xF81                   // This puts the entire structure 
#else 
   #byte kbd = 0xF83                   // This puts the entire structure 
#endif 
#else 
#if defined use_portb_kbd 
   #byte kbd = 6                  // on to port B (at address 6) 
#else 
   #byte kbd = 8                 // on to port D (at address 8) 
#endif 
#endif 

#if defined use_portb_kbd 
   #define set_tris_kbd(x) set_tris_b(x) 
#else 
   #define set_tris_kbd(x) set_tris_d(x) 
#endif
```

gracias saludos


----------



## Krul (May 21, 2013)

hola loloco, me gustaria saber como modificaste la libreria para mandar el dato antes de soltar el push button, ya que tengo un proyecto que necesita del dato antes de soltar el push
te envio un cordial saludo y gracias


----------



## joquines (May 21, 2013)

Tengo pensado modificar la librería kbd.c para adaptarla a un teclado alfanumérico, algo así como de los celulares. Alguien hizo algo parecido que me guíe?


----------



## nelsonr (Nov 24, 2013)

Hola  tengo un problema con kbd.c el detalle esta en que  hay veces que me marca el mismo numero por ejemplo si marco el 6 en la pantalla marca 6 luego marco el  9 y en la pantalla me marca 6 no se porque se da esto no pasa todo el tiempo  ya e revisado la programación la conexión y nada
cualquier comentario se los agradezco

Nota: Esto me pasa en el circuito no en el emulador.


----------



## D@rkbytes (Nov 24, 2013)

Sube por favor tu proyecto completo (Programa, simulación y/o esquema) para que se te pueda ayudar.


----------



## nelsonr (Nov 27, 2013)

Hola a todos. Estoy usando un PIC16F877A con un oscilador a cristal 4.3587MHz con dos Capacitores de  20pF. un teclado 4X3 conectado al puerto B, habilitando el puerto desde la librería.

Noté que las líneas de código que manejan el dato devuelto por la por al función j=kbd_getc(); lo hacen de forma correcta, pero el dato  regresado  por la función j=kbd_getc() lo regresa errado, a veces, no todo el tiempo.

Por ejemplo; si marco  5 veces  #  y marco luego el 6,  el  valor devuelto en la variable j es #
Ya he revisado todo y no veo nada malo, lo único que me falta por revisar el el Fuse el cual colocaré mas tarde  al igual que el diagrama en proteus porque estoy en el trabajo y el proyecto lo tengo en casa.

Cabe destacar que en el emulador si funciona todo bien, mi problema es en la vida real, por eso sospecho del fuse.

El programa cuenta con mas de 800 líneas,  por eso coloco la función que usa la librería del teclado.


```
/*Area de libreria*/
#include <LCD.C>
#include <kbd.c>
#include <string.h> 
#use fast_io(a)
  
Función principal


void main()
{
   
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   set_tris_a(0x1F);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   lcd_init();
   kbd_init();
   port_b_pullups(true);
   
   while(true)
   {
     llamado a la función  menu_llamada
    }






int menu_llamada ( )
{
 char t ;
   kbd_init();
   t=kbd_getc();
  /* En este punto  ya la variable t  llega con el dato errado*/
 if(t!=0 )
    {
      bell();      
   if(t == '1')
       {
        return 1; 
       } 
   if(t == '2')
       {
         return 2 ; 
       }
   if(t == '3')
  {
   return 3 ; 
  }
   if(t == '4')
  {
   return 4 ; 
  }
   if(t == '5')
  {
   return 5 ; 
  }
   if(t == '6')
  {
   return 6 ; 
  }
   if(t == '7')
  {
   return 7 ; 
  }
   if(t == '8')
  {
   return 8 ; 
  }
   if(t == '9')
  {
   return 9 ; 
  }
   if(t == '0')
  {
   return 0 ; 
  }
   if(t == '*')
  {
   return 14 ; 
  }
   if(t == '#')
  {
 return 13 ; 
  } 
    }

  return 16;
}
```
Hola de esta forma tengo configurado el fuse les agradezco su ayuda de ante mano
#include <16F877A.h> 
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES WRT_50%                  //Lower half of Program Memory is Write Protected

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi  ts=8)

hola  ya puse lo que me comentaste si hace falta algo mas  me dices  la  verdad  ya no se que pueda ser 
 gracias


----------



## D@rkbytes (Nov 28, 2013)

Aquí mencionas usar un cristal de 4.3587MHz.


nelsonr dijo:


> Hola a todos. Estoy usando un PIC16F877A con un oscilador a cristal 4.3587MHz


Pero aquí estás usando este fuse...
#FUSES XT                       //Crystal osc <= 4mhz
Y declaras una frecuencia de 4MHz --> "#use delay(clock=4000000)"
XT como lo comentas es para usar un cristal menor o igual a 4MHz. Por lo tanto ese fuse no está bien.
Debes usar el fuse HS para utilizar un cristal de 4.3587MHz.
¿Por qué utilizas un cristal a esa frecuencia?
¿Es por algún tipo de cálculo especial que tienes que hacer en tu programa con esa frecuencia?

Otra cosa; no es necesario que configures todos los módulos del PIC si no los vas a usar.
Algunos módulos no son necesarios que los configures cuando no los vas a usar.
Para ver la inicialización de los registros, lee la hoja de datos y podrás saber que valor toman en el POR (Power On Reset)

La palabra de configuración que te recomiendo es esta:

#fuses   NOBROWNOUT
#use delay(crystal = 4.3587MHz)

Si te fijas, el único fuse declarado es _BOREN_OFF (En PIC C = NOBROWNOUT)
Y puede ser omitido si requieres que se produzca un reset por bajo voltaje de alimentación.
"Por defecto este fuse quedará activo mientras no se declare en OFF"

Al usar #use delay(crystal = 4.3587MHz) el compilador sabe que se usará un cristal superior a 4MHz y automáticamente establece el tipo de oscilador (HS) y también establece los demás, que en el PIC16F877A quedarán de esta manera al usar tan solo esta declaración:

OSC = HS
WDTE = OFF
PWRTE = ON
BOREN = OFF
WRT = OFF
LVP = OFF
CPD = OFF
CP = OFF
DEBUG = OFF

Como podrás ver, es una palabra de configuración adecuada para el programa que estás realizando.

Una recomendación para ahorrar pines, es usar el teclado y la pantalla por el mismo puerto.
Éste fragmento de código es para usar ambos por el puerto B en el PIC16F877A:

#define LCD_DATA_PORT getenv("SFRORTB")
#include <lcd.c>
#define use_portb_kbd TRUE
#include <kbd.c>

Y debe ser colocado debajo de #use delay()

Prueba de esta forma, es funcional como te menciono y está comprobado.
No olvidar activar los resistores pull-up en el puerto B.

Suerte.


----------



## nelsonr (Nov 28, 2013)

Hola como respuesta a lo preguntado, uso ese cristal porque aunque parezca mentira  en mi país no e podido conseguir un cristal 4Mhz lo mas parecido es el que mecione 4.3587MHz no hay ningún  calculo  en especial. En efecto como dices esta mal configurado el manejo del oscilador realice los ajustes necesario con respecto al XT y era HS pero me sigue dando el mismo erro.
Ahora lo que are sera  terminar de revisar el Fuse como me indicaste  para ver que mas esta mal y te cuente.


----------



## D@rkbytes (Nov 28, 2013)

nelsonr dijo:


> Realicé los ajustes necesarios con respecto al XT y era HS pero me sigue dando el mismo error.
> Ahora lo que haré será  terminar de revisar el Fuse como me indicaste  para ver que más está mal y te cuente.


El problema no creo que lo tengas con los fuses de la palabra de configuración.
Muy probablemente se deba a un problema de hardware.
Tienes que revisar bien las conexiones del teclado y la distribución de teclas del mismo.

Para que salgas de dudas adjunto un ejemplo funcionando a 4.433619MHz.
No tengo ese cristal que mencionas de 4.3587MHz y para el ejemplo expuesto funciona también al usar uno de 4MHz, ya que no se requiere precisión en la frecuencia de trabajo.

En dado caso que con este ejemplo tengas el mismo problema, entonces debes cambiar el PIC, o verificar que todo esté bien conectado en el circuito, porque este ejemplo funciona físicamente.

Suerte.


----------



## nelsonr (Nov 28, 2013)

Listo  termino  las gestiones y te comento el resultado tan pronto lo tenga gracias por todo


----------



## nelsonr (Dic 4, 2013)

Hola d@rkbytes siguiendo las  observaciones dadas por usted encontré 2 botones  defectuosos en el panel de.botones ya los remplase y listo  hasta ahora no se a presentado el problema aré un par de pruebas  pero por ahora todo bien  esperemos siga de esta forma.
Gracias por todo.  Cualquier cosa te informó


----------



## LightofDark (Abr 7, 2016)

Buenas noches soy nuevo en esto de los programas, estoy interesado en este tipo de problema debido a que necesito seleccionar una temperatura y un voltaje por medio de un teclado matricial 4x3.... ¿ como haria para agregar los valores del teclado a la cadena?


----------



## D@rkbytes (Abr 7, 2016)

Realiza un bucle de cuantos dígitos necesites ingresar y en una matriz almacenas en valor de cada dígito.
Después haces la conversión de la cadena almacenada en la matriz a entero con "atoi", atol" o "atoi32", dependiendo de la longitud requerida.


----------



## miglo (Abr 9, 2016)

D@rkbytes dijo:


> Una recomendación para ahorrar pines, es usar el teclado y la pantalla por el mismo puerto.
> Éste fragmento de código es para usar ambos por el puerto B en el PIC16F877A:
> 
> #define LCD_DATA_PORT getenv("SFRORTB")
> ...



D@rkbytes una pregunta, si hacemos lo que pones en el ejemplo ya no podremos usar las interrupciones del puertoB verdad? o se puede de alguna manera?

Me refiero a RB0= int_ext y RB4-RB7


----------



## D@rkbytes (Abr 9, 2016)

Saludos.
No, ya no se podrán usar las interrupciones del puerto B, porque se activarían con los datos de la pantalla.
Si requieres usar esas interrupciones, es mejor cambiar la pantalla y el teclado a otro puerto.


----------



## miglo (Abr 10, 2016)

D@rkbytes dijo:


> Saludos.
> No, ya no se podrán usar las interrupciones del puerto B, porque se activarían con los datos de la pantalla.
> Si requieres usar esas interrupciones, es mejor cambiar la pantalla y el teclado a otro puerto.



Hola D@rkbytes, si se cambia al puertoD las librerias estan adaptadas para dicho puerto o habria que hacer alguna modificacion? venga gracias


----------



## D@rkbytes (Abr 10, 2016)

Las librerías son modificables para poderlas adaptar al puerto que requieras.
Cuando las abras podrás ver lo que se necesita hacer.


----------

