Está en la página 1de 13

Direccionamiento Indirecto y Teclado Matricial 55

PRÁCTICA 5

DIRECCIONAMIENTO INDIRECTO Y TECLADO MATRICIAL

OBJETIVO:

‰ Identificar la forma de operar del modo de direccionamiento indirecto.

‰ Analizar el funcionamiento del un teclado matricial y sus algoritmos de


decodificación.

‰ Aplicar el direccionamiento indirecto al programa de decodificación de un teclado


matricial

INTRODUCCION

En la programación de los microcontroladores PIC de la gama media la mayoría de las


instrucciones emplean direccionamiento directo, pero también es posible que operen en
un modo de direccionamiento indirecto.

Para el direccionamiento indirecto se emplean dos registros especiales: el FSR y el INDF


(éste último no es un registro físico). El registro FSR se emplea para “señalar o apuntar” a
una dirección cuyo contenido después puede ser leído ó escrito de forma indirecta
empleando cualquier instrucción que use como operando al registro INDF.

Internamente, a diferencia del direccionamiento directo, la dirección eficaz de 9 bits en un


direccionamiento indirecto se obtiene concatenando los 8 bits del registro FSR con el bit
IRP de registro STATUS (figura 5.1).

Figura 5.1: Direccionamiento directo vs. direccionamiento indirecto.

Eduardo Romero A. Laboratorio de Sistemas Digitales III


Direccionamiento Indirecto y Teclado Matricial 56

De tal forma, que esta forma de direccionamiento es particularmente útil cuando se


manejan tablas o arreglos de datos.

MATERIAL Y EQUIPO EMPLEADO

Laboratorio equipado con computadoras que tengan instalado el MPLAB versión


v7.40 o superior y el WinPic800 v3.55 g.

Cantidad Descripción
1 Programador compatible con WinPic800.
1 Microcontrolador PIC16F628
1 Teclado Matricial 4x4
8ó1 Leds o barra de leds
4 Resistencia de 330 Ω
8 Resistencia de 4.7 kΩ
1 Tableta experimental
1 Fuente de alimentación de CD

Pre-reporte:

‰ Leer previamente toda la práctica

‰ Descargar MPLAB v7.40 o superior y el WinPic800 v3.55 g de la página del curso


y llevarlos el día de la sesión.

‰ Llevar implementado en un protoboard el circuito de la figura 5.5

DESARROLLO

I. Direccionamiento indirecto

1.- Edite el siguiente programa con MPLAB y cree el proyecto de la forma acostumbrada.
Ensamble y depure hasta que no existan errores o “warnings”.

; Programa que realiza la suma de 10 números almacenados


; a partir de la dirección 23h de la memoria de datos

LIST P=16F628A
RADIX HEX
include "p16F628a.inc"

cblock 20h
SUMAH
SUMAL
LONG
endc

org 23h
TABLA res .20

Eduardo Romero A. Laboratorio de Sistemas Digitales III


Direccionamiento Indirecto y Teclado Matricial 57

org 0
goto INICIO

org 5

INICIO
clrf SUMAH ; Suma total parte alta = 00h
clrf SUMAL ; Suma total parte baja = 00h
movlw .10 ; Cantidad de números
movwf LONG ; a sumar = 10
movlw TABLA ; Coloca apuntador
movwf FSR ; al inicio de la tabla
OTRO_NUM:
movf SUMAL,w ; w <-- SUMAL
addwf INDF,w ; w <-- SUMAL+(INDF)
movwf SUMAL
btfsc STATUS,C ; Hubo acarreo?
incf SUMAH,f ; SI, SUMAH ++
incf FSR,f ; Apunta al sig. elemento de la tabla
decfsz LONG ; Es el último elemento?
goto OTRO_NUM ; No, continua sumando
goto $ ; Si, termina

END

2. Elabore el diagrama de flujo correspondiente al programa.

3. Proceda a inicializar la tabla con los valores a sumar, con el menú view>> 4 file
registers, lo cual desplegará una ventana donde se puede modificar el contenido de los
GPR’s. En nuestro caso vamos a introducir FFh en el contenido de las direcciones de
memoria de la 23h a la 2Ch, tal como lo muestra la figura 5.2

