You are on page 1of 52

DEPARTAMENTO DE ELECTRICA Y ELECTRONICA

Octubre 2017 – Febrero 2018

CARRERA DE INGENIERIA ELECTRONICA EN

TELECOMUNICACIONES

ASIGNATURA: MICROCONTROLADORES

NRC: 2094

INFORME/TRABAJO PREPARATORIO

DE LABORATORIO No.1

Profesor: Ing. Vanessa Vargas

INTEGRANTES

1. Herrera Diana

2. Sampedro Darwin

3. Venegas Marcelo

11/12/2017 - SANGOLQUI
Tema:

UTILIZACIÓN DE PUERTOS DE E/S, TECLADO MATRICIAL Y PANTALLA


LCD

1. Objetivo:

Al finalizar este laboratorio, el estudiante debe ser capaz de entender y utilizar


las funciones básicas de los puertos de entrada y salida del Microcontrolador
PIC 16F877A a través del manejo de un teclado matricial y una pantalla LCD
como periféricos.

2. Materiales y Equipos:

Materiales:

 Microcontrolador PIC 16F877A


 Elementos que constituyen su circuito básico
 Teclado matricial
 Pantalla LCD
 Grabador de PIC

Herramientas:

 Plataforma de Desarrollo MPLAB IDE –X


 Software de grabación para el PIC seleccionado

3. Procedimiento:

3.1. PREPARACION
3.1.1. Leer el capítulo 5 del texto guía.
3.1.2. Luego de consultar la bibliografía recomendada en el curso o en
otras fuentes, responda a las siguientes preguntas. En todas sus
respuestas indique la referencia bibliográfica empleada.
1. Describa brevemente los conceptos de puerto y periférico, los métodos
de transferencia paralela de datos, y las técnicas de entrada y salida.

Puerto: circuito que forma parte del microcontrolador y sirve de interfaz con
algún dispositivo externo. Si lo vemos desde el ámbito de programación, los
puertos se identifican por sus direcciones, ubicadas por lo general en la
memoria de datos.

Periférico: dispositivo externo conectado al microcontrolador. Algunos de


periféricos tenemos interruptores, teclados matriciales, displays de 7
segmentos o de cristal líquido. Por supuesto, todos estos periféricos deben
incluir un circuito de interfaz que es necesario para conectar a los puertos del
microcontrolador.

Métodos de transferencia paralela de datos: la transferencia de datos entre


un periférico y un puerto se realiza básicamente mediante uno de los métodos
siguientes:

 E/S simple: es caracterizada porque entre el puerto y el periférico


solamente se transfieren los bits del dato, sin señales de control.

 E/S controlada: en cambio en este método se establece una


“conversación” entre el puerto y el periférico. Para realizar la E/S
controlada se necesitan de algunas señales de control y algún protocolo
o reglas de entendimiento uno y otro dispositivo.

Técnicas de entrada y salida: posee dos técnicas las cuales son

 E/S programada: esta técnica es basada en software. Se considera la


presencia de algún indicador de estado del periférico, el estado de este
indicador es un bit cuyo valor se reconoce desde el programa que
atiende al periférico.

 E/S por interrupción: se caracteriza porque el periférico notifica cuando


necesita atención. El aviso se lo realiza mediante la solicitud de
interrupción al microcontrolador. Al obtener una solicitud de interrupción
generada por el periférico, el microcontrolador interrumpe la ejecución
del programa y ejecuta la subrutina de atención del periférico.
2. ¿Qué registros de funciones especiales están asociados a un puerto
paralelo cualquiera?

Para la manipulación de los puertos paralelos hay dos registros de funciones


especiales para cada uno de los puertos, que se denominan:

a) PORT (PORTA, PORTB, etc): estos registros almacenan el dato de


salida del puerto.

b) TRIS (TRISA, TRISB, etc): estos registros sirven para programar cada
línea del puerto correspondiente como entrada o salida.

3. ¿Cómo se programa que un terminal cualquiera de un puerto paralelo


sea entrada o salida?

Utilizamos los registros TRIS ya que son los correspondientes puertos de


entrada o salida.

Cada bit de cualquier registro TRIS se programa de la siguiente manera:

TRIS<x> = 1 programa la línea <x> del puerto como entrada

= 0 programa la línea <x> del puerto como salida.

4. La instrucción movf PORTA, W, ¿coloca en W el valor del registro de


funciones especiales PORTA o coloca el valor lógico de los terminales
del puerto A?

En este caso coloca los valores lógicos de los terminales del puerto A, para
usar el valor del registro de funciones tendríamos que usar la instrucción de la
siguiente manera:

movf TRISA,W

5. ¿Qué problemas puede presentar la modificación individual por


programa de un bit de un puerto paralelo?

Para modificar la configuración de un puerto paralelo es preferible hacerlo con


una palabra en este caso, el pic 16F877A, de 8 bits puesto que si se modifica
un único bit entonces en caso de estar precargada información externa en este
puerto, al cambiar por ejemplo de entrada a salida entonces un solo bit significa
una sola patilla del microcontrolador por lo tanto puede existir un corto, porque
si externamente se introduce un 0 lógico y desde el programa se está enviando
un 1 entonces no se sabrá cuál es el estado del pin en ese instante.

6. Comente las técnicas de E/S programada e interrupción en cuanto a


recursos necesarios y velocidad de la transferencia de datos.

E/S programada:

Cuenta con dos algoritmos por consulta y por espera. Por consulta el programa
pasa a otra tarea si el periférico no está listo, mientras que por espera el
programa que atiende al periférico espera a que esté listo para atenderle. Así el
algoritmo por consulta aprovecha el tiempo del microcontrolador ya que pasa a
otra tarea como podría ser atender a otro periférico.

E/S interrupción:

Esta técnica interrumpe al programa que este ejecutando en curso y pasa a


