9
TECLADOS MATRICIALES Ejemplo de un programa que se encarga de manejar tres displays de siete segmentos de representación (más el correspondiente al punto decimal) como dispositivos de salida y un teclado matricial 4x4 como elemento de entrada. Los 3 displays se encuentran montados al PIC. Se activan los displays con 3 líneas del PORTA (RA1, RA2 y RA3) y los segmentos con el PORTD según el esquema que se muestra en la figura 1. En los displays se pueden representar los números del 0 al 9 y las letras de la A a la F, estos caracteres se pueden seleccionar desde el teclado. Inicialmente aparecerán tres “ceros” (000) y a medida que se van pulsando las teclas, van apareciendo por la derecha los caracteres asociados a las teclas pulsadas y lo desplazan todo una posición hacia la izquierda. El teclado responde al esquema eléctrico y la disposición mostrada en la figura 2 e irá conectado al PORTB según el orden que se representa en la figura 3. Se suministra el algoritmo y el código fuente de una posible solución empleando el procedimiento de identificación de la tecla pulsada por inversión de línea. En la placa PICDEM2 PLUS se dispone de un oscilador que proporciona una frecuencia de 4 MHz y el diseño se basa en el empleo de un microcontrolador PIC16F877 (o su versión mejorada PIC16F877A).

Practica Teclados Matriciales y Display

Embed Size (px)

DESCRIPTION

practica de la utilizacion de un teclado matricial en un Microcontrolador PIC explica la logica y el codigo utilizadp

Citation preview

Page 1: Practica Teclados Matriciales y Display

TECLADOS MATRICIALES

Ejemplo de un programa que se encarga de manejar tres displays de siete segmentos de representación (más el correspondiente al punto decimal) como dispositivos de salida y un teclado matricial 4x4 como elemento de entrada.

Los 3 displays se encuentran montados al PIC. Se activan los displays con 3 líneas del PORTA (RA1, RA2 y RA3) y los segmentos con el PORTD según el esquema que se muestra en la figura 1.

En los displays se pueden representar los números del 0 al 9 y las letras de la A a la F, estos caracteres se pueden seleccionar desde el teclado. Inicialmente aparecerán tres “ceros” (000) y a medida que se van pulsando las teclas, van apareciendo por la derecha los caracteres asociados a las teclas pulsadas y lo desplazan todo una posición hacia la izquierda. El teclado responde al esquema eléctrico y la disposición mostrada en la figura2 e irá conectado al PORTB según el orden que se representa en la figura 3.

Se suministra el algoritmo y el código fuente de una posible solución empleando el procedimiento de identificación de la tecla pulsada por inversión de línea.

En la placa PICDEM2 PLUS se dispone de un oscilador que proporciona una frecuencia de 4 MHz y el diseño se basa en el empleo de un microcontrolador PIC16F877 (o su versión mejorada PIC16F877A).

Page 2: Practica Teclados Matriciales y Display
Page 3: Practica Teclados Matriciales y Display

Una posible solución

En el programa principal se estará realizando de manera permanente el barrido de los 3 displays de 7 segmentos y se utilizarán tres posiciones auxiliares para almacenar el carácter que se debe mostrar en cada uno de los displays: D_IZQ D_CENTRO D_DCHA

En cada momento sólo se activará un display y se buscará en una tabla, los segmentos a iluminar para poder representar el carácter almacenado en cada una de las posiciones anteriormente referidas. Cada carácter se mantendrá en el display durante 5ms (aproximadamente) con lo cual el barrido completo se sitúa en torno a los 15ms (suficientemente rápido como para crear el efecto óptico de que todos los displays están encendidos). La temporización de 5 ms de retención de cada display la realizaremos con el temporizador TMR0: 5ms = (4/4MHz) x [Prescaler de TMR0 x (256 - Precarga TMR0)+2] Elegimos: Prescaler de TMR0 = 128

y despejando se obtiene: Precarga de TMR0 = 216,95 -> 217 -> 0xD9

La detección de la pulsación en el teclado se realizará mediante interrupción por cambio en las 4 líneas más altas del PORTB desde la última lectura del puerto y la identificación de la tecla pulsada empleará el procedimiento de INVERSIÓN DE LÍNEA