Figura 5.2: Ventana que muestra el contenido de las direcciones 23h a 2Ch.

Eduardo Romero A. Laboratorio de Sistemas Digitales III


Direccionamiento Indirecto y Teclado Matricial 58

3. Inserte un punto de ruptura (BREAK-POINT) en la instrucción decfsz LONG (Para


insertar un punto de ruptura, dar doble “click” con el ratón posicionado en la instrucción,
para borrarlo dar doble “click” nuevamente).

4. Active el simulador MPLAB SIM en Debugger>>Select tool>>MPLAB SIM y simule un


RESET al microcontrolador, con el botón , a continuación ejecute la simulación del
programa con el botón RUN . Escriba el valor que tienen las siguientes variables
cuando la simulación se detiene al llegar al punto de ruptura.

SUMAH ________ LONG __________ SUMAL _________ FSR ____________

5. Reanude la simulación y vuelva anotar el contenido de los registros. Repita este paso
hasta que el programa finalice. Englobe sus resultados en la tabla 6.1.

Tabla 5.1: Valor de las variables del programa durante su ejecución.

SUMAH SUMAL FSR LONG


Pasada 1
Pasada 2
Pasada 3
Pasada 4
Pasada 5
Pasada 6
Pasada 7
Pasada 8
Pasada 9
Pasada 10

6. Modifique el contenido de la tabla para que contenga FFh en todas sus localidades.
Elabore una tabla similar a la anterior.

Tabla 5.2: Valor de las variables del programa (con la tabla llena de FFh).

SUMAH SUMAL FSR LONG


Pasada 1
Pasada 2
Pasada 3
Pasada 4
Pasada 5
Pasada 6
Pasada 7
Pasada 8
Pasada 9
Pasada 10

Eduardo Romero A. Laboratorio de Sistemas Digitales III


Direccionamiento Indirecto y Teclado Matricial 59

7. Analice el programa y explique ¿De qué forma se puede incrementar la cantidad de


números que se pueden sumar?

________________________________________________________________________

________________________________________________________________________

II. Teclado matricial

Es un dispositivo de 16 teclas configurado con una matriz filas-columnas (figura 5.3) con
la intención de reducir el número de líneas de entradas y salidas necesarias para
controlarlo con el microcontrolador. En un teclado no matricial cada tecla necesita una
línea de entrada, con lo cual representa una cantidad mayor de líneas de I/O del MCU.

Para controlar el teclado, los puertos del MCU correspondientes a las filas se programan
como salidas y los conectados a las columnas del teclado se programan como entradas.
De tal forma que el objetivo principal del algoritmo para decodificar el teclado consiste en
determinar la fila y columna que corresponde a la tecla que se presionó.

Lo anterior se logra rotando un valor lógico (ya sea 1 ó 0) en cada una de las líneas
configuradas como salidas (filas en este caso) e inmediatamente después leer el estado
lógico de las líneas conectadas como entrada (columnas).

Cuando el valor lógico que se rota es un 1 al algoritmo se le denomina walking ones y


walking zeros cuando se trata de un 0.

Figura 5.3: Conexión (parcial) del teclado matricial con el PIC16F628.

Eduardo Romero A. Laboratorio de Sistemas Digitales III


Direccionamiento Indirecto y Teclado Matricial 60

8. Edite el siguiente programa con MPLAB y cree el proyecto de la forma acostumbrada.


Ensamble y depure hasta que no existan errores o warnings.

; Programa que decodifica un teclado matricial de 16 teclas y entrega el


; resultado en un display de 7 segmentos conectado en puerto A.

LIST p=16F628
RADIX HEX

w EQU 0
f EQU 1

INDF EQU 0x00


TMR_OPT EQU 0X01
PCL EQU 0x02
ESTADO EQU 0x03
FSR EQU 0x04
PORTA EQU 0x05
PORTB EQU 0x06
CMCON EQU 0x1F

TEMP1 EQU 30h


TEMP2 EQU 31h
CONTADOR EQU 32h

; Variables para la tabla


cblock 20h
CERO
UNO
DOS
TRES
CUATRO
CINCO
SEIS
SIETE
OCHO
NUEVE
L_A
L_B
L_C
L_D
L_E
L_F
Endc