atender la subrutina de atención al periférico. Debido a que es una interrupción
se debe utilizar hardware para tratar la interrupción es decir un circuito
necesario para solicitar la interrupción y luego tratarla.

En cuanto a velocidad, la velocidad de transferencia de datos de un periférico


hacia el microcontrolador en ambos casos se encuentra limitada por la
velocidad con la que se ejecuten las instrucciones de un programa elaborado
para la comunicación entre el microcontrolador y el periférico

7. ¿Qué factor limita la velocidad de transferencia de datos en las técnicas


de E/S programada y por interrupción? ¿Qué solución hay para esto?

El factor que limita la transferencia de datos es el CPU ya que los datos


transferidos desde la memoria hacia los puertos de E/S tienen que pasar por el
CPU del microcontrolador y esto limita la velocidad del proceso. La solución es
utilizar una tercera técnica llamada DMA (acceso directo a memoria) la cual
consiste en que la transferencia de datos se realiza directamente entre el
periférico y la memoria. Se implementa por hardware logrando mayor velocidad
en transferencia de datos, los microcontroladores PIC no la emplean mientras
que los otros microcontroladores la usan muy poco.
ACTIVIDADES

3.2.1. Diseñe una Calculadora de 2 dígitos decimales, que sume, reste,


multiplique y divida. El ingreso de Datos se realiza mediante el uso de un
teclado matricial. En tanto que la visualización de la información tanto de los
datos ingresados como de la respuesta se despliega en una pantalla LCD.

3.2.2 Implementar el código en lenguaje ensamblador.

a) PIC 16F628A

list p=16f628a
#include "p16F628A.inc"
__config 3F18
org 0x00
bsf STATUS,RP0
movlw 0XF0
movwf TRISB
clrf TRISA
bcf OPTION_REG,NOT_RBPU
bcf STATUS,RP0
movlw 0x00
movwf PORTA
INICIO:
movlw 0x0E
movwf PORTB
btfss PORTB,4
call UNO
btfss PORTB,5
call DOS
btfss PORTB,6
call TRES
btfss PORTB,7
call LETRA_A
movlw 0x0D
movwf PORTB
btfss PORTB,4
call CUATRO
btfss PORTB,5
call CINCO
btfss PORTB,6
call SEIS
btfss PORTB,7
call LETRA_B
movlw 0x0B
movwf PORTB
btfss PORTB,4
call SIETE
btfss PORTB,5
call OCHO
btfss PORTB,6
call NUEVE
btfss PORTB,7
call LETRA_C
movlw 0x07
movwf PORTB
btfss PORTB,4
call ASTERISCO
btfss PORTB,5
call CERO
btfss PORTB,6
call NUMERAL
btfss PORTB,7
call LETRA_D
goto INICIO

CERO:
movlw 0x80
movwf PORTA
btfss PORTB,5
goto CERO
movlw 0x00
movwf PORTA
return
UNO:
movlw 0x81
movwf PORTA
btfss PORTB,4
goto UNO
movlw 0x01
movwf PORTA
return
DOS:
movlw 0x82
movwf PORTA
btfss PORTB,5
goto DOS
movlw 0x02
movwf PORTA
return
TRES:
movlw 0x83
movwf PORTA
btfss PORTB,6
goto TRES
movlw 0x03
movwf PORTA
return
CUATRO:
movlw 0x84
movwf PORTA
btfss PORTB,4
goto CUATRO
movlw 0x04
movwf PORTA
return
CINCO:
movlw 0x85
movwf PORTA
btfss PORTB,5
goto CINCO
movlw 0x05
movwf PORTA
return
SEIS:
movlw 0x86
movwf PORTA
btfss PORTB,6
goto SEIS
movlw 0x06
movwf PORTA
return
SIETE:
movlw 0x87
movwf PORTA
btfss PORTB,4
goto SIETE
movlw 0x07
movwf PORTA
return
OCHO:
movlw 0x88
movwf PORTA
btfss PORTB,5
goto OCHO
movlw 0x08
movwf PORTA
return
NUEVE:
movlw 0x89
movwf PORTA
btfss PORTB,6
goto NUEVE
movlw 0x09
movwf PORTA
return
LETRA_A:
movlw 0x8A
movwf PORTA
btfss PORTB,7
goto LETRA_A
movlw 0x0A
movwf PORTA
return
LETRA_B:
movlw 0x8B
movwf PORTA
btfss PORTB,7
goto LETRA_B
movlw 0x0B
movwf PORTA
return
LETRA_C:
movlw 0x8C
movwf PORTA
btfss PORTB,7
goto LETRA_C
movlw 0x0C
movwf PORTA
return
LETRA_D:
movlw 0x8D
movwf PORTA
btfss PORTB,7
goto LETRA_D
movlw 0x0D
movwf PORTA
return
NUMERAL:
movlw 0x8E
movwf PORTA
btfss PORTB,6
goto NUMERAL
movlw 0x0E
movwf PORTA
return
ASTERISCO:
movlw 0x8F
movwf PORTA
btfss PORTB,4
goto ASTERISCO
movlw 0x0F
movwf PORTA
return
end628A

b) PIC 16F877A

