Você está na página 1de 28

1.

Tema: Timer 0

2. Planteamiento del problema:

2.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

2.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

3. 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.

4. 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
5. 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 asi como un juego reducido de 35 instrucciones. Este
microcontrolador es el remplazo del obsoleto pic16f84a, los pines del pic16f628a son
compatibles con el pic16f84a, asi se podrian 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.

6. 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

7. 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 de t1 20H ------
Almacenamiento de Dato
7 Registro de t2 21H ------
Almacenamiento de Dato
8 Registro de nibble1 22H ------
Almacenamiento de Dato
9 Registro de nibble2 23H ------
Almacenamiento de Dato
10 Registro de Dato 24H ------
Almacenamiento de Dato
11 Registro de Cont 25H ------
Almacenamiento de Dato
12 Registro de Cont1 26H ------
Almacenamiento de Dato
13 Registro de Cont2 27H ------
Almacenamiento de Dato
14 Registro de linea1 28H ------
Almacenamiento de Dato
15 Registro de linea2 29H ------
Almacenamiento de Dato
16 Registro de Dato1 30H ------
Almacenamiento de Dato
17 Registro de Dato2 31H ------
Almacenamiento de Dato

8. Diagrama de flujo

PIC 16F628
PIC16F877A
9. 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
MOVWF CONT0
LAZO1
MOVLW .18
MOVWF CONT1
LAZO2
DECF CONT1, 1
BTFSS STATUS, Z
GOTO LAZO2
DECF CONT0, 1
BTFSS STATUS, Z
GOTO LAZO1
RETURN

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


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

10. 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=16F628A ;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
Resultado equ 0x32
Signo equ 0x33
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
movwf cont1
movwf cont2
movlw 0x80
movwf linea1
movlw 0xC0
movwf linea2
CALL LCDint
CALL Blink
Ciclo:
CALL Findelinea
btfss PORTB,4
goto Ciclo
movf PORTB,0
andlw 0x0F
addlw 0x30
movwf Dato
goto Decodificar
Decodificar:
bcf STATUS,C
movlw 0x3A
subwf Dato,0
btfss STATUS,C
goto EnviarNum
goto Instruccion
Instruccion:
bsf STATUS,Z
movlw 0x3A
subwf Dato,0
btfsc STATUS,Z
goto CursorDer
bsf STATUS,Z
movlw 0x3B
subwf Dato,0
btfsc STATUS,Z
goto CursorIzq
bsf STATUS,Z
movlw 0x3C
subwf Dato,0
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
movlw 0x3F
subwf Dato,0
btfsc STATUS,Z
goto Abajo
EnviarNum:
incf cont1,1
movf cont1,0
sublw B'00000001'
btfss STATUS,Z
goto signo
goto dato1
dato1:
movf Dato,0
movwf Dato1
goto Enviar
signo:
movf cont1,0
sublw 0x02
btfss STATUS,Z
goto dato2
movf Dato,0
movwf Signo
goto 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
iorlw 0x10
movwf PORTC
CALL Enable
Espera1:
btfsc PORTB,4
goto Espera1
goto 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
Espera2:
btfsc PORTB,4
goto Espera2
goto Ciclo
CursorIzq:
movlw 0x10
movwf Dato
Goto EnviarCom
CursorDer:
movlw 0x14
movwf Dato
Goto EnviarCom
DisplayIzq:
decf cont1,1
decf cont2,1
movlw 0x18
movwf Dato
Goto EnviarCom
DisplayDer:
incf cont1,1
incf cont2,1
movlw 0x1C
movwf Dato
Goto EnviarCom
Abajo:
incf cont,1
movf cont2,0
subwf linea2,1
movf linea2,0
movwf Dato
Goto EnviarCom
Arriba:
incf cont,1
movf cont2,0
subwf linea1,1
movf linea1,0
movwf Dato
Goto EnviarCom
Limpiar:
movlw 0x00
movwf cont1
movlw 0x00
movwf cont
movlw 0x01
movwf Dato
Goto EnviarCom
LCDint:
movlw 0x03
movwf PORTC
CALL Enable
movlw 0x02
movwf PORTC
Call Enable
movlw 0x02
movwf PORTC
Call Enable
movlw 0x08
movwf PORTC
Call Enable
movlw 0x00
movwf PORTC
Call Enable
movlw 0x0C
movwf PORTC
Call Enable
movlw 0x00
movwf PORTC
Call Enable
movlw 0x01
movwf PORTC
Call Enable
bcf PORTC,0
return
Enable:
Call Retardo
bsf PORTC,5
CALL 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
movwf nibble0
movlw 0xF0
andwf nibble1,1
swapf nibble1,1
movf nibble1,0
movwf PORTC
CALL Enable
movf nibble0,0
movwf PORTC
CALL Enable
return
Findelinea:
movlw 0x10
subwf cont1,0
btfss STATUS,Z
return
goto Abajo
end

11. Diagrama electrónico


12. Conclusiones

El manejo del PIC16F628 como decodificador de teclado en cuanto a programación en


ensamblador es igual al PIC16F877A.

Es necesario conocer las características del PIC16F628 en cuanto a puertos y manejo de


los mismos para así poder recibir datos del teclado matricial que se va usar y enviarlos
correctamente para que puedan ser manejados y mostrados por el PIC16F877A.

Manejando el PIC16F628 como decodificador de teclado matricial se puede asignar el


valor correspondiente que se quiera a cada tecla, sin depender de las especificaciones del
fabricante, para así asignar funciones a cada una de las teclas.

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


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

En el PIC16F877A se debe tomar en cuenta las características del LCD, es decir, se debe
adaptar las salidas de los puertos en la programación y mostrar los datos de manera
correcta.

13. 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

14. Anexos
Anexo1. Inicialización LCD con 8 bits
Anexo1. Inicialización LCD con 4 bits

Você também pode gostar