11
;--------------------------------------------------------- ;Autor: LONELY113 ; http://lonely113.blogspot.com ; ;Programa para control de teclado matricial 4x4 ;Adicionalmente muestra la tecla pulsada en un display ;Para teclado: Salida: RB0-RB3 ; Entradas: RB4-RB7 ;Para Display: Salidas: RB1-RB7 (7 segmentos) ; RA0 (Habilitacion catodo comun) ;--------------------------------------------------------- include "p16f84a.inc" LIST P=16f84a __CONFIG _WDT_OFF & _XT_OSC KEY EQU 0x0C DISP EQU 0x0D COUNT EQU 0x0E org 0x00 ; Inicio de programa

Tecla Do

Embed Size (px)

DESCRIPTION

dc

Citation preview

;---------------------------------------------------------;Autor: LONELY113; http://lonely113.blogspot.com;;Programa para control de teclado matricial 4x4 ;Adicionalmente muestra la tecla pulsada en un display;Para teclado: Salida: RB0-RB3; Entradas: RB4-RB7;Para Display: Salidas: RB1-RB7 (7 segmentos); RA0 (Habilitacion catodo comun);---------------------------------------------------------include "p16f84a.inc"LIST P=16f84a

__CONFIG _WDT_OFF & _XT_OSC

KEY EQU 0x0CDISP EQU 0x0DCOUNT EQU 0x0E

org 0x00 ; Inicio de programaBEGIN: bsf STATUS,5; Inicio configuracion E/S clrf PORTA ; Puerto A como salida movlw 0xF0 movwf PORTB bcf STATUS,5; Fin configuracion E/S bsf PORTA,0KEY_V: bcf STATUS,5; Fin configuracion E/S clrf PORTB bsf PORTB,0 ; Enviar bit 1 a la primera filaVERIF1: btfss PORTB,4 ; Verificar tecla pulsada en columna 1 goto VERIF2 movlw 0x01 ; Si se pulsa tecla KEY=KEY+1 addwf KEY,1 goto CON2 ; Terminar verificacionVERIF2: btfss PORTB,5 ; Verificar tecla pulsada en columna 2 goto VERIF3 movlw 0x02 ; Si se pulsa tecla KEY=KEY+2 addwf KEY,1 goto CON2 ; Terminar verificacionVERIF3: btfss PORTB,6 ; Verificar tecla pulsada en columna 3 goto VERIF4 movlw 0x03 ; Si se pulsa tecla KEY=KEY+3 addwf KEY,1 goto CON2 ; Terminar verificacionVERIF4: btfss PORTB,7 ; Verificar tecla pulsada en columna 4 goto CON1 movlw 0x04 ; Si se pulsa tecla KEY=KEY+4 addwf KEY,1 goto CON2 ; Terminar verificacionCON1: incf COUNT,1 ; COUNT almacena filas ya verificadas movlw 0x04 subwf COUNT,0 btfss STATUS,2 goto CON3 clrf KEY ; Si COUNT=4 (todas las filas verificadas) clrf COUNT ; borrar COUNT y BORRAR KEY goto DISPLCON3: rlf PORTB ; Envia bit 1 a la siguiente fila movlw 0x04 ; Si no se detecta tecla pulsada en una fila addwf KEY,1 ; KEY=KEY+4 goto VERIF1CON2: movf KEY,0 ; KEY almacena la tecla pulsada (1-16 decimal) movwf DISP clrf KEY clrf COUNTDISPL: bsf STATUS,5; Inicio configuracion E/S clrf PORTB ; PortB como salida bcf STATUS,5; Fin configuracion E/S movf DISP,0 call CONV movwf PORTB ; Mostrar tecla pulsada en display bcf PORTA,0 ; Habilitar display nop bsf PORTA,0 ; Deshabilitar display bsf STATUS,5; Inicio configuracion E/S movlw 0xF0 ; RB0-RB3 salidas y RB4-RB7 entradas movwf PORTB ; Fin configuracion E/S goto KEY_V

;SubroutinesCONV: addwf PCL,1 ;Convierte hexadecimal a 7 segmentos retlw 0x00 ;" " retlw 0x0C ;1 tecla 1 retlw 0xB6 ;2 tecla 2 retlw 0x9E ;3 tecla 3 retlw 0xE2 ;F tecla 4 retlw 0xCC ;4 tecla 5 retlw 0xDA ;5 tecla 6 retlw 0xFA ;6 tecla 7 retlw 0xF2 ;E tecla 8 retlw 0x0E ;7 tecla 9 retlw 0xFE ;8 tecla 10 retlw 0xDE ;9 tecla 11 retlw 0xBC ;D tecla 12 retlw 0xEE ;A tecla 13 retlw 0x7E ;0 tecla 14 retlw 0xF8 ;B tecla 15 retlw 0x72 ;C tecla 16

end ; Fin de programa

Teclado Matricial con PICporRubn| jul 26, 2013 |Tutoriales PIC|6 Comments

