Manejar teclado matricial y mostrar en lcd

Saludos, tenia el mismo problema cuando migre del pic16f877 al pic18f4550, sin embargo, modificando y creando una copia del kbd.c logre poder poner a funcionar mi lcd con el teclado y funciona perfectamente.
Gracias por la ayuda!
 
hola, que tal, estoy realizando un programa el cual cuando se tenga un 1 en el puerto E0 se encienda un led en puerto C0, y se tengan 30 segundos para apagarlo por medio de un teclado matricial al presionar '*', sino encendera todo el puerto C al terminar el tiempo, ademas de que muestra la cuenta en forma regresiva de los segundos y lo muestre en un LCD, bueno he realizado el programa pero no consigo que cuando yo presiono el '*' se detenga y apague el led. Espero y me puedan ayudar. dejo el codigo del circuito.

Código:
#include <16F887.h>
#fuses XT,NOWDT,NOPROTECT,PUT

#use delay(clock=4M)

#define use_portb_lcd TRUE
#include <lcd.c>
#include <kbd.c>

#use fast_io(C)
#use fast_io(E)

#byte portc = 0x07
#byte porte = 0x09

#bit BT1 = 0x09.0

int t,n,a=1,d=29;


void inicializar(void)
{
   setup_adc_ports(NO_ANALOGS);
   set_tris_e(0b11111111);
   set_tris_c(0b00000000);
   output_c(0x00);
   lcd_init();
   kbd_init();
}

void main(void)
{
   inicio:
   inicializar();
   for(;;)
   {
      if(BT1==1)
      {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"ACTIVADO");
         output_c(0x1);
         do
         {
            t=kbd_getc(); 
            n=t-48;
            if(t!=0)
            {
               if(t=='*')
               {
                  output_C(0x00);
                  goto inicio;
               }
            }
            lcd_gotoxy(1,2);
            printf(lcd_putc,"Tiempo Desc: %d\r",d);
            delay_ms(1000);
            a++;
            d--;
         }
         while(a<=30);
         output_C(0xFF);
      }
   }
}
 
hola que tal, esta vez tengo una duda espero y me puedan ayudar, necesito ejecutar durante un minuto el kbd en ccs y si despues de no presionar nada realizar otra activadad, lo cual puede ser desde el encendio de un led, eso es lo menos imporatante sino que el kbd este activo nadamas 1 minuto. espero y me puedan ayudar.
 
Disculpen si retorno esto nuevamente, estoy haciendo un contador en bcd del 0 - 99 con compuertas ya que no puedo usar pic sin embargo tengo que acoplarle un teclado matricial 3x4 si alguien me ayuda que componente deberia agregarle?
 
Hola JonNArevalo

El teclado matricial 3x4 para qué en un contador BCD 0-99 ??
Cual es objetivo de ese teclado en el contador ??
Podrías dar más información ??

Qué simulador para circuitos electrónicos utilizas ??
Puedes dejarnos ver el contador BCD de 0-99??

saludos
a sus ordenes
 
como hacer esto leyendo y escribiendo en la memoria eeprom del pic 877A??



alguien me podria ayudar a hacer lo mismo pero leyendo y escribiendo en la memoria eeprom
xfavooor
no tengo idea de como leer y guardar los numero que yo ingreso
 
Última edición:
Hola a todos

Agradezco mucho que hubiesen abierto esta pregunta.

Lo que sucede es que estoy intentando utilizar un teclado 4x3 y un lcd de 16x2, el lcd lo estoy conectando al puerto d y el teclado al puertob. El lcd funciona excelente pero el teclado no. adjunto el codigo y la simulacion en proteus.
estoy utilizando un pic16f887 y en pic c.

Espero sus respuestas
Muchas gracias por la atencion
Ver el archivo adjunto foroelectronica.rar
 
Separa el LCD del teclado modificando la librería LCD.C, y la pones dentro de la carpeta de tu proyecto.
Así podrías trabajar el teclado por el puerto B, y la pantalla por el puerto C u otro puerto.

Mencionas que usarás un PIC16F887, pero en la simulación usas un PIC16F876 :unsure:
 
Que pena adjunte la simulacion que no era. En el archivo lcd.c lo dejé tal cual para que trabaje por defecto en el puertod, mientras que en el archivo kbd.c para poder trabajar por el puertob "descomente" la siguiente linea
#define use_portb_kbd TRUE

