PIC Adicto

23 agosto 2009

Manejando un teclado matricial con un solo terminal

Archivado en: 16F,Código CCS,Simulación — picadicto @ 14:15
Tags: , ,

tips_n_tricks_tecladoLeyendo un documento de Microchip llamado Tips ‘n tricks (algo así como consejos y trucos) encontré una muy buena idea para manejar un teclado matricial de 12 teclas con un único terminal del PIC como se ve en la imagen de la derecha. La idea es leer el valor de tensión mediante un canal del conversor A/D del PIC, esta tensión será distinta para cada tecla apretada siempre y cuando hagamos una buena elección de los valores de las resistencias conectadas. En el ejemplo que muestro el LCD imprime la tecla pulsada, con # se borra el display y con * se cambia de línea.

El circuito es muy sencillo, sólo se necesita el teclado matricia, un display LCD y un conversor A/D. Para el ejemplo utilicé un PIC16F873A pero esta implementación es muy útil cuando disponemos de pocos terminales y, como dice el documento, es muy práctico para los PICs 12F de 8 terminales.

teclado_unico_pin

Simulación

Código Fuente

Utilizando la librería del CCS para LCDs el código es muy sencillo, consiste en comparar el valor de lectura del conversor A/D con el cálculo de tensión por cada tecla según el divisor resistivo que se utilice. Los límites de comparación de cada tecla mostrados son para los valores de resistencias del circuito y considerando una tolerancia del 1%.

#include <LCD.C>
void muestra(long valor);
void main()
{
   long tecla;
   set_tris_a(0xff);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(ALL_ANALOG);
   set_adc_channel(0);
   lcd_init();
   do{
      tecla=read_adc();
      muestra(tecla);
   }while(true);
}
void muestra (long valor){
   if ((valor >746)&(valor<761)){
      lcd_putc("1");
      delay_ms(400);
   }
      if ((valor >480)&(valor<490)){
      lcd_putc("2");
      delay_ms(400);
   }
   if ((valor >364)&(valor<372)){
      lcd_putc("3");
      delay_ms(400);
   }
   if ((valor >687)&(valor<701)){
      lcd_putc("4");
      delay_ms(400);
   }
   if ((valor >456)&(valor<465)){
      lcd_putc("5");
      delay_ms(400);
   }
   if ((valor >350)&(valor<357)){
      lcd_putc("6");
      delay_ms(400);
   }
   if ((valor >654)&(valor<668)){
      lcd_putc("7");
      delay_ms(400);
   }
   if ((valor >439)&(valor<448)){
      lcd_putc("8");
      delay_ms(400);
   }
   if ((valor >342)&(valor<349)){
      lcd_putc("9");
      delay_ms(400);
   }
   if ((valor >614)&(valor<626)){
      lcd_putc("\n");
      delay_ms(400);
   }
   if ((valor >330)&(valor<337)){
      lcd_init();
      delay_ms(400);
   }
   if ((valor >421)&(valor<430)){
      lcd_putc("0");
      delay_ms(400);
   }
}

Advertisement

2 comentarios »

  1. Muy bueno!!! Excelente idea para ahorrar patitas… Copado el blog!

    Comentario por Oscar — 23 agosto 2009 @ 16:46 | Responder

  2. De nuevo… Felicitaciones!!

    Comentario por Adrian — 24 agosto 2009 @ 13:48 | Responder


RSS feed para los comentarios de esta entrada. URI para TrackBack.

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Theme: Rubric. Blog de WordPress.com.

Seguir

Get every new post delivered to your Inbox.