#include "p16F877A.inc"
list p=16f877A
__config(0x3f71)
CBLOCK 0x20
RETARDO1
RETARDO2
RETARDO3
DATO
RESPALDO
OPERACION
RESPUESTA
FILA
NUMERO1
NUMERO2
DSIGNO
SIGUE
N
M
VALOR
endc
ORG 0X00
#DEFINE RS PORTC,6
#DEFINE E PORTC,5
INICIO:
bsf STATUS,RP0
movlw 0x00
movwf TRISC
movlw 0x1F
movwf TRISB
bcf STATUS,RP0
movlw 0x00
movwf PORTC
LCD:
movlw 0x03
call ENVIO_CONTROL
movlw 0x02
call ENVIO_CONTROL
movlw 0x02
call ENVIO_CONTROL
movlw 0x08
call ENVIO_CONTROL
movlw 0x00
call ENVIO_CONTROL
movlw 0x0E
call ENVIO_CONTROL
movlw 0x00
call ENVIO_CONTROL
movlw 0x01
call ENVIO_CONTROL
movlw 0x00
movwf RESPALDO
movwf FILA
movwf SIGUE
movwf OPERACION
movlw 0x08
movwf VALOR
LECTURA:
btfss PORTB,4
goto LECTURA
L1:
btfsc PORTB,4
goto L1
movf PORTB,0
andlw 0x0F
movwf DATO
movlw 0x0A
subwf DATO,0
btfss STATUS,C
call NUMEROS
movlw 0x02
movwf SIGUE
movlw 0x0A
subwf DATO,0
btfsc STATUS,Z
call BORRAR
movlw 0x0B
subwf DATO,0
btfsc STATUS,Z
call SUMA
movlw 0x0C
subwf DATO,0
btfsc STATUS,Z
call RESTA
movlw 0x0D
subwf DATO,0
btfsc STATUS,Z
call IGUAL
movlw 0x0E
subwf DATO,0
btfsc STATUS,Z
call NUEVA_OPERACION
movlw 0x0F
subwf DATO,0
btfsc STATUS,Z
call SIGNO
goto LECTURA
NUMEROS:
movlw 0x01
subwf SIGUE,0
btfsc STATUS,Z
return
movlw 0x02
subwf SIGUE,0
btfsc STATUS,Z
return
movlw 0x03
call ENVIO_DATO
movf DATO,0
call ENVIO_DATO
movf DATO,0
movwf DSIGNO
addwf RESPALDO,1
swapf RESPALDO,1
movlw 0x02
movwf SIGUE
return
BORRAR:
movlw 0x00
call ENVIO_CONTROL
movlw 0x01
call ENVIO_CONTROL
clrf RESPALDO
clrf OPERACION
clrf RESPUESTA
clrf FILA
clrf SIGUE
clrf N
clrf M
movlw 0x08
movwf VALOR
return
SUMA:
movlw 0x01
subwf SIGUE,0
btfsc STATUS,Z
return
movlw 0x02
call ENVIO_DATO
movlw 0x0B
call ENVIO_DATO
movlw 0x01
movwf OPERACION
movlw 0x00
movwf SIGUE
return
RESTA:
movlw 0x01
subwf SIGUE,0
btfsc STATUS,Z
return
movlw 0x02
call ENVIO_DATO
movlw 0x0D
call ENVIO_DATO
movlw 0x02
movwf OPERACION
movlw 0x00
movwf SIGUE
return
IGUAL:
movlw 0x01
subwf SIGUE,0
btfsc STATUS,Z
return
movf VALOR,0
call ENVIO_CONTROL
movlw 0x0A
call ENVIO_CONTROL
movlw 0x03
call ENVIO_DATO
movlw 0x0D
call ENVIO_DATO
movf RESPALDO,0
andlw 0x0F
movwf NUMERO1
swapf RESPALDO,0
andlw 0x0F
movwf NUMERO2
movlw 0x01
subwf OPERACION,0
btfsc STATUS,Z
call MAS
movlw 0x02
subwf OPERACION,0
btfsc STATUS,Z
call MENOS
movlw 0x01
movwf SIGUE
return
MAS:
movlw 0x01
subwf N,0
btfsc STATUS,Z
goto MAS1
movlw 0x01
subwf M,0
btfsc STATUS,Z
goto MAS3
movf NUMERO1,0
addwf NUMERO2,0
movwf RESPUESTA
movlw 0x0A
subwf RESPUESTA,0
btfsc STATUS,C
call MAYOR
movlw 0x03
call ENVIO_DATO
movf RESPUESTA,0
call ENVIO_DATO
return
MAS1:
movlw 0x01
subwf M,0
btfsc STATUS,Z
goto MAS2
movf NUMERO1,0
movwf RESPUESTA
movf NUMERO2,0
movwf NUMERO1
movf RESPUESTA,0
movwf NUMERO2
clrf N
call MENOS
return
MAS2:
clrf M
clrf N
movlw 0x02
call ENVIO_DATO
movlw 0x0D
call ENVIO_DATO
call MAS
return
MAS3:
clrf M
call MENOS
return
MAYOR:
movlw 0x0A
subwf RESPUESTA,1
movlw 0x03
call ENVIO_DATO
movlw 0x01
call ENVIO_DATO
return
MENOS:
movlw 0x01
subwf N,0
btfsc STATUS,Z
goto MENOS1
movlw 0x01
subwf M,0
btfsc STATUS,Z
goto MENOS3
movf NUMERO2,0
subwf NUMERO1,0
movwf RESPUESTA
btfss STATUS,C
call MENOR
movlw 0x03
call ENVIO_DATO
movf RESPUESTA,0
call ENVIO_DATO
return
MENOS1:
movlw 0x01
subwf M,0
btfsc STATUS,Z
goto MENOS2
bsf M,0
goto MAS1
return
MENOS2:
clrf M
goto MAS1
return
MENOS3:
clrf M
call MAS
return
MENOR:
movlw 0x02
call ENVIO_DATO
movlw 0x0D
call ENVIO_DATO
movf NUMERO1,0
subwf NUMERO2,0
movwf RESPUESTA
return
NUEVA_OPERACION:
movlw 0x00
subwf FILA,0
btfsc STATUS,Z
goto F2
movlw 0x01
subwf FILA,0
btfsc STATUS,Z
goto F3
movlw 0x02
subwf FILA,0
btfsc STATUS,Z
goto F4
movlw 0x03
subwf FILA,0
btfsc STATUS,Z
goto F1
return
F1:
movlw 0x08
movwf VALOR
movlw 0x00
call ENVIO_CONTROL
movlw 0x01
call ENVIO_CONTROL
clrf RESPALDO
clrf OPERACION
clrf RESPUESTA
clrf FILA
clrf SIGUE
clrf N
clrf M
return
F2:
movlw 0x0C
movwf VALOR
call ENVIO_CONTROL
movlw 0x00
call ENVIO_CONTROL
clrf RESPALDO
clrf OPERACION
clrf RESPUESTA
clrf SIGUE
clrf N
clrf M
incf FILA,1
return
F3:
movlw 0x09
movwf VALOR
call ENVIO_CONTROL
movlw 0x00
call ENVIO_CONTROL
clrf RESPALDO
clrf OPERACION
clrf RESPUESTA
clrf SIGUE
clrf N
clrf M
incf FILA,1
return
F4:
movlw 0x0D
movwf VALOR
call ENVIO_CONTROL
movlw 0x00
call ENVIO_CONTROL
clrf RESPALDO
clrf OPERACION
clrf RESPUESTA
clrf SIGUE
clrf N
clrf M
incf FILA,1
return
SIGNO:
movlw 0x01
subwf SIGUE,0
btfsc STATUS,Z
return
movlw 0x00
subwf OPERACION,0
movlw 0x01
btfsc STATUS,Z
movwf N
btfss STATUS,Z
movwf M
movlw 0x01
call ENVIO_CONTROL
movlw 0x00
call ENVIO_CONTROL
movlw 0x02
call ENVIO_DATO
movlw 0x08
call ENVIO_DATO
movlw 0x02
call ENVIO_DATO
movlw 0x0D
call ENVIO_DATO
movlw 0x03
call ENVIO_DATO
movf DSIGNO,0
call ENVIO_DATO
movlw 0x02
call ENVIO_DATO
movlw 0x09
call ENVIO_DATO
return
ENVIO_DATO:
MOVWF PORTC
BSF RS
BSF E
CALL RETARDODP
BCF E
CALL RETARDODP
RETURN
ENVIO_CONTROL:
MOVWF PORTC
BCF RS
BSF E
CALL RETARDODP
BCF E
CALL RETARDODP
RETURN
RETARDODP:
movlw 0x0B
movwf RETARDO3
RET3:
movwf RETARDO2
RET2:
movwf RETARDO1
RET:
decfsz RETARDO1
goto RET
decfsz RETARDO2
goto RET2
decfsz RETARDO3
goto RET3
return
end