Antes de dar como válida una pulsación de cualquiera de las teclas, se establece una temporización que permita descartar posibles rebotes que podrían aparecer en las teclas, la temporización se realiza sin dejar de realizar el barrido de los displays y se consigue llamando 7 veces a un subprograma que realiza un barrido completo de los tres displays para así completar unos 105 ms de espera (7 x 15 ms) antes de volver a examinar el estado de los teclas y poder asegurar así la desaparición de rebotes.

Algoritmo utilizado:

INICIALIZACIÓN

Dirección de datos en los Puertos: PORTA (RA1, RA2 y RA3 son las salidas para selección de display, el resto

entradas). De momento se ponen las salidas a 1 para desactivar todos los displays . Se definen las líneas como digitales en el registro ADCON1.

Page 4: Practica Teclados Matriciales y Display

PORTD (todo de salida ya que se usa para manejo de los segmentos: RD0 el a, RD1 el b, ..., RD6 el g y RD7 el punto decimal)

PORTB (RB0 a RB3 como salidas y RB4 a RB7 como entradas) para conexión del teclado. Se activan las resistencias de polarización ( pull-up) para las entradas de este puerto

Se sacan “ceros” por las salidas del PORTB para distinguir de los “unos” que aparecen en las entradas gracias a las resistencias de pull-up cuando estas líneas quedan al “aire”

Inicializamos a cero las variables que guardan los caracteres a mostrar en los displays (D_IZQ, D_CENTRO y D_DCHA) para “arrancar” mostrando tres ceros

INTERRUPCIONES: Se habilita la máscara de interrupción por cambio en las líneas RB4 a RB7 (máscara

RBIE en registro INTCON) Se borra el flag RBIF en el mismo registro Se lee el PORTB para poder detectar cambio a partir de esta lectura

BUCLE DEL PROGRAMA PRINCIPAL

Llamada al Subprograma de Barrido de los Displays Volvemos al principio de bucle

(De este bucle únicamente se puede salir si se produce una interrupción por cambio en alguna de las 4 líneas más altas del PORTB desde la última ocasión en que se hizo la lectura de dicho puerto)

SUBPROGRAMA DE BARRIDO DE LOS DISPLAYS(Este subprograma completa un barrido de los tres displays)

Sacamos el carácter para el display de la derecha: Activación del display con RA3=0, RA2=1 y RA1=1 Tomamos el carácter guardado en la posición D_DCHA Se busca en una tabla de los led a iluminar (Subprograma TABLA) y los sacamos

por el PORTD Espera durante 5 ms (llamada a Subprograma ESPERA) Establecemos un tiempo muerto: apagamos todos los segmentos Mostramos el display del centro: ídem a lo anterior pero con posición D_CENTRO y

activando el display con RA3=1, RA2=0 y RA1=1 Display de la izquierda: ídem con posición D_IZQ (para activarlo RA3=1, RA2=1 y

RA1=0) Retorno de subprograma de Barrido de Displays

SUBPROGRAMA ESPERA

Se precarga TMR0 con 0xD9 Se sitúa el flag T0IF a 0

Page 5: Practica Teclados Matriciales y Display

Esperamos a que T0IF se ponga a 1 Retorno de subprograma

TABLAS EN LA MEMORIA DE PROGRAMA: SUBPROGRAMA TABLA Se emplea para obtener los segmentos a iluminar para mostrar un determinado carácter

Entramos en el subprograma llevando en W el dígito hexadecimal (de 0 a 9 ó bien de A a F) que queremos mostrar en los displays

Llamamos a una tabla de búsqueda que nos devuelve los segmentos a iluminar, las salidas asociadas a los led a iluminar deben estar a 0 para representar tal dígito ya que se manejan los cátodos de displays de ánodo común.

SUBPROGRAMA BUSCA Se utilizará para obtener el carácter correspondiente a cada tecla: conocida la fila y la columna de la tecla pulsada, qué carácter corresponde a esa posición

Entraremos en el subprograma llevando en W el código de la columna y la fila donde está la tecla que hemos localizado:

Retornamos trayendo en W el carácter que está en esa posición del teclado

Estas dos tablas se deben colocar en las primeras 256 posiciones de la memoria de programa (entre 0x0000 y 0x00FF) para que a la hora de desplazarnos en las tablas, sumando PCL con W, no sea necesario modificar el valor inicial de PCLATH (a cero desde el reset).