Lo raro es que el lcd funciona, pero el teclado no.
Adjunto esta vez los archivos correctos
Ver el archivo adjunto foroelectronica.rar
 
el archivo lcd.c lo dejé tal cual para que trabaje por defecto en el puerto d, mientras que en el archivo kbd.c para poder trabajar por el puerto b "descomente" la siguiente linea
#define use_portb_kbd TRUE

Lo raro es que el lcd funciona, pero el teclado no.
Después de realizar algunas modificaciones al programa y al diseño, ya lo tengo funcionando.
Al parecer existe un bug con la instrucción port_b_pullups(true); al trabajar con el PIC16F887.
No activa las resistencias pull-up en el puerto B :unsure:
Como no había usado esa instrucción del PCWHD Compiler con este PIC, no lo había notado.

Adjunto el proyecto con las modificaciones realizadas para activar las resistencias pull-up en el puerto B,
y trabajando con el oscilador interno a 8MHz.

Saludos.
 

Adjuntos

  • teclado 3x4 reparado.rar
    10.4 KB · Visitas: 258
Después de realizar algunas modificaciones al programa y al diseño, ya lo tengo funcionando.
Al parecer existe un bug con la instrucción port_b_pullups(true); al trabajar con el PIC16F887.
No activa las resistencias pull-up en el puerto B :unsure:
Como no había usado esa instrucción del PCWHD Compiler con este PIC, no lo había notado.

Adjunto el proyecto con las modificaciones realizadas para activar las resistencias pull-up en el puerto B,
y trabajando con el oscilador interno a 8MHz.

Saludos.

jajaja D@rkbytes muchas muchas gracias, no se imagina lo mucho que me sirve esto, hace rato me estaba quebrando la cabeza solucionar esto, porque con otros pics me daba pero con el 16f887 no funcionaba.

Aprecio mucho el tiempo que te tomastes. Dios te pague

Pero??? Cuentame, como te distes cuenta de ese problema?
 
Pero??? Cuéntame, como te diste cuenta de ese problema?
Simple, los teclados matriciales necesitan resistencias pull-up en las líneas de entrada para trabajar.
En el programa estaba la instrucción para habilitarlas por el puerto B, pero tal función no se cumplía.
A simple vista sobre la simulación el puerto B permanecía con los pines como entradas flotantes.
Y cuando se declara usar pull-ups, mantienen un estado alto.
Así qué, determiné que la instrucción port_x_pullups(x) no estaba funcionando.
Entonces la sustituí por el bit 7 (RBPU) del registro OPTION_REG, que es el que hace esa función.
Solamente así pude activar las resistencias pull-up en el puerto B.

Saludos.
 
Hola, e tenido problemas para simular un teclado 4x3 en el proteus (keypad phone) pues e estado investigando en varias paginas como por ejemplo que quite la instruccion de las resistenciasv pullup internas del pic y las ponga físicamente en el proteus, pero nada, muchos dicen que la librería del ccs esta mal, pero la verdad nose, e tratado de simularlo con el pic 16f887 y 16f877A pero no da resultado, a la hora de simularlo los pines del keypad están de color gris y pues no sucede nada, quisieran que me ayuden por favor.

Les adjuntare mi programa y el circuito del proteus.
 

Adjuntos

  • Teclado1.rar
    40.6 KB · Visitas: 72
Hola, e tenido problemas para simular un teclado 4x3 en el proteus (keypad phone) pues e estado investigando en varias paginas como por ejemplo que quite la instruccion de las resistenciasv pullup internas del pic y las ponga físicamente en el proteus, pero nada, muchos dicen que la librería del ccs esta mal, pero la verdad nose, e tratado de simularlo con el pic 16f887 y 16f877A pero no da resultado, a la hora de simularlo los pines del keypad están de color gris y pues no sucede nada, quisieran que me ayuden por favor.
El problema que tienes en tu diseño, es que usas resistencias limitadoras, en vez de resistencias pull-up.
Pero con las resistencias pull-up del puerto B, debe funcionar sin problemas.
Ahora, por lo que no funciona tu programa, es porque la definición de usar el puerto B para el teclado,
se hace en la librería KBD.C, no en el código fuente, y también tienes otros problemas en el código.