ORG 0 ;Inicio del programa en dirección


goto INICIO

; Subrutina que inicializa la tabla con los valores


; que se deben enviar al puerto A, Para desplegar
; el número correspondiente a la tecla presionada

CONF_TABLA
movlw 20h
movwf FSR
; CERO
movlw 0xDE

Eduardo Romero A. Laboratorio de Sistemas Digitales III


Direccionamiento Indirecto y Teclado Matricial 61

movwf INDF
incf FSR,f
; UNO
movlw 0x50
movwf INDF
incf FSR,f
; DOS
movlw 0xCD
movwf INDF
incf FSR,f
; TRES
movlw 0xD9
movwf INDF
incf FSR,f
; CUATRO
movlw 0x53
movwf INDF
incf FSR,f
; CINCO
movlw 0x9B
movwf INDF
incf FSR,f
; SEIS
movlw 0x9F
movwf INDF
incf FSR,f
; SIETE
movlw 0xD0
movwf INDF
incf FSR,f
; OCHO
movlw 0xDF
movwf INDF
incf FSR,f
; NUEVE
movlw 0xD3
movwf INDF
incf FSR,f
; L_A
movlw 0xD7
movwf INDF
incf FSR,f
; L_B
movlw 0x1F
movwf INDF
incf FSR,f
; L_C
movlw 0x8E
movwf INDF
incf FSR,f
; L_D
movlw 0x5D
movwf INDF
incf FSR,f
; L_E
movlw 0x8F
movwf INDF

Eduardo Romero A. Laboratorio de Sistemas Digitales III


Direccionamiento Indirecto y Teclado Matricial 62

incf FSR,f

; L_F
movlw 0x87
movwf INDF
incf FSR,f
return

CONF_PUERTOS
movlw b'00000111' ; comparadores apagados
movwf CMCON ; hablilita pins de I/O
bsf ESTADO,5 ; conmuta a banco 1
movlw b'11110000' ; Config. nibble_alto de PORTB
movwf PORTB ; y nible bajo como salida
movlw b'00100000' ; Configura el Puerto A como salida
movwf PORTA ; a excepción de RA5 (salida fija)
bcf ESTADO,5 ; conmuta a banco 0
clrf PORTB ; Puerto B = 00h
clrf PORTA ; Puerto A = 00h
return

; Subrutina que rota a la izquierda la parte baja del Puerto B


ROTA_LED
movf CONTADOR,w
addwf PCL,f
goto F0
goto F1
goto F2
goto F3

F3 movlw 01h
movwf PORTB
movlw 20h
movwf FSR
return

F2 movlw 02h
movwf PORTB
movlw 24h
movwf FSR
return

F1 movlw 04h
movwf PORTB
movlw 28h
movwf FSR
return

F0 movlw 08h
movwf PORTB
movlw 2Ch
movwf FSR
return

; Subrutina que decodifica la tecla presiona y manda a escribir en el


; display de 7 segmentos de cátodo común
; Parámetro de entrada: variable TECLA

Eduardo Romero A. Laboratorio de Sistemas Digitales III


Direccionamiento Indirecto y Teclado Matricial 63

DECODIFICA
swapf PORTB,w
andlw 0Fh
movwf TEMP1
btfss TEMP1,0
goto SIGUE0
movlw 00h
goto APUNTA

SIGUE0 btfss TEMP1,1


goto SIGUE1
movlw 01h
goto APUNTA

SIGUE1 btfss TEMP1,2


goto SIGUE2
movlw 02h
goto APUNTA

SIGUE2 btfss TEMP1,3


return
movlw 03h

APUNTA addwf FSR,f


movf INDF,w
movwf PORTA
return

; Rutina de retardo de 1 ms a una frecuencia


; de oscilación de 4 MHZ en el reloj interno
RETARDO
nop ; 1 ciclo
movlw .249 ; 1 ciclo
movwf TEMP2 ; 1 ciclo
CICLO nop ; K ciclos
decfsz TEMP2,f ; (K-1)+2 ciclos
goto CICLO ; 2(K-1) ciclos
return ; 2

