Autor Tema: Teclado Matricial conectado a PIC16F877A, no me funciona el programa.  (Leído 5415 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado mi_chell2002

  • PIC10
  • *
  • Mensajes: 15

hola a todos estoy haciendo el siguiente programa la idea es leer un teclado matricial 4X4 osea de
cuatro columnas y cuatro filas.ESTOY USANDO EL COMPILADOR CC5X.
para leer las teclas este programa usa el metodo de inversion de linea, osea que las entradas
se inviertes para pasar a ser salidas y viceversa. Por ahora soloquiero que cuando presione una tecla esta
sea leida y el pic active una salida osea un bit EN MI CASO diferente por cada numero del teclado esto segun se puede apreciar en el programa.
sucede que lal idea es leer las entradas y las salidas hacer un solo byte con ellas y guardarlas en la variable TECLA y luego preguntar
por los bits de la variable para ver cuales estan en cero y con eso detectar la tecla.
agradecere cualquier ayuda.



RB4-RB5-RB6-RB7=COLUMNAS
^ ^ ^ ^
| | | |
|---|---|---|---|---|---|
RB0 --> | 1 | 2 | 3 | F1|
|---|---|---|---|---|---|
RB1 --> | 4 | 5 | 6 | F2|
|---|---|---|---|---|---| 
RB2 --> | 7 | 8 | 9 | F3|
|---|---|---|---|---|---|
RB3 --> | * | 0 | # | F4|
|---|---|---|---|---|---|
*/




RB0,BB1,RB2,RB3 ESTAN CONECTADOS A LAS FILAS.




void configura_puertos()

{
    ADCON1=0b00000110;//configura todos los BIT del PUERTO A y el E como entradas y salidas digitales.
    //TRISA=0x03;//0b00000011 RA0 yRA1 como entradas de 2 Monederos.
    TRISB=0b11110000; //habilita las columnas como entradas en los bits B4-B7;
    OPTION.7=0;//Habilita PULL-UP del puerto b
    TRISC=0x00;//TRISC como salida.//0b10000000;Habilita comunicacion rs232.
    TRISD=0x00;
    TRISE=0x00;
}
 

void teclado_entrada_PORTB()
{

char TECLA,TECLA_C,TECLA_F;


while(1)

  {
    
      TECLA_C=PORTB;//11110000 las entradas estan en '1' mientras no se presione una tecla.
           
   
  while (TECLA_C!=0xF0)
         {
           
           TRISB=0b00001111;//habilita las filas como entradas en los bits A0-A3.
           OPTION.7=0;
           TECLA_F=PORTB;
           
           TECLA=TECLA_F|TECLA_C;//el bit que cambio en las filas queda guardado en TECLA_F.
           TECLA_F=0x0F;
                       
      if ((TECLA.0==0)&&(TECLA.4==0))//Tecla "1 PRESSED".
          {
          //tecla "1" Presionada.
          //Retardo.
           PORTC.1=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

     if ((TECLA.0==0)&&(TECLA.5==0))//Tecla "2" PRESSED".
          {
          //tecla "2" Presionada.
           PORTC.2=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

     if ((TECLA.0==0)&&(TECLA.6==0))//Tecla "3" PRESSED".
          {
          //tecla "3" Presionada.
           PORTC.3=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

     if ((TECLA.1==0)&&(TECLA.4==0))//Tecla "4" PRESSED".
          {
          //tecla "4" Presionada.
           PORTC.4=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

     if ((TECLA.1==0)&&(TECLA.5==0))//Tecla "5" PRESSED".
          {
          //tecla "5" Presionada.
           PORTC.5=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

     if ((TECLA.1==0)&&(TECLA.6==0))//Tecla "6" PRESSED".
          {
          //tecla "6" Presionada.
           PORTC.6=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

     if ((TECLA.2==0)&&(TECLA.4==0))//Tecla "7" PRESSED".
          {
          //tecla "7" Presionada.
           PORTC.7=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

    if ((TECLA.2==0)&&(TECLA.5==0))//Tecla "8" PRESSED".
          {
          //tecla "8" Presionada.
           PORTD.0=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

    if ((TECLA.2==0)&&(TECLA.6==0))//Tecla "9" PRESSED".
          {
          //tecla "9" Presionada.
           PORTD.1=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

    if ((TECLA.3==0)&&(TECLA.4==0))//Tecla "*" PRESSED".
          {
          //tecla "*" Presionada.
           PORTD.2=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

    if ((TECLA.3==0)&&(TECLA.5==0))//Tecla "0" PRESSED".
          {
          //tecla "0" Presionada.
           PORTD.3=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

    if ((TECLA.3==0)&&(TECLA.6==0))//Tecla "#" PRESSED".
          {
          //tecla "#" Presionada.
           PORTD.4=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;
    if ((TECLA.0==0)&&(TECLA.7==0))//Tecla "F1" PRESSED".
          {
          //tecla "F1" Presionada.
           PORTD.5=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

    if ((TECLA.1==0)&&(TECLA.7==0))//Tecla "F2" PRESSED".
          {
          //tecla "F2" Presionada.
           PORTD.6=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

   if ((TECLA.2==0)&&(TECLA.7==0))//Tecla "F3" PRESSED".
          {
          //tecla "F3" Presionada.
           PORTD.7=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
          }break;

   if ((TECLA.3==0)&&(TECLA.7==0))//Tecla "F4" PRESSED".
          {
          //tecla "F4" Presionada.   
           PORTE.0=1;
           TECLA=0xFF;
           TECLA_C=0xF0;
           }break;
         }
    }
 

}                           


void main()
{
   configura_puertos();
   teclado_entrada_PORTB();
}

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Teclado Matricial conectado a PIC16F877A, no me funciona el programa.
« Respuesta #1 en: 18 de Marzo de 2009, 16:04:51 »
aquí yo hice un experimento que salió bien  :)

http://www.todopic.com.ar/foros/index.php?topic=21747.msg169650#msg169650

Ahí uso interrupciones, es mejor para escanear teclados, el resultado de la tecla se guarda en un byte y se pueden usar cualquier pines correspondientes a las columnas.


está en ccs, no creo que sea muy dificil portarlo al cc5x
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Teclado Matricial conectado a PIC16F877A, no me funciona el programa.
« Respuesta #2 en: 18 de Marzo de 2009, 22:43:20 »
char TECLA,TECLA_C,TECLA_F;
utiliza unsigned int.....

y despues....
TECLA=TECLA_F|TECLA_C;//el bit que cambio en las filas queda guardado en TECLA_F.

no seria mejor
TECLA=TECLA_F+TECLA_C;      // ejemplo 11010000 + 00001110= 11011110
ya que los nibbles de mayor peso no afectan a los de menor efecto y viceversa
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado mi_chell2002

  • PIC10
  • *
  • Mensajes: 15
Re: Teclado Matricial conectado a PIC16F877A, no me funciona el programa.
« Respuesta #3 en: 24 de Marzo de 2009, 13:29:00 »
Voy a  probar con lo que me dices pero me queda la  siguiente duda, cuando se lee el PORTB en este caso en las entradas habrá unos osea 1111 para los cuatro bits de la parte alta savemos por otro lado que la parte baja del byte esta configurada como salida es aqui donde tengo la duda como son leidos estos( de hecho no son leidos por estar estos bits configurados como salidas¡), entonces al leer el PORTB el byte ( sin presionar ninguna tecla quedaría)  11110000 ( ¿completa con ceros los bits bajos que estan como salidas? ) gracias por tu ayuda y nueva respuesta.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Teclado Matricial conectado a PIC16F877A, no me funciona el programa.
« Respuesta #4 en: 24 de Marzo de 2009, 15:50:10 »
revisa estas lineas....

while (TECLA_C!=0xF0)
         {
           
           TRISB=0b00001111;//habilita las filas como entradas en los bits A0-A3.
           OPTION.7=0;
           TECLA_F=PORTB;
           
           TECLA=TECLA_F|TECLA_C;//el bit que cambio en las filas queda guardado en TECLA_F.
           TECLA_F=0x0F;


creo que antes de cambiar las entradas/salidas deberias de guardar el estado del puerto portb

  while (TECLA_C!=0xF0)
         {
           OPTION.7=0;
           TECLA_F=PORTB;         //guarda el estado del portb
           TRISB=0b00001111;     //y despues habilita las filas como entradas en los bits A0-A3
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado mi_chell2002

  • PIC10
  • *
  • Mensajes: 15
Re: Teclado Matricial conectado a PIC16F877A, no me funciona el programa.
« Respuesta #5 en: 26 de Marzo de 2009, 11:13:06 »
respecto de lo que me dices de guardar  PORTB antes de cambiar las entradas esto lo hago antes  en TECLA_C=PORTB dentro del ciclo infinito
while(1) ó ¿hay que hacerlo otra vez en el siguiente while? por favor confirmame...gracias por tu ayuda.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Teclado Matricial conectado a PIC16F877A, no me funciona el programa.
« Respuesta #6 en: 26 de Marzo de 2009, 11:53:55 »
que pic es el que estas utilizando?
por que no cuelgas el circuito y le echamos un vistazo?
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado mi_chell2002

  • PIC10
  • *
  • Mensajes: 15
Re: Teclado Matricial conectado a PIC16F877A, no me funciona el programa.
« Respuesta #7 en: 01 de Abril de 2009, 16:00:14 »
el pic 16f877a


 

anything