Vamos a explicarcomo conectar un tecladomatricial tipo membrana a un microcontrolador PIC mediante un sencillo ejemplo. El mtodo que proponemos permite conectar a nuestro microcontrolador 16 teclas usando solamente 8 pines. El cdigo debera ser vlido para cualquier microcontrolador, incluso de otras marcas, aunque siempre habr que revisarlo y posiblemente realizar algunas adaptaciones si se migra a otra plataforma, sin embargo, el algoritmo permanece igual con cualquier microcontrolador.El ejemplo se realiz para unPIC16F88, aunque como ya hemos mencionado, es compatible bsicamente con cualquiermicrocontrolador PIC. Debido a que el programa utiliza todos los bits del puerto B en nuestro microcontrolador, pensamos que tal vez sea buena idea utilizar unPICcon buena cantidad de pines como unPIC16F877o unPIC18F4550,por mencionar un par de ejemplos de micros populares. Para este ejemplo, utilizamosXC8 y MPLAB Xcomo entorno de desarrollo.En nuestra portada mostramos el equipo que hemos utilizado para probar el teclado matricial, incluido el PIC16F88 en una tarjeta entrenadora y el PICKit 3 como programador/depurador.Como funciona un teclado matricial?El principio de funcionamiento es sencillo y es similar a lo que haramos para multiplexar leds o dipslays de 7 segmentos. El programa configura el puerto B del PIC de la siguiente forma:RB4 a RB7 funcionan como salidas y la otra mitad (RB0-RB3) como entradas. Las filas (horizontal) del teclado matricial se conectan a los bits ms significativos que funcionan como salidas, mientras que las columnas (vertical) se conectan a los bits menos significativos del puerto que funcionan como entradas con resistencias pull-down.Cualquier tecla que se oprima en una columna causar que uno de los bits menos significativos del puerto (RB0 RB3) cambie de un estado lgico bajo a un estado alto.La siguiente imgen muestra las conexiones del teclado al puerto B del microcontrolador. La imagen muestra el teclado en reposo (sin teclas oprimidas).

Que pasa cuando se oprime una tecla en un teclado matricial? la corriente puede fluir a travs del switch y el voltaje de los pines conectados a las filas del teclado (5 V o nivel alto) aparece ahora tambin en alguno de los pines RB0 a RB3 segn la columna en la que se encuentra la tecla oprimida. La siguiente imagen ilustra lo que sucede al oprimir una tecla: al oprimir el botn 6 provocamos un cambio en el PIN RB2 que ahora recibe un 1 o estado alto. Sabemos entonces que se ha pulsado un botn en la segunda columna y se muestra como un nivel lgico alto aparece en los bits menos significativos del puerto B, especificamente en RB2.

De esta manera el microcontrolador sabe que se ha oprimido una tecla al detectar un cambio de nivel en los bits menos significativos. Hasta el momento, se sabe que se ha oprimido una tecla en alguna columna (dependiendo del bit activo RB3 a RB0), sin embargo, no sabemos en cual fila. Para resolver en que fila se oprimi una tecla, hay que realizar unproceso de escaneo del teclado. En este proceso, colocaremos en secuencia un 1 lgico (estado alto) en los 4 bits ms significativos del puerto y leeremos el estado de los 4 bits menos significativos. Sigamos con el ejemplo en el que se ha oprimido la tecla 6 pero ahora vindolo grficamente en una animacin:

El microcontrolador escanea en forma sucesiva los pines de salida, mientras lee las entradas en la parte baja del puerto, de manera que puede detectar que teclas estn oprimidas en cada fila. Ahora solo falta escribir nuestro codigo en C que implemente los procedimientos mencionados anteriormente y nos devuelva un valor de la tecla oprimida, por ejemplo, mediante un nmero binario.Programa en C para teclado matricialEl programa es bastante sencillo e implementa todos los procesos que describimos en la teora vista anteriormente. El cdigo se ha mantenido simple intencionalmente para que se pueda apreciar el funcionamiento de la manera ms obvia posible. La funcinkeypad_read()es la encargada de realizar la mayor parte de las tareas para determinar que tecla ha sido pulsada. El valor que retorna es una palabra de 16 bits en la cual, cada uno de los bits representa una tecla, en donde un bit en estado alto representa una tecla oprimida. Como la funcin no retorna como tal la tecla pulsada, sino una cadena de bits que representan las teclas,es posible detectar cuando se presiona ms de una tecla de forma simultanea.El cdigo de esta funcin es el siguiente:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556/** * Procesa las entradas del teclado matricial y determina la tecla que esta * siendo oprimida. Retorna una palabra binaria de 16 bits en la cual los bits * que se encuentran en estado alto representan teclas oprimidas. * * Esta funcin esta diseada para poder detectar cuando se oprimen varias * teclas sin embargo, debido a limitantes de la forma de conexin del teclado * matricial, no se deben esperar resultados correctos al oprimir varias teclas * * @return Retorna una palabra de 16 bits, cada bit representa una tecla. */uint16_t keypad_read(){unsigned char count = 0;unsigned char bitmask = 0x10;// Valor de retorno de la funcion keypad_read() entero de 16 bitsuint16_t keys =0;// Revisamos si alguna de las lineas en la parte baja esta en estado alto// debido a que se ha cerrado un switch en el teclado.if( PORTB & 0x0F ){// Escaneamos las filas una por una para determinar la tecla oprimidado{// Apagamos todas las filas (parte alta)PORTB &= 0x0F;// Seleccionamos solo una como salida (bit del registro tris = 0)TRISB &= ~bitmask;// Y colocamos el pin en estado altoPORTB |= bitmask;// Esperamos unos cuantos milisegundos y leemos las columnasdelay_ms(100);// Guardamos las columnas en una variable de 16 bitskeys |= (PORTB & 0x0F);// Si ya hemos leido 4 columnas, las siguientes instrucciones no son// necesarias, por lo que salimos del cicloif( count == 3 )break;// Recorremos la lectura a la izquierda para hacer espaciokeys = keys