3.2.3 Realizar la simulación del programa.


3.2.4 Implementar el circuito electrónico correspondiente.

4. Bibliografía:

Valdés, F., Pallas, R. “Microcontroladores: fundamentos y aplicaciones con


PIC”. Ed. Marcombo. Barcelona. 2007.
Planteamiento del problema:
1.1 Programar el PIC 16F628A para que funcione como un decodificador de teclado
matricial 4x4, emulando las funciones de un 74C922, en base a la siguiente
distribución

1 2 3 
_
4 5 6 
_
7 8 9 
T
Aceptar 0 Limpiar 
T

1.2 Integrar el LCD al microcontrolador 16F877A, en configuración de bus de datos


multiplexado con las siguientes funciones.

0-9 Visualiza números 0 - 9


 Desplaza hacia la derecha el cursor una
_ posición.
 Desplaza hacia la izquierda el cursor una
_ posición.
 Desplaza hacia la derecha el texto una
T posición.
 Desplaza hacia la izquierda el texto una
T posición.
Aceptar Cambia entre filas del LCD
Limpiar Limpia el contenido del LCD

2. Objetivos:

- Programar un microcontrolador para que funcione como un decodificador de


teclado 4x4.
- Utilizar subrutinas para generar retardos por software.
- Aplicar las instrucciones del microcontrolador para generar la señal DA.
- Integrar un LCD de 16x2.

3. Materiales

- Microcontrolador PIC 16F877A


- Microcontrolador PIC 16F628
- Teclado matricial 4x4
- LCD 16x2
- Fuente de alimentación
- Protoboard
- Multímetro
- Cristal 4Mhz
- Capacitores, resistencias, dipswitch, leds, Cables
- Computador
- Grabador de PICs

4. Contenido

 FUNDAMENTO TEÓRICO
PIC16f877A: Es un microcontrolador con memoria de programa tipo FLASH, lo
que representa gran facilidad en el desarrollo de prototipos y en su aprendizaje ya
que no requiere borrarlo con luz ultravioleta como las versiones EPROM, sino que
permite reprogramarlo nuevamente sin ser borrado con anterioridad. El encapsulado
más común para este microcontrolador es el DIP (Dual In-line Package) de 40 pines,
propio para usarlo en experimentación

 Set de instrucciones reducidas (tipo RISC), pero con las instrucciones necesarias
para facilitar su manejo.
 Frecuencia máxima: DX-20MHz
 Memoria de programa flash palabra de 14 bits: 8KB
 Posiciones RAM de datos: 368
 Posiciones EEPROM de datos: 256
 Puertos E/S: A,B,C,D,E
 Juego de instrucciones: 35 instrucciones
 Longitud de la instrucción : 14 bits
 Arquitectura: Harvard
 CPU: Risc

ASEMBLER: Es una lenguaje de programación de bajo nivel. Consiste en un


conjunto de mnemónicos que representan instrucciones básicas para los
microcontroladores, en el caso de la familia ‘16F’ solo posee 35 instrucciones.
Gracias a la miniaturización que permite incorporar cada vez más memoria dentro de
un microcontrolador sin aumentar prácticamente su costo, han surgido compiladores
de lenguajes de alto nivel como Basic y C.

MPLAB X IDE: Es un Entorno de Desarrollo Integrado por sus siglas en Ingles