Éste sería tu programa corregido...
Código:
#include <16f887.h>
#fuses NOWDT,NOMCLR,NOLVP
#use delay(internal = 8000000) 
#include <lcd.c>   
#include "kbd.c"
#byte OPTION_REG = getenv("SFR:OPTION_REG")  // Referencia hacia el registro OPTION_REG
#bit  RBPU = OPTION_REG.7  // Referencia hacia el bit 7 de OPTION_REG (RBPU)

//#define use_porb_kbd TRUE      // Ésto se define en la librería kbd.c

void main()
{
  char k;
  int x;
  RBPU = 0;

  lcd_init();
  kbd_init();
  
  lcd_putc("\fPRESIONE TECLA\n");// Mensaje inicial 

   while(TRUE)
   {
      k = kbd_getc();   // faltaba agregar k =
      x= k - 48; // Conversion de ASCII a decimal
      
      if(k!=0)
      {
        if(k=='*')   // Se debe usar 'X' no "X" para comparar los caracteres
        lcd_putc("\fTecla=???");
        
        else
        printf(lcd_putc,"\fTecla=%u",x);
        
        delay_ms(1000);
        
      }
     
   }

}
Cómo verás, el tema de la activación de las resistencias pull-up en el PIC16F887, se trató unos posts atrás.
Y fue lo que añadí a tu programa, con eso ya debe funcionar, pero faltaría agregar algunos parámetros.
Por ejemplo, el ajuste del oscilador interno, para que trabaje a 8MHz de forma estable.
Sólo tendrías que agregar esto a tu programa en la parte del main...
setup_oscillator(OSC_8MHz|OSC_STATE_STABLE);

En la simulación elimina las resistencias, y conecta el teclado directamente.
Al montarlo físicamente si se pueden poner resistencias limitadoras.

Espero que con los cambios agregados, funcione tu programa.

Suerte.
 
Última edición:
gracias por responder, sigue sin funcionar lo mas raro de todo, los pines del lcd están de color gris, sera error de lo libreria lcd.c??



mmm no es eeror de la libreria, porque descargue un programa que aarreglaste enun anterior post y si funciona ese muy bien, no entiendo porque no funciona el mio si le agregaste las mismas cosas :s



Que raro ese programa que arreglaste en otro post lo copie y lo pegue en otro archivo nuevo que hice y ahora si no funciono, entonces el problema sera el compilador??
 
Última edición:
gracias por responder, sigue sin funcionar lo mas raro de todo, los pines del lcd están de color gris, sera error de lo libreria lcd.c??



mmm no es eeror de la libreria, porque descargue un programa que aarreglaste enun anterior post y si funciona ese muy bien, no entiendo porque no funciona el mio si le agregaste las mismas cosas :s



Que raro ese programa que arreglaste en otro post lo copie y lo pegue en otro archivo nuevo que hice y ahora si no funciono, entonces el problema sera el compilador??
por lo que no funciona tu programa, es porque la definición de usar el puerto B para el teclado,
se hace en la librería KBD.C, no en el código fuente.
¿Ya hiciste eso?

Existe una parte en la librería KBD.C que dice...
// Un-comment the following define to use port B (Descomente la siguiente definición para usar el puerto B)
// #define use_portb_kbd TRUE
<--- Quita las diagonales rojas para descomentar esta línea.
Si modificas esta librería desde el PCWHD Compiler, al compilar te saldrá un aviso.
Se te preguntará si quieres que la librería con los cambios, se guarde en la carpeta del programa.
Si aceptas, la librería modificada será copiada a la carpeta del programa principal.
Entonces ahora para poder usar esta librería, tienes que cambiar en tu programa la forma de incluirla.
En vez de escribir #include <kbd.c> ahora lo cambias por #include "kbd.c" y listo.
No omitas nada de lo que te mencione anteriormente.

Suerte.
 
Buenas, muchas gracias a todos por su tiempo.
No he podido avanzar porque no me lee el teclado matricial. El lcd funciona perfecto pero el teclado no, Planeo usarlo en el PortD el teclado y en el C el LCD.

Uso el CCS mas reciente.

Si pudieran darme una pista de como usar ambos por el portC se los agradeceria muchisimo.

Anexo envio codigo de la aplicacion y de la libreria KBD.

Me compila perfectamente, pero no me funciona.

Aqui anexo libreria KBD que estoy utilizando, muchas gracias
 

Adjuntos

  • aplicacion.txt
    4.2 KB · Visitas: 30
  • kbd.txt
    4.6 KB · Visitas: 33
Atrás
Arriba