PROGRAMA DE TRATAMIENTO DE LA INTERRUPCIÓN (debida al cambio en PORTB: en cualquiera de las líneas 7 a 4) Si no está el flag RBIF a 1 salimos del programa de tratamiento

Salvaguarda del contexto (W, STATUS y PCLATH) Llamamos a subprograma de espera para descartar posibles rebotes

(subprograma NO_REBOTE). El subprograma hace la espera con 7 barridos completos de los displays

Comprobamos si todas las líneas altas del PORTB (RB7 a RB4) están a uno, si lo estuvieran es que entró la interrupción al “liberar” una tecla y en ese caso no hay que identificar nada, nos vamos a un punto de salida del programa de tratamiento que asegure que RBIF se pone a cero y recuperamos el contexto

Si hay alguna línea de las “altas” del PORTB a cero es que hay una tecla pulsada y vamos a identificarla mediante la inversión de línea: o Leemos el PORTB y lo almacenamos en una posición auxiliar (LEIDO) o Cambiamos la dirección de los datos en el PORTB: RB7 a RB4 pasan a ser líneas de salidas y RB3 a RB0 pasan a ser de entrada. o Cargamos el valor leído y almacenado (LEIDO) en el PORTB

Se espera un par de ciclos de instrucción para la estabilización de las señales o Se explora desde RB0 a RB3 (entradas ahora) para detectar dónde está el “cero” y

Page 6: Practica Teclados Matriciales y Display

codificar la fila, se pretende obtener en dos bits de W la fila y en otros dos la columna:

FILA 0: (bit 0 del PORTB)Si hay un cero en el bit 0 del PORTB se pone a 0 el registro WFILA 1: (bit 1 del PORTB)Si hay un cero en el bit 1 del PORTB se carga b’00000001’ en el registro WFILA 2: (bit 2 del PORTB)Si hay un cero en el bit 2 del PORTB se carga b’00000010’ en el registro W FILA 3: (bit 3 del PORTB)Si hay un cero en el bit 3 del PORTB se carga b’00000011’ en el registro W o Se explora dónde está el “cero” de RB4 a RB7 (salidas) para obtener el código de la columna que está a “cero”

COLUMNA_0: (bit 7 del PORTB) Si hay un cero en el bit 7 del PORTB se dejan a 0 los bits 2 y 3 del registro WCOLUMNA_1: (bit 6 del PORTB)Si hay un cero en el bit 6 del PORTB se realiza una operación OR entre el valor b’00000100’ y el actual del registro WCOLUMNA_2: (bit 5 del PORTB)Si hay un cero en el bit 5 del PORTB se realiza una operación OR entre el valor b’00001000’ y el presente en el registro WCOLUMNA_3: (bit 4 del PORTB)Si hay un cero en el bit 4 del PORTB se realiza una operación OR entre el valor b’00001100’ y el presente en el registro W o Ya tenemos en W codificada la fila y la columna, llamamos al subprograma BUSCA que nos devuelve en W el carácter ubicado en esa fila y esa columna

o Retornamos de esa tabla trayendo en W el carácter situado en la columna y fila identificadas y ese carácter lo cargamos en la posición AUX o Provocamos el “desplazamiento” hacia la izquierda de la posición de los caracteres que aparecerán en los displays:

Para dejar el PORTB conectado al teclado como estaba, volvemos a definir las 4 líneas bajas del PORTB como salidas y las 4 líneas altas como entradas

Page 7: Practica Teclados Matriciales y Display

Se sacan cuatro ceros por las salidas del PORTB, leemos el PORTB para detectar cambios a partir de aquí de RB7 a RB4 y ponemos el flag RBIF a cero

Salimos recuperando el contexto (PCLATH, STATUS y W) Retorno de programa de tratamiento de interrupción

SUBPROGRAMA NO_REBOTE

(Subprograma de temporización de 105 ms con 7 barridos de los displays de 7 segmentos)

Cargamos un contador con un valor 7 (posición AUX) Llamamos a subprograma de Barrido de los displays (15ms) Decrementamos el contador de barridos Si el contador no llegó a 0 entonces repetimos la llamada al barrido de los displays

si llegó a cero (hemos repetido ya 7 veces) entonces retornamos del subprograma