Autor Tema: Interrupcion de teclado PIC18F4550  (Leído 2375 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado DavidtXz

  • PIC10
  • *
  • Mensajes: 22
Interrupcion de teclado PIC18F4550
« en: 19 de Abril de 2020, 20:04:47 »
Código: C
  1. #include <xc.h>
  2. #define _XTAL_FREQ 1000000
  3. #pragma config FOSC=INTOSC_EC
  4. #pragma config WDT=OFF
  5. #pragma PBADEN=OFF
  6.  
  7. #define fila1 RB0
  8. #define fila2 RB1
  9. #define fila3 RB2
  10. #define columna1 RB5
  11. #define columna2 RB6
  12. #define columna3 RB7
  13.  
  14. unsigned char teclado;
  15. void __interrupt() ISRL();
  16. void fila1_ON();
  17. void fila2_ON();
  18. void fila3_ON();
  19. void main (){
  20.     TRISD=0;
  21.     LATD=0;
  22.     TRISB=0b11110000;
  23.     LATB=0b11110000;
  24.     RBPU=0;//prender resistencias de pull-up
  25.     teclado=PORTB;
  26.     RBIF=0; //borrar bandera
  27.     RBIE=1; //habilitar interrupciones de cambio en el puerto B
  28.     GIE=1;
  29.     while(1){
  30.     }
  31. }
  32.  
  33. void __interrupt() ISRL(){
  34.     if(RBIF==1){
  35.         teclado=PORTB;
  36.         RBIF=0;
  37.         if((teclado&0b11100000)!=0b11100000){
  38.             fila1=0; fila2=0; fila3=0;
  39.         while(columna1==1 && columna2==1 && columna3==1){
  40.         }
  41.             fila1_ON();
  42.             if(columna1==0) LATD=0x06; //num1
  43.             if(columna2==0) LATD=0x5b; //num2
  44.             if(columna3==0) LATD=0x4f; //num3
  45.             fila2_ON();  
  46.             if(columna1==0) LATD=0x66; //num4
  47.             if(columna2==0) LATD=0x6d; //num5
  48.             if(columna3==0) LATD=0x7c; //num6
  49.             fila3_ON();  
  50.             if(columna1==0) LATD=0x07; //num7
  51.             if(columna2==0) LATD=0x7f; //num8
  52.             if(columna3==0) LATD=0x67; //num9
  53.         }
  54.     }
  55. }
  56. void fila1_ON(){
  57.     fila1=0;
  58.     fila2=1;
  59.     fila3=1;
  60. }
  61. void fila2_ON(){
  62.     fila1=1;
  63.     fila2=0;
  64.     fila3=1;
  65. }
  66. void fila3_ON(){
  67.     fila1=1;
  68.     fila2=1;
  69.     fila3=0;
  70. }

Desconectado DavidtXz

  • PIC10
  • *
  • Mensajes: 22
Re:Interrupcion de teclado PIC18F4550
« Respuesta #1 en: 19 de Abril de 2020, 20:06:18 »
Buen dia, estoy tratando de crear un algoritmo de barrido con la interrupcion (RB4:RB7) para un teclado matricial, el problema es que cuando presiono una tecla de la matriz me arroja un numero aleatorio

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Interrupcion de teclado PIC18F4550
« Respuesta #2 en: 20 de Abril de 2020, 08:12:50 »

Así viendo el código por encima veo un problema es los If del barrido.

   Tienes que ir barriendo hasta encontrar la que se ha pulsado pero una vez que lo encuentras tienes que salir y no evaluar las siguientes.

  Puedes usar else if.

Código: C
  1. fila1_ON();
  2.             if(columna1==0) LATD=0x06; //num1
  3.         else if(columna2==0) LATD=0x5b; //num2
  4.            else if(columna3==0) LATD=0x4f; //num3
  5.     // sucesivamente con todas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupcion de teclado PIC18F4550
« Respuesta #3 en: 20 de Abril de 2020, 14:35:09 »
Ademas no entiendo el programa, crei que el barrido lo hacia con un timer.

Pero usualmente el barrido lo hace uno para saber que tecla cambio.. Segun lo que cambio es lo que esta presionado. Pero aca planteas esperar un cambio en el PORTB sin antes de haber efectuado el barrido, lo cual me hace un poco de ruido. Primero creo que deberias plantearnos un esquema de conexiones para luego ver como lo estas haciendo.

Desconectado DavidtXz

  • PIC10
  • *
  • Mensajes: 22
Re:Interrupcion de teclado PIC18F4550
« Respuesta #4 en: 20 de Abril de 2020, 15:06:58 »
Lo que pasa es que me dan el  algoritmo de barrido que ustedes ven el mensaje anterior......y me dicen que debo implementarlo en las interrupciones  cambio en el puerto B....

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupcion de teclado PIC18F4550
« Respuesta #5 en: 20 de Abril de 2020, 16:07:43 »
Bueno... Pero el barrido lo haces en el main. Si no cambia nada, entonces no hay boton presionado, pero si cambia algo si lo hay.
Lo unico a tener presente es que tambien vas a tener una interrupcion para cuando todas las entradas sea hagan 0 o 1 dependiendo de como tengas realizado el teclado.

Te sugiero primero que leas como multiplexar un teclado 4x4, para que entiendas el funcionamiento
Luego, entiendas el funcionamiento de la interrupcion por cambio de estados.

Pero lo mas importante es.... Como es el circuito!!!!
« Última modificación: 20 de Abril de 2020, 16:30:36 por KILLERJC »


 

anything