(IDE) implementado por la empresa de Microchip para desarrollar sistemas basados
en microcontroladores PIC. Su distribución es libre y gratuita y se puede descargar
directamente del sitio oficial de Microchip. Este editor es modular, permite
seleccionar los distintos microcontroladores soportados, además de permitir la
grabación de estos circuitos integrados directamente al programador.

PIC16F628: El pic 16f628a es un microcontrolador de 8 bit, posee una arquitectura


RISC avanzada así como un juego reducido de 35 instrucciones. Este
microcontrolador es el remplazo del obsoleto pic16f84a, los pines del pic16f628a
son compatibles con el pic16f84a, así se podrían actualizar proyectos que hemos
utilizado con el pic16f84a.

TECLADO MATRICIAL 4X4


Conformado por una matriz de pulsadores conformado por cuatro filas y cuatro
columnas, cuando no se ha oprimido ninguna tecla, no hay conexión entre filas y
columnas.

Cuando se oprime una tecla se hace una conexión entre la columna y la fila de la
tecla. Muchos teclados comerciales ya traen incluido su decodificador, caso
contrario se debe utilizar un chip decodificador.

INICIALIZACION LCD

Si bien muchas aplicaciones donde debemos mostrar información podemos


resolverlas con display de 7 segmentos, estos presentas algunas limitaciones
importantes, por ejemplo: no muestran caracteres alfanuméricos ni ASCII, y tienen
un elevado consumo de corriente (recordemos que estamos encendiendo LEDs).

Los módulos LCD (display de cristal líquido) solucionan estos inconvenientes y


tienen algunas ventajas adicionales como la facilidad que con que se pueden
conectar a microprocesadores y microcontroladores, sumado a la óptima
presentación de la información.
El display LCD para funcionar, debe ser inicializado, para lo que se debe recurrir a
una secuencia de instrucciones en un orden especifico que solo se realizarán una vez
para configurar el display.

El display puede funcionar con un bus de datos de 8 bits y con uno de 4 bits por lo
que su secuencia de inicialización es diferente según la forma en la que se va a
trabajar. Para esto existen protocolos por parte del fabricante del controlador de los
displays, que nos guían para inicializarlos, la inicialización de 8 bits se encuentra en
el Anexo 1 y la correspondiente a 4 bits en el Anexo 2.

5. Diagrama de bloques

Fuente de Fuente de
Alimentación 5V alimentación 5V

BLOQUE
DE Uc Pic16F628A Uc Pic16F877A
5 6
ENTRADA BLOQUE
DECODIFICADOR CONTROL DE
TECLADO TECLADO 4X4 DISPLAY LCD SALIDA
MATRICIAL 16X4 LCD 16X4
4X4

Oscilador 4Mhz
6. Tabla de asignación de variables

PIC 16F628

N° Descripción Registro Dirección Valor


1 Registro de Configuración CW 2007h 3F71h
de bits
2 Registro de configuración TRISB 86h FFh
del puerto de entrada B
del teclado matricial
4 bits menos significativos
(filas).
4 bits más significativos
(columnas).
3 Registro de configuración TRISA 87h 00h
del puerto de salida A.
4 Registro de Lectura de PortB 06h ------
Datos
5 Registro de Escritura de PortA 07h ------
Datos
6 Registro de AUX 20H −−
almacenamiento de datos
(Almacena un dato
auxiliar)
7 Registro de BOTON 21H −−
almacenamiento de datos
(Almacena el dato del
boton presionado)
8 Registro de CONT0 22H −−
almacenamiento de datos
(Almacena el dato para el
contador)
9 Registro de CONT1 23H −−
almacenamiento de datos
(Almacena el dato para el
contador)

PIC 16F877A

N° Descripción Registro Dirección Valor


1 Registro de Configuración CW 2007h 3F71h
de bits
2 Puerto de Entrada (5 bits) TRISB 86h FFh

3 Puerto de Salida (8 bits) TRISC 87h 00h

4 Registro de Lectura de PortB 06h ------


Datos
5 Registro de Escritura de PortC 07h ------
Datos
6 Registro para generación t1 20H ------
del retardo
7 Registro para generación t2 21H ------
del retardo
8 Registro de nibble1 22H ------
Almacenamiento de Dato
9 Registro de nibble2 23H ------
Almacenamiento de dato a
enviar.
10 Registro de Dato 24H ------
Almacenamiento de
comprobación para envío
de datos
11 Registro de asignación de Cont 25H ------
valor para ir a funciones
12 Registro de asignación de Cont1 26H ------
valor para ir a funciones
13 Registro de asignación de Cont2 27H ------
valor para ir a funciones
14 Registro de linea1 28H ------
Almacenamiento de Dato
15 Registro de linea2 29H ------
Almacenamiento de Dato
16 Registro de Dato1 30H ------
Almacenamiento de
comprobación para envío
de datos
17 Registro de Dato2 31H ------
Almacenamiento de
comprobación para envío
de datos

7. Diagrama de flujo

PIC 16F628

DIAGRAMA DE FLUJO INICIO


DIAGRAMA DE FLUJO DETECCIÓN
DIAGRAMA DE FLUJO REBOTE
DIAGRAMA DE FLUJO CODIFICACION

A
A
DIAGRAMA DE FLUJO SALIDA
DIAGRAMA DE FLUJO d20ms (RETARDO)

PIC16F877A

DIAGRAMA DE FLUJO INICIO (PROGRAMA PRINCIPAL)


B

B
C
C

D
DIAGRAMA DE FLUJO LCDint

E
DIAGRAMA DE FLUJO ENABLE
DIAGRAMA DE FLUJO RETARDO
DIAGRAMA DE FLUJO FIN DE LINES
DIAGRAMA DE FLUJO BLINK
DIAGRAMA DE DISPLAYDER
DIAGRAMA DE DISPLAYIZQ
DIAGRAMA DE CURSORIZQ
DIAGRAMA DE CURSORDER
DIAGRAMA DE LIMPIAR
DIAGRAMA DE ABAJO
8. Cálculos

