Professional Documents
Culture Documents
49
Interrupciones
50
La Figura 4-4 muestra una posible conexin de un teclado matricial a un microcontrolador con las siguientes caractersticas:
Interrupciones
51
Las filas del teclado se conectan a las lneas de la parte baja del PORTB configuradas como salida. Las columnas del teclado se conectan a las lneas de la parte alta del PORTB configuradas como entrada. Observe que estas lneas deben tener resistencias de pull-up. En el caso del PIC18F4550, todos los pines del PORTB poseen resistencias de pull-up internas que pueden ser activadas por software.
Para detectar que tecla se pulsa, se aplica a una fila un nivel bajo y a las otras filas un nivel alto. Si se presiona una tecla en la fila por la que se aplica el nivel bajo, ese nivel bajo aparecer en la columna correspondiente con la que ha hecho contacto. En la Figura 4-4 se pulsa la tecla 3, de tal forma que cuando el microcontrolador explora la fila F1, este cero aparece en la columna C3 y es ledo por el pin RB6.
52
SI
SI
SI
SI
NO
Fin
Figura 4-6. Algortmo de deteccin de tecla pulsada
Interrupciones A continuacin se muestra una funcin llamada leeTecla la cual implementa el algoritmo anterior en lenguaje C:
// Esta funcion obtiene la tecla pulsada del // teclado matricial y la decodifica. // Regresa el caracter ASCII que representa la tecla int leeTecla(void) { int tecla = 0; int fila = 0x0E; PORTB = fila; do { //Columna1 = 0? if(PORTBbits.RB4 == 0) break; //si tecla++; //no //Columna2 = 0? if(PORTBbits.RB5 == 0) break; tecla++; //Columna3 = 0? if(PORTBbits.RB6 == 0) break; tecla++; //Columna4 = 0? if(PORTBbits.RB7 == 0) break; tecla++; //Siguiente Fila=0, las demas Filas fila <<= 1; fila++; PORTB = fila; }while(tecla < 16); //ltima tecla? LATB = 0; // Decodifica la tecla switch(tecla) { case 0: return '7'; case 1: return '8'; case 2: return '9'; case 3: return '/'; case 4: return '4'; case 5: return '5'; case 6: return '6'; case 7: return 'X'; case 8: return '1'; case 9: return '2'; en 1
53
Interrupciones
case 10: return '3'; case 11: return '-'; case 12: return 'C'; case 13: return '0'; case 14: return '='; case 15: return '+'; default: return -1; } }//fin de funcin leeTecla Programa 4-4. Algoritmo de lectura del teclado, funcin leeTecla
54
En la funcin anterior, una vez terminado el ciclo do-while, en la variable tecla se tiene el nmero de tecla pulsada (de 0 a 15). Teniendo este nmero se decodifica al valor final deseado usando un switch (puede ser el que indica la serigrafa del teclado).
Ahora la idea es que cuando se pulse cualquier tecla se produzca una interrupcin RBI, para esto usamos la funcin OpenPORTB y habilitaremos las interrupciones con el bit GIE del registro INTCON. La funcin iniciaTeclado mostrada en el cdigo siguiente deja listo el microcontrolador para detectar las interrupciones RBI.
// Esta funcin Activa la interrupcin RBI y Pull-ups internas // para detectar la tecla pulsada void iniciaTeclado(void) { // Configura el nible alto de PORTB como entrada // y el nible bajo como salida TRISB = 0xF0; PORTB = 0; // Inicia PORTB para recibir interrupcion // Configura interrupcion por cambio de estado en PORTB y // activa pull-ups OpenPORTB( PORTB_CHANGE_INT_ON & PORTB_PULLUPS_ON); // Habilitacin de interrupciones INTCONbits.GIE = 1; } Programa 4-5. Funcin iniciaTeclado
La funcin setTeclado se usa para dejar listo el puerto para recibir interrupciones, esta funcin la podemos usar en caso que el teclado y el display compartan el mismo puerto, ya que las funcin del LCD modifican el puerto.
Interrupciones
// Esta funcin Deja listo el puerto B para detectar una tecla pulsada // Se usa porque las funciones del LCD modifican TRISB y PORTB void setTeclado(void) { // Configura el nible alto de PORTB como entrada // y el nible bajo como salida TRISB = 0xF0; //Deja listo PORTB para producir interrupcion (salidas enviando 0) PORTB = 0; } Programa 4-6. Funcin setTeclado
55
Estas 3 funciones anteriores forman parte de un archivo llamado teclado.c el cual forma parte de una librera denominada teclado.h, cuyo contenido se muestra a continuacin:
#ifndef TECLADO_H #define TECLADO_H void iniciaTeclado(void); void setTeclado(void); int leeTecla(void); #endif Programa 4-7. teclado.h
Interrupciones
56
Interrupciones
Programa 4-8. Uso de Teclado Matricial y LCD
/* Uso de Teclado Matricial y LCD */ #include <p18F4550.h> #include "lcd.h" #include "teclado.h" void Teclado_ISR(void); //Cdigo para bootloader extern void _startup (void); #pragma code REMAPPED_RESET_VECTOR = 0x1000 void _reset (void) { _asm goto _startup _endasm } // Seccion de codigo #pragma code void main() { char cad[] = "Probando Teclado"; ADCON1 = 0x0f; // Configura pines como digitales
57
// configura LCD OpenLCD(FOUR_BIT & LINES_5X7); putsLCD(cad); SetDDRamAddr(0x40); // se coloca en el renglon 2 //Inicia interrupcion RBI, pull-ups y deja listo el teclado iniciaTeclado(); while(1){} } // Vector de interrupcin #pragma code Interrupcion=0x1008 void VectorInterrupcion (void) { _asm GOTO Teclado_ISR _endasm } #pragma code // Rutina de interrupcin de teclado #pragma interrupt Teclado_ISR void Teclado_ISR(void) { int tecla; tecla = leeTecla(); while(leeTecla()!=-1); if(tecla != -1) { WriteDataLCD(tecla); // lee y decodifica la tecla pulsada //espera a que se suelte la tecla // si hay tecla valida // escribe la tecla pulsada en LCD
// deja listo el teclado para la siguiente interrupcin setTeclado(); } // Limpia la bandera de interrupcion INTCONbits.RBIF = 0; }
Interrupciones
58