Control de teclado matricial

Esta es una simple función de control de teclado matricial de 4x4, es muy sencillo, el principio de funcionamiento es por barrido de bits, o sensado.
Se toma un puerto completo de 1byte y se divide en dos, dejando los 4bits de la parte baja para X y los 4 bit de la parte alta para Y, de esta forma conformamos una matriz de 4x4.
El proceso de barrido consiste en alimentar una linea del teclado que puede ser X o Y, y una vez alimentada esa linea se procede a testear cada uno de los 4 bits, de esta forma se puede saber si alguna de las teclas pulsadas coincide con esta linea alimentada, si es asi se moverá a la variable el valor deseado., luego se sigue alimentando la siguiente linea y se vuelven a testear cada uno de los 4 bits, nuevamente se vuelve a repetir hasta llegar a las 4 lineas.


output_c(0b00000001);   //Habilita el pin RC0

Luego se testean las otras cuatro lineas

if(PORTC==0b00010001) teclaPulsada='7'; //Si RC4=0 asigna '7'
if(PORTC==0b00100001) teclaPulsada='4'; //Si RC5=0 asigna '4' 
if(PORTC==0b01000001) teclaPulsada='1'; //Si RC6=0 asigna '1'
if(PORTC==0b10000001) teclaPulsada='C'; //Si RC7=0 asigna 'C'

De esta forma podemos comprobar el funcionamiento, ya que esto se repetirá 4 veces como puede verse en el programa para lograr recorrer toda la matriz.

Como se puede ver en este circuito, se presiona la tecla 6, la forma que tiene el microcontroaldor de saber que se ha pulsado es la siguiente:

Podemos ver que las lineas que se alimentan son las que van de RC0 a RC3, en este caso, el programa se encuentra alimentando RC2 por eso toda la linea vertical donde se encuentra el botón 9, 6, 3 y =, esta alimentada, ahora viene la parte de los 4 if, preguntando cual de ellas esta precionada, entonces encuentra que la tecla pulsada es la que pertenece a la linea RC5, al encontrar esta igualdad asigna el valor 6 a la variable que luego sera mostrada en el LCD.




El programa completo es el siguiente. 


#include <16f883.h>
#use delay(int=4000000)
#fuses XT,NOWDT
#include <LCD.C>
char teclaPulsada;
void leerTeclado(){
   output_c(0b00000001);
   if(input(pin_c4)==1) teclaPulsada='1';
   if(input(pin_c5)==1) teclaPulsada='2';
   if(input(pin_c6)==1) teclaPulsada='3';
   if(input(pin_c7)==1) teclaPulsada='A';
   delay_ms(10);
   output_c(0b00000010);
   if(input(pin_c4)==1) teclaPulsada='4';
   if(input(pin_c5)==1) teclaPulsada='5';
   if(input(pin_c6)==1) teclaPulsada='6';
   if(input(pin_c7)==1) teclaPulsada='B';
   delay_ms(10);   
   output_c(0b00000100);
   if(input(pin_c4)==1) teclaPulsada='7';
   if(input(pin_c5)==1) teclaPulsada='8';
   if(input(pin_c6)==1) teclaPulsada='9';
   if(input(pin_c7)==1) teclaPulsada='C';
   delay_ms(10);
   output_c(0b00001000);
   if(input(pin_c4)==1) teclaPulsada='*';
   if(input(pin_c5)==1) teclaPulsada='0';
   if(input(pin_c6)==1) teclaPulsada='#';
   if(input(pin_c7)==1) teclaPulsada='D';
   delay_ms(10);
}
void main(void){
   lcd_init();
   lcd_gotoxy(1,1);
   printf(lcd_putc,"Electgpl Teclado");
   while(TRUE){
      leerTeclado();
      lcd_gotoxy(1,2);
      printf(lcd_putc,"TECLA...:  %c  ",teclaPulsada)
   }
}



No hay comentarios.:

Publicar un comentario