Calculo de Retardos:

PIC16F877A:
Retardo
movlw 0xC8 (1)
movwf t1 (1)
Ciclo1
movlw 0x0A (1) ;
movwf t2 (1)
Ciclo2
decfsz t2,1 (1, 2)
goto Ciclo2 (2)
decfsz t1,1 (1, 2)
goto Ciclo1 (2)
return (2)

[(3 ∗ 9) + 2] + [(34 ∗ 199) + 33] + 2 + 2 + 1 + 1 = 6834 𝑐𝑖𝑐𝑙𝑜𝑠

𝑡 = 6834 𝑐𝑖𝑐𝑙𝑜𝑠 ∗ 1𝜇𝑠


𝑡 = 6.8 [𝑚𝑠]

PIC16F628A:

d20ms
MOVLW .255 (1)
MOVWF CONT0 (1)
LAZO1
MOVLW .18 (1)
MOVWF CONT1 (1)
LAZO2
DECF CONT1, 1 (1)
BTFSS STATUS, Z (1, 2)
GOTO LAZO2 (2)
DECF CONT0, 1 (1)
BTFSS STATUS, Z (1, 2)
GOTO LAZO1 (2)
RETURN

[(4 ∗ 17) + 3] + (77 ∗ 254) + 76 + 2 + 2 + 2 = 19711 𝑐𝑖𝑐𝑙𝑜𝑠


𝑡 = 19711 ∗ 1𝜇𝑠
𝑡 = 19,71 [𝑚𝑠]

Error
PIC16F628A
7000−6834
𝐸𝑟𝑟𝑜𝑟 = 7000
𝑥100 = 2.37%
PIC16F877A
20000−19711
𝐸𝑟𝑟𝑜𝑟 = 𝑥100 =1.445%
20000
9. Programa

PROGRAMA DE DECODIFICACIÓN
list p=16F628A ;Tipo de procesador
INCLUDE "P16F628A.Inc" ;Librería con las direcciones del microcontrolador.
__CONFIG(0x3f18) ;define las caracteristicas que se van a usar

AUX EQU 0x20


BOTON EQU 0x21
CONT0 EQU 0x22
CONT1 EQU 0x23
ORG 00
GOTO INICIO
ORG 05
INICIO MOVLW 0x07
MOVWF CMCON
BSF STATUS,RP0 ;Activa el banco 1
MOVLW 0xF0 ;entradas y salidas en RB
MOVWF TRISB ;asigna el valor de w a TRISB
CLRF TRISA ;limpia TRISA para salida
BCF OPTION_REG,NOT_RBPU ; resistencias de pull-up
BCF STATUS,RP0 ;Regresa al Banco 0
CLRF PORTA ;Limpia el puerto A

;programa principal

EMPEZAR
BCF PORTA,7 ;Apaga el bit DA
MOVLW 0xAA ;carga un valor
MOVWF AUX ;si se presiono o no una tecla
CALL DETECCION ;Llama a DETECCION
SUBWF AUX,1 ;analiza el valor extraido
BTFSS STATUS,Z ;para saber si es igual a AUX
GOTO EMPEZAR ;regresa a la direccion de
EMPEZAR
CALL CODIFICACION ;asigna un codigo a la tecla
presionada
MOVWF BOTON ;almacena el valor del codio
asignado
CALL SALIDA ;imprime el codigo presentado
GOTO EMPEZAR ;Subrutina DETECCION:

DETECCION
CLRF PORTB ;Limpia el Puerto B
BTFSS PORTB,7 ;Lee la Fila1 "1,2,3,A"
GOTO REBOTE ;Lamo a subrutina para eliminar
el rebote
BTFSS PORTB,6 ;Lee la Fila2 "4,5,6,B"
GOTO REBOTE ;Lamo a subrutina para eliminar
el rebote
BTFSS PORTB,5 ;Lee la Fila3 "7,8,9,C"
GOTO REBOTE ;Lamo a subrutina para eliminar
el rebote
BTFSS PORTB,4 ;Lee la fila4 "*,0,#,D"
GOTO REBOTE ;Lamo a subrutina para eliminar
el rebote
RETLW 0x00 ;Regresa con W=0x00

;Subrutina REBOTE: elimina el rebote

REBOTE
CALL d20ms ;Retardo de 20ms
BTFSS PORTB,7 ;Lee la Fila1 "1,2,3,A"
RETLW 0xAA ;Regresa con W=0x10
BTFSS PORTB,6 ;Lee la Fila2 "4,5,6,B"
RETLW 0xAA ;Regresa con W=0x10
BTFSS PORTB,5 ;Lee la Fila3 "7,8,9,C"
RETLW 0xAA ;Regresa con W=0x10
BTFSS PORTB,4 ;Lee la fila4 "*,0,#,D"
RETLW 0xAA ;Regresa con W=0x10
RETLW 0x00 ;Regresa con W=0x00

;Subrutina CODIFICACION: asigna un código a cada tecla presionada

CODIFICACION
;Primera columna
MOVLW 0xF7 ;Activa la Columna 1
MOVWF PORTB ;agrega el valor de w PORTB
BTFSS PORTB,7 ;analiza si se presiono la tecla 1
RETLW 0x0D ;asigna el valor de 1
BTFSS PORTB,6 ;analiza si se presiono la tecla 6
RETLW 0x0E ;asigna el valor de 4
BTFSS PORTB,5 ;analiza si se presiono la tecla 7
RETLW 0x00 ;asigna el valor de 7
BTFSS PORTB,4 ;analiza si se presiono la tecla *
RETLW 0x0F ;asigna el valor de F

MOVLW 0xFB ;Activo la Columna 2