; Programa principal
INICIO call CONF_TABLA
call CONF_PUERTOS
AKI movlw 0xFF
movwf CONTADOR

OTRA_TECLA
incf CONTADOR,f
btfsc CONTADOR,2
goto AKI
call ROTA_LED
call RETARDO
call DECODIFICA
goto OTRA_TECLA

END

Eduardo Romero A. Laboratorio de Sistemas Digitales III


Direccionamiento Indirecto y Teclado Matricial 64

9. Para la programación del microcontrolador verifique los siguientes parámetros como se


muestran en la ventana de la figura 5.4.

Figura 5.4: Bits de configuración para programar al PIC para el ejemplo del teclado matricial.

10. Visualice el listado del programa y escriba el nombre de todas las variables que se
emplean en él.

________________________________________________________________________

________________________________________________________________________

________________________________________________________________________

11. Identifique las subrutinas y escriba que es lo que hace cada una de ellas (apóyese en
los comentarios que tiene el programa).

Tabla 5.3. Subrutinas y su respectiva función para el manejo del teclado matricial.

Subrutinas Función

Eduardo Romero A. Laboratorio de Sistemas Digitales III


Direccionamiento Indirecto y Teclado Matricial 65

12. Inserte un punto de ruptura (BREAK-POINT) en la instrucción call CONF_FUERTOS


(Para insertar un punto de ruptura, dar doble “click” con el ratón posicionado en la
instrucción, para borrarlo dar doble “click” de nuevo).

13. Ver el contenido de los GPR’s con el menú View>> 4 file registers. Con View >>
Special Function Register, se abre la ventana que nos permite ver los SFR.

14. Borre el contenido de los GPR a través del menú Debugger >> Clear Memory >>
GPR’s.

15. Simule un RESET al microcontrolador, con el botón , a continuación ejecute la


simulación del programa con el botón RUN .

16. Observe que cuando la simulación llega al punto de ruptura se detiene.

17. En las ventanas que muestran el contenido de los GPR’s y SFR’s se puede notar que
el simulador nos indica con color rojo los registros que han cambiado. Anote el valor que
tienen ahora las variables.

________________________________________________________________________

________________________________________________________________________

18. Ahora simule paso a paso la subrutina CONF_PUERTOS. Explique brevemente que
es lo que hace.

________________________________________________________________________

________________________________________________________________________

19. Continué ejecutando el programa hasta que llegar a la subrutina ROTA_LED. ¿Qué
valor tiene la variable CONTADOR?

________________________________________________________________________

________________________________________________________________________

20. Ejecute paso a paso la subrutina ROTA_LED hasta la instrucción addwf PCL, f,
¿Cuál es su función dentro del programa?

________________________________________________________________________

________________________________________________________________________

Eduardo Romero A. Laboratorio de Sistemas Digitales III


Direccionamiento Indirecto y Teclado Matricial 66

21. En la rutina ROTA_LED hay 4 secciones de código cada una rotuladas con las
etiquetas F0, F1, F2, y F3. ¿Cuál es la función que realizan?

________________________________________________________________________

________________________________________________________________________

22. Analice la subrutina DECODIFICA con la ayuda del simulador. Explique ¿Cómo se
realiza la decodificación de la tecla pulsada?

________________________________________________________________________

________________________________________________________________________

23. Descargue su programa al microcontrolador e implemente el circuito. Verifique su


funcionamiento.

24. Analice la conexión del puerto A con el display. ¿Por qué no se utilizó la terminal
RA5/MCLR?

________________________________________________________________________

________________________________________________________________________

25. ¿Por qué la conexión en RA4/TOCK1/CMP2 es diferente a las demás?

________________________________________________________________________

________________________________________________________________________

26. Vuelva comentario la línea de código call RETARDO, ensamble y reprograme el PIC
nuevamente y experimente. ¿Funciona bien el teclado?

________________________________________________________________________

Explique ¿porqué es necesaria esa línea de código?

________________________________________________________________________

________________________________________________________________________

Eduardo Romero A. Laboratorio de Sistemas Digitales III


Direccionamiento Indirecto y Teclado Matricial 67

Figura 5.5: Circuito principal del teclado matricial.

Eduardo Romero A. Laboratorio de Sistemas Digitales III