Teclado programado en ccs

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

Adjuntos

  • teclado en ccs c.JPG
    teclado en ccs c.JPG
    112.4 KB · Visitas: 633
  • teclado y lcd.txt
    2.3 KB · Visitas: 772
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.
 
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
 
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.
 
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
 

Adjuntos

  • KBD4x4.txt
    2.6 KB · Visitas: 1,855
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.
 
Te convendria usar la libreria de CCS.

PHP:
#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
 
Última edición por un moderador:
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.
 
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.
 
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

Código:
// 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);
}
 
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.
 
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.

PHP:
#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
 
Última edición por un moderador:
Hola amigos.:apreton:
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.:unsure:
 
Hola amigos.:apreton:
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.:unsure:


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]
 
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.
 
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 :cry: ....

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

Adjuntos

  • kbd_lib.rar
    1.5 KB · Visitas: 617
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;
int A1, B1, C1, D1;
int Velocidad;
#define LCD_TYPE 2
#include <lcd.c>
#include <KBC_1.c>
#include <stdlib.h>
void main()
{
lcd_init();
kbd_init();
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
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_DIV_BY_4,249,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(512);
port_b_pullups(true);

while(true){
while(A == 0){
A = kbd_getc();
}
printf(lcd_putc,"%c",A);
while(B == 0){
B = kbd_getc();
}
printf(lcd_putc,"%c",B);
while(C == 0){
C = kbd_getc();
}
printf(lcd_putc,"%c",C);
while(D == 0){
D = kbd_getc();
}
printf(lcd_putc,"%c",D);
A1 = atoi(A);
B1 = atoi(B);
C1 = atoi(C);
D1 = atoi(D);
lcd_gotoxy(1,1);
delay_ms(500);
Velocidad = A1*1000 + B1*100 + C1*10 + D1;
lcd_gotoxy(1,1);
printf(lcd_putc,"%i RPM", Velocidad);
}
}

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.
 
Atrás
Arriba