MOVWF PORTB ;agrega el valor de w a PORTB
BTFSS PORTB,7 ;analiza si se presiono la tecla 2
RETLW 0x0C ;asigna el valor de 2
BTFSS PORTB,6 ;analiza si se presiono la tecla 6
RETLW 0x09 ;asigna el valor de 5
BTFSS PORTB,5 ;analiza si se presiono la tecla 8
RETLW 0x08 ;asigna el valor de 8
BTFSS PORTB,4 ;analiza si se presiono la tecla 0
RETLW 0x07 ;asigna el valor de 0

MOVLW 0xFD ;Activo la Columna 3


MOVWF PORTB ;agrega el valor de w a PORTB
BTFSS PORTB,7 ;analiza si se presiono la tecla 3
RETLW 0x0B ;asigna el valor de 3
BTFSS PORTB,6 ;analiza si se presiono la tecla 6
RETLW 0x06 ;asigna el valor de 6
BTFSS PORTB,5 ;analiza si se presiono la tecla 9
RETLW 0x05 ;asigna el valor de 9
BTFSS PORTB,4 ;analiza si se presiono la tecla #
RETLW 0x04 ;asigna el valor de E
MOVLW 0xFE ;Activo la Columna 4
MOVWF PORTB ;agrega el valor de w a PORTB
BTFSS PORTB,7 ;analiza si se presiono la tecla A
RETLW 0x0A ;asigna el valor de A
BTFSS PORTB,6 ;analiza si se presiono la tecla B
RETLW 0x03 ;asigna el valor de B
BTFSS PORTB,5 ;analiza si se presiono la tecla C
RETLW 0x02 ;asigna el valor de C
BTFSS PORTB,4 ;analiza si se presiono la tecla D
RETLW 0x01 ;asigna el valor de D
RETURN

;Subrutina SALIDA: imprime el valor extraido y enciende el bit DA


SALIDA

MOVF BOTON,0 ;Carga el valor de la tecla a w


MOVWF PORTA ;agrega el valor de w a PORTA
BSF PORTA,7 ;Enciende el bit DA

bitDA

BTFSS PORTB,7 ;Mantiene el bit


GOTO bitDA ;encendido en caso
BTFSS PORTB,6 ;de que se mantenga
GOTO bitDA ;presionado alguna
BTFSS PORTB,5 ;tecla de
GOTO bitDA ;cualquier
BTFSS PORTB,4 ;fila
GOTO bitDA
RETURN

;Subrutina RETARDO

d20ms

MOVLW .255 ;crea un retardo


MOVWF CONT0 ;de 20 ms

LAZO1

MOVLW .18 ;para elimnar el rebore


MOVWF CONT1 ;en las teclas

LAZO2

DECF CONT1,1 ;presionadas


BTFSS STATUS,Z
GOTO LAZO2
DECF CONT0,1
BTFSS STATUS,Z
GOTO LAZO1
RETURN

end ;termina el ensamblaje


PROGRAMA CONTROL DISPLAY

list p=16F877A ;Tipo de procesador


INCLUDE "P16F628A.Inc" ;Librería con las direcciones.
__CONFIG(0x3f18) ;define las caracteristicas que se van a usar
t1 equ 0x20
t2 equ 0x21
nibble0 equ 0x22
nibble1 equ 0x23
Dato equ 0x24
cont equ 0x25
cont1 equ 0x26
cont2 equ 0x27
linea1 equ 0x28
linea2 equ 0x29
Dato1 equ 0x30
Dato2 equ 0x31
org 0x00 ;Inicio del Programa
bsf STATUS,RP0 ;Acceso al banco 1
bcf STATUS,RP1
movlw 0x00
movwf TRISC ;Configuración del Puerto C como salida
movlw 0xFF
movwf TRISB ;Configuración del Puerto B como entrada
bcf STATUS,RP0 ;Acceso al banco 0
bcf STATUS,RP1
movlw 0x00
movwf PORTC
movwf cont ;PORTC en cont
movwf cont1 ;PORTC en cont1
movwf cont2 ;PORTC en cont2
movlw 0x80
movwf linea1 ;linea1 igual a 0x80
movlw 0xC0 ;linea2 0X0CO
movwf linea2
CALL LCDint
CALL Blink
Ciclo:
CALL Findelinea ;llamado a findelinea
btfss PORTB,4
goto Ciclo ;ir a ciclo
movf PORTB,0
andlw 0x0F
addlw 0x30
movwf Dato
goto Decodificar ;Ir a decodificador
Decodificar:
bcf STATUS,C
movlw 0x3A ;muevo 0X3A a w
subwf Dato,0
btfss STATUS,C
goto EnviarNum ;ir a EnviarNum
goto Instruccion ;Ir a Instruccion
Instruccion:
bsf STATUS,Z
movlw 0x3A
subwf Dato,0
btfsc STATUS,Z
goto CursorDer ;Ir a CursorDer
bsf STATUS,Z ;Hacer uno a bit cero.
movlw 0x3B
subwf Dato,0 ;Decremento lo que tengo en w.
btfsc STATUS,Z
goto CursorIzq
bsf STATUS,Z
movlw 0x3C
subwf Dato,0 ;Decremento Dato y guardo en Dato.
btfsc STATUS,Z
goto DisplayDer
bsf STATUS,Z
movlw 0x3D
subwf Dato,0
btfsc STATUS,Z
goto DisplayIzq
bsf STATUS,Z
movlw 0x3E
subwf Dato,0
btfsc STATUS,Z
goto Limpiar
bsf STATUS,Z ;Hacer uno a bit cero.
movlw 0x3F
subwf Dato,0 ;Decrementar Dato y guardar en Dato.
btfsc STATUS,Z
goto Abajo
EnviarNum:
incf cont1,1
movf cont1,0
sublw B'00000001'
btfss STATUS,Z
goto signo ;Ir a signo
goto dato1 ;Ir a dato1
dato1:
movf Dato,0
movwf Dato1
goto Enviar ;Ir a Enviar
dato2:
movf cont1,0
sublw 0x03
btfss STATUS,Z
goto Enviar
movf Dato,0
movwf Dato2
goto Enviar
Enviar:
movf Dato,0
movwf nibble1
andlw 0x0F
movwf nibble0
movlw 0xF0
andwf nibble1,1
swapf nibble1,1
movf nibble1,0
movwf PORTC
bsf PORTC,4
CALL Enable
movf nibble0,0 ;muevo w a nibble
iorlw 0x10 ;or exclusive nibble y 0x10
movwf PORTC
CALL Enable
Espera1:
btfsc PORTB,4
goto Espera1 ;Ir a espera
goto Ciclo ;Ir a ciclo
EnviarCom:
movf Dato,0
movwf nibble1
andlw 0x0F
movwf nibble0
movlw 0xF0
andwf nibble1,1
swapf nibble1,1
movf nibble1,0
movwf PORTC
CALL Enable
movf nibble0,0
movwf PORTC
CALL Enable ;Llamo a Enable
Espera2:
btfsc PORTB,4
goto Espera2
goto Ciclo
CursorIzq:
movlw 0x10
movwf Dato
Goto EnviarCom ;Ir a EnviarCom
CursorDer:
movlw 0x14
movwf Dato
Goto EnviarCom ;Ir a EnviarCom
DisplayIzq:
decf cont1,1
decf cont2,1
movlw 0x18
movwf Dato
Goto EnviarCom ;Ir a EnviarCom
DisplayDer:
incf cont1,1
incf cont2,1
movlw 0x1C
movwf Dato
Goto EnviarCom ;Ir a EnviarCom
Abajo:
incf cont,1
movf cont2,0
subwf linea2,1
movf linea2,0
movwf Dato
Goto EnviarCom ;Ir a EnviarCom
Arriba:
incf cont,1
movf cont2,0
subwf linea1,1
movf linea1,0
movwf Dato
Goto EnviarCom ;Ir a EnviarCom
Limpiar:
movlw 0x00
movwf cont1
movlw 0x00
movwf cont
movlw 0x01
movwf Dato
Goto EnviarCom ;Ir a EnviarCom
LCDint:
movlw 0x03
movwf PORTC
CALL Enable ;Llamo a Enable
movlw 0x02
movwf PORTC
Call Enable ;Llamo a Enable
movlw 0x02
movwf PORTC
Call Enable ;Llamo a Enable
movlw 0x08
movwf PORTC
Call Enable ;Llamo a Enable
movlw 0x00
movwf PORTC
Call Enable ;Llamo a Enable
movlw 0x0C
movwf PORTC
Call Enable ;Llamo a Enable
movlw 0x00
movwf PORTC
Call Enable ;Llamo a Enable
movlw 0x01
movwf PORTC
Call Enable ;Llamo a Enable
bcf PORTC,0
return
Enable:
Call Retardo
bsf PORTC,5 ;Hacer uno el bit 5 del Puerto C
CALL Retardo ;Llamo a retardo
bcf PORTC,5
return
Retardo:
movlw 0xC8 ; 200
movwf t1 ; Iniciamos contador1.-
Ciclo1
movlw 0x0A
movwf t2 ; Iniciamos contador2
Ciclo2
decfsz t2,1 ; Decrementa Contador2 y si es 0 sale.-
goto Ciclo2 ; Si no es 0 repetimos ciclo.-
decfsz t1,1 ; Decrementa Contador1.-
goto Ciclo1 ; Si no es cero repetimos ciclo.-
return
Blink:
movlw 0x0F
movwf Dato
movf Dato,0
movwf nibble1
andlw 0x0F ;and entre nibble1 y 0X0F
movwf nibble0
movlw 0xF0
andwf nibble1,1 ;and entre nibble1 y 0XF0
swapf nibble1,1 ;Cambio de valores de nibble
movf nibble1,0
movwf PORTC
CALL Enable ;Llamo a Enable
movf nibble0,0
movwf PORTC
CALL Enable ;Llamo a Enable
return
Findelinea:
movlw 0x10
subwf cont1,0
btfss STATUS,Z ;Revisar bit z igual a uno
return
goto Abajo ;Ir a Abajo
end

10. Diagrama electrónico


11. Conclusiones

El manejo del PIC16F628 en cuanto a programación en ensamblador es igual al


PIC16F877A por contener el mismo número de instrucciones, ya que pertenece a la
gama media de microcontroladores de la microchip.

Al utilizar el PIC16F628 y PIC16F877A para manejar el teclado matricial se puede


asignar un valor y función correspondiente que se quiera a cada tecla, sin depender de
las especificaciones del fabricante.

Es necesario tener un conocimiento general de las funciones que se van a programar en


cada uno de los microcontroladores, puesto que al formar solo un bloque de
decodificación, estas funciones deben complementarse y usarse de manera correcta para
obtener los resultados deseados.

Se deben tomar muchas consideraciones en el manejo del LCD, pasando por la


inicialización, la conexión correcta de sus pines de polarización para que este funcione
correctamente.

Los problemas que se generan en la lectura de datos por el puerto es el tiempo en que
las teclas son presionadas, este aspecto se debe fijar, es decir que se debe de tomar en
cuenta el tiempo en presionar un tecla en la programación y complementarlo con la
implementación del circuito.

12. Bibliografía

Fernando E. PRIMERA 2007 Español Marcombo


Microcontroladores: Valdés Pérez,
fundamentos y aplicaciones con Ramón Pallás
PIC Areny
Programación de Ibrahim Dogan PRIMERA 2006 Español Marcombo
microcontroladores PIC
13. Anexos

Anexo1. Inicialización LCD con 8 bits


Anexo1. Inicialización LCD con 4 bits

You might also like