Está en la página 1de 54

CAPÍTULO 2

PUERTOS DE ENTRADA Y SALIDA

Ing. Fanny Flores E.


2019A
Estructura de los puertos de I/O

◼ Las líneas de Entradas y Salidas son los pines del microcontrolador que sirven para
comunicarse con los periféricos conectados al sistema.

◼ Pueden enviar o recibir datos digitales o analógicos al o desde el periférico. Manejan la


información en paralelo y se agrupan en conjuntos que reciben el nombre de puertos
o pórticos. Los pines de los pórticos pueden configurarse independientemente cada
uno de ellos como entrada o salida.

◼ Los pórticos tienen registros asociados los cuales es importante conocer y aprender
para su uso adecuado.

2
Estructura de los puertos de I/O
◼ Distribución de Pórticos

PuertoA PuertoB

PuertoC 3
Estructura de los puertos de I/O
Pórtico o Puerto A

◼ Funciones de los pines

◼ Es un puerto que cuenta con 6 pines físicos, que corresponden a 6 bits bidireccionales

4
Estructura de los puertos de I/O

◼ Los pines RA0/AN0, RA1/AN1, RA5/AN4 tienen multiplexadas las funciones de E/S
digitales con la de los canales analógicos 0, 1, 4 del conversor A/D

◼ El Pin RA2/AN2/VREF- tiene multiplexadas tres funciones: E/S digitales, canal 2 del
conversor A/D y entrada de tensión negativa de referencia para periféricos que la
necesitan.

◼ El Pin RA3/AN3/VREF+ tiene multiplexadas tres funciones: E/S digitales, canal 3 del
conversor A/D y entrada de tensión positiva de referencia para periféricos que la
necesitan.

◼ El pin RA4/TOCKI adicionalmente a su función de E/S Digital tiene multiplexada la


función de entrada de reloj para el TIMER0.
5
Estructura de los puertos de I/O
◼ Registros Asociados:

◼ PORTA: Dirección 05h Banco 0


◼ TRISA: Dirección 85h Banco 1
◼ ADCON1: Dirección 9Fh Banco 1

6
Estructura de los puertos de I/O

◼ Los registros TRISA y PORTA tienen implementados los 6 bits de menor peso

◼ El registro TRISA permite la configuración del Puerto A como entradas o salidas.


Así, colocando un 1L en cualquier bit del registro TRISA, hacemos que el pin del
puerto A correspondiente al bit quede configurado como entrada, poniendo un 0L
en algún bit del TRISA configurará el pin correspondiente como salida.

◼ Por defecto, al iniciar el PIC, así como después de un reset, el Puerto A quedará
configurado como entrada analógica (TRISA 0x3Fh), así se evita posibles
cortocircuitos en la alimentación que podrían dañar el micro o el resto del sistema.

7
Estructura de los puertos de I/O
◼ PORTA corresponde al registro donde se escribe o lee el valor que se desea enviar o recibir de
los pines del puerto A.

◼ Cuando el registro PORTA realiza lectura en los pines que fueron configurados como entrada en
el registro TRISA, éste lee el status de los pines correspondientes del puerto A.

◼ Cuando realiza escritura, funciona como un latch para los datos de salida. La escritura funciona
como una operación “leer-modificar-escribir”.

◼ El control de operación digital/analógico de los pines multiplexados del puerto A son controlados
por el registro ADCON1

8
Estructura de los puertos de I/O
◼ Si se requiere que todos los pines del puerto A funcionen como entradas/salidas digitales se debe
escribir 011x en los bits PCFG<3:0> del registro ADCON1

Otro valor en estos bits hará


que todos ó alguno de los
pines del puerto A presente
otro tipo de funcionamiento.

9
Estructura de los puertos
de I/O
Pórtico o Puerto B
◼ Funciones de los pines

10
Estructura de los puertos
de I/O

◼ Los pines del puerto B tienen una resistencia de pull-up interna al positivo de alimentación
programable (poniendo un 0L en el bit 7 del registro OPTION REG).

◼ Los pines RB4-RB7 se pueden programar para provocar una interrupción cuando alguno de ellos
cambia de estado, para ello deben estar configurados como entradas.

◼ El pin RBO/INT puede programarse como petición de interrupción externa.

◼ EL puerto B se utiliza también para programar el micro a bajo voltaje, los pines que poseen esta
función multiplexada son:
◼ RB3/PGM
◼ RB6/PGC
◼ RB7/PGD

11
Estructura de los puertos
de I/O
◼ Registros Asociados:

◼ PORTB: Dirección 06h Banco 0 y 106h Banco 2


◼ TRISB: Dirección 86h Banco 1 y 186h Banco 3
◼ OPTION_REG: Dirección 81h Banco 1 y 181h Banco 3

12
Estructura de los puertos
de I/O
◼ Los registros TRISB y PORTB son registros de 8 bits bi-direccionales

◼ El registro TRISB permite la configuración del Puerto B como entradas y salidas. Así
colocando un 1L en cualquier bit de TRISB, hacemos que el pin del puerto B
correspondiente al bit quede configurado como entrada, poniendo un 0L en algún bit
del TRISB configurará el pin correspondiente como salida.

◼ Por defecto, al iniciar el PIC, así como después de un reset, el Puerto B quedará
configurado como entradas digitales (TRISB 0xFFh).

◼ El registro PORTB corresponde al registro donde se escribe o lee el valor que se


desea enviar o recibir de los pines del puerto B.

13
Estructura de los puertos
de I/O
Pórtico o Puerto C
◼ Funciones de los pines

14
Estructura de los puertos
de I/O
◼ Los pines RC0-RC1 adicional a la función de E/S tienen multiplexadas las funciones
de entrada de reloj y oscilador externo para el TIMER1.

◼ El pin RC2 tiene como función adicional multiplexada la salida de señales PWM.

◼ Los Pines RC6-RC7 tiene la función adicional de comunicación serial.

15
Estructura de los puertos
de I/O
◼ Registros Asociados:

◼ PORTC: Dirección 07h Banco 0


◼ TRISC: Dirección 87h Banco 1

16
Estructura de los puertos
de I/O

◼ Los registros TRISC y PORTC son registros de 8 bits bi-direccionales

◼ El registro TRISC permite la configuración del Puerto C como entradas y


salidas. Así colocando un 1L en cualquier bit de TRISC, hacemos que el pin
del puerto C correspondiente al bit quede configurado como entrada,
poniendo un 0L en algún bit del TRISC configurará el pin correspondiente
como salidas.

◼ Por defecto, al iniciar el PIC, así como después de un reset, el Puerto C


quedará configurado como entrada digital (TRISC 0xFFh).

◼ El registro PORTC corresponde al registro donde se escribe o lee el valor


que se desea enviar o recibir de los pines del puerto C.
17
EJERCICIOS
◼ Programar todas las líneas del Pórtico A como entradas digitales y todas las líneas del Pórtico B
como salidas.
Inicio

BCF 0x03,6
Selecciono Banco1 BSF 0x03,5
MOVLW 0x3F
0x3F TRISA MOVWF 0x85
MOVLW 0x00
0x00 TRISB
MOVWF 0x86

Fin código fuente


18
EJERCICIOS
◼ Programar todas las líneas del Pórtico A como entradas digitales y todas las líneas del Pórtico B
como salidas.
LIST P=16F870 ;Avisa al ensamblador que PIC se va a usar
#INCLUDE “P16F870.INC” ;incluye las librerías del PIC16F870
ORG 0X00 ;Inicia el programa en la posición 0x00
BCF STATUS,RP1 ;Seleccionar banco 1 (0 en bit RP1, bit 6 status)
BSF STATUS,RP0 ;Seleccionar banco 1 (1 en bit RP0, bit 5 status)
MOVLW 0X06 ;Cargo 0110 en W
MOVWF ADCON1 ;Digitalizo pórtico A
MOVLW 0X3F ;Escribe el valor 0x3F en W
MOVWF TRISA ;Configura el pórtico A como entrada
MOVLW 0x00 ;Escribe el valor 0x00 en W
MOVWF TRISB ;Configura el pórtico B como salida
END ;Finaliza el programa
19
EJERCICIOS
◼ Realizar un programa que permita leer continuamente el puerto A y copiar su contenido en el
Puerto B
Inicio

Configurar TRISB
y TRISB

Leer PORTA

Escribir en
PORTB
20
EJERCICIOS
◼ Realizar un programa que permita leer continuamente el puerto A y copiar su
contenido en el Puerto B
LIST P=16F870 ;Avisa al ensamblador que PIC se va a usar
#INCLUDE “P16F870.INC” ;incluye las librerías del PIC16F870
ORG 0X00 ;Inicia el programa en la posición 0x00
BCF STATUS,RP1 ;Seleccionar banco 1 (0 en bit RP1, bit 6 status)
BSF STATUS,RP0 ;Seleccionar banco 1 (1 en bit RP0, bit 5 status)
MOVLW 0X06 ;Cargo 0110 en W
MOVWF ADCON1 ;Digitalizo pórtico A
MOVLW 0X3F ;Escribe el valor 0x3F en W
MOVWF TRISA ;Configura el pórtico A como entrada
MOVLW 0x00 ;Escribe el valor 0x00 en W
MOVWF TRISB ;Configura el pórtico B como salida
BCF STATUS,RP0 ;Seleccionar banco 0 (0 en bit RP0, bit 5 status)
LAZO MOVF PORTA,W ;Lee el contenido del Pórtico A y lo mueve a W
MOVWF PORTB ;Escribe el contenido de W en el Pórtico B
GOTO LAZO ;Rutina
END ;Finaliza el programa 21
Conexión a periféricos comunes
◼ Diodo LED
◼ Es el periférico más simple, pero uno de los más utilizados que se puede conectar a un pin de
un microcontrolador, para lo cual es necesario configurar el pin de un puerto como salida
digital. Dependiendo si se conecta el ánodo o el cátodo al µC se deberá enviar 1L o 0L,
respectivamente, desde el PIC para encenderlo. Asociado al LED se debe conectar una
resistencia en serie para limitar el paso de la corriente.

22
Conexión a periféricos comunes
◼ Interruptores y Pulsadores
◼ Los pines del µC a los cuales estén asociados estos dispositivos deberán estar configurados como entradas digitales.
◼ A estos dispositivos se les debe colocar una resistencia de Pull Up (Nivel bajo 0L cuando son pulsadas o están en estado
cerrado y nivel alto 1L cuando están en estado abierto) o Pull Down (para funcionamiento inverso)
◼ En el pórtico B se puede activar resistencias internas de pull up mediante el registro Option_Reg

23
Conexión a periféricos comunes
◼ Display de 7 Segmentos
◼ Los displays de 7 segmentos LED se utilizan sobre todo para representar información alfanumérica.
◼ Hay dos tipos de displays de 7 segmentos: los de ánodo común (se activan con 0L) y los de cátodo común (se
activan con 1L).

Vcc Gnd

◼ Cuando hay varios displays de 7 segmentos en paralelo formando un visualizador es recomendable la conexión
multiplexada de estos dispositivos a un puerto de un microcontrolador.
◼ Para el uso de los displays de 7 segmentos es recomendable usar tablas en funciones de subrutinas.

24
Conexión a periféricos comunes
◼ Display de 7 Segmentos
◼ En la siguiente figura se conectan 4 displays de siete segmentos en ánodo común en paralelo al pórtico B
(los segmentos emiten luz con un 0L) y están conectadas directamente al pórtico. El ánodo común de cada
segmento sirve como un terminal de selección gobernado desde el pórtico A. La selección se hace mediante
un 1L en el terminal del pórtico A correspondiente. Los displays se activan sucesivamente con una
frecuencia de repetición adecuada para que ante el ojo humano la visualización de todos los displays
parezca simultánea.

25
Conexión a periféricos comunes
(SOLO INFORMATIVA)
◼ Display de Cristal Líquido LCD
◼ Los LCD son dispositivos µControlados de visualización gráfica para la presentación de caracteres, símbolos o
incluso dibujos (en algunos modelos).

◼ Los modelos más comúnmente utilizados son de 2 filas de 16 caracteres cada una y cada caracter dispone de una
matriz de 5x7 puntos (pixeles), aunque los hay de otro número de filas y caracteres.

1 2 16

… 7 pixeles

5 pixeles

CARACTER 26
Conexión a periféricos comunes
(SOLO INFORMATIVA)
◼ Pines del LCD

Pin Señal Función


DB0 – Líneas de bus de datos. Para transferencia bidireccional de datos entre µC y
7….14
DB7 LCD. En operación de 4 bits solo se utiliza el nibble alto
6 E Enable: Señal de inicio de operación de lectura/escritura

5 R/W Señal para seleccionar operación de lectura o escritura: “0” Escribir / “1” Leer
Register Select: Esta señal indica al LCD si el byte que envía por DB0 – DB7
4 RS
es una orden RS= ‘0’ o un dato RS= ‘1’
Ajuste del contraste (normalmente
3 Vee o Vo
se conecta una señal de potenciómetro a este pin)
2 Vdd o Vcc Alimentación = 5 Vdc (típicamente)

1 Vss Alimentación = 0 V (Gnd)


27
Conexión a periféricos comunes
(SOLO INFORMATIVA)
◼ LCD: conexión con bus de datos de 4 bits

◼ El LCD tiene 14 pines. Algunos


tienen 1 o 2 pines más. Estos
pines adicionales son usados
para iluminación posterior.

Pin 1: GND
Pin 2: Vcc (5V)
Pin 3: para el contraste
Pines 4 a 6: para control
Pines 11 a 14: bus de datos

28
Conexión a periféricos comunes
(SOLO INFORMATIVA)
◼ LCD: conexión con bus de datos de 8 bits

◼ El bus de datos ocupa todo el


pórtico B del PIC, en este
ejemplo.

Pin 1: GND
Pin 2: Vcc (5V)
Pin 3: para el contraste
Pines 4 a 6: para control
Pines 7 a 14: bus de datos

29
Conexión a periféricos comunes
(SOLO INFORMATIVA)
◼ Teclado Matricial
◼ Son dispositivos de entrada de datos, que constan de teclas o pulsadores interconectados en filas y
columnas que forman una matriz.

E
n
t
r
a
d
a
s

S
a
l
i
d
a
s

◼ Cuando se pulsa una tecla se ponen en contacto eléctrico la fila y la columna de dicha tecla, las filas y
columnas pueden estar conectadas a uno o más pórticos del microcontrolador.

30
Conexión a periféricos comunes
(SOLO INFORMATIVA)
◼ Teclado Matricial
◼ Para explorar un teclado matricial se envía señales a las filas de la matriz y se recoge información por las columnas. Las líneas
de retorno tendrán un 1L a menos de que una tecla esté presionada

Si se habilitan las resistencias de pull up no se


deben conectar estas resistencias ni Vdd
E
n
t
r
a
d
a
s

S Líneas de
a
l Exploración
i
d
a
s

Líneas de Retorno

◼ Los diodos evitan cortocircuitos accidentales si se presionan 2 o más teclas al mismo tiempo (los diodos pueden remplazarse con
resistencias de 1kΩ a 2.2kΩ).
◼ Para el uso de teclados matriciales es recomendable utilizar interrupciones.
31
Saltos y Subrutinas
◼ En ocasiones es necesario realizar un mismo procedimiento en distintas secciones de un
mismo programa, por ejemplo desplegar valores en un display o agregar retardos simples.

◼ La solución óptima es incluir una sola vez el código del procedimiento y utilizarlo (llamarlo)
desde distintos puntos del programa, así se optimiza trabajo y memoria de programa. A ese
código se le llama SUBRUTINA.

◼ Las llamadas a subrutina mediante la instrucción CALL son desviaciones del flujo de control
del programa originadas por instrucciones, por lo que se consideran sincrónicas. Se
producen cada vez que se ejecuta dicha instrucción.

◼ Se puede, como máximo usar 8 subrutinas anidadas (stack 8 level de 13 bits)


32
Saltos y Subrutinas
◼ Los Saltos y subrutinas están asociadas con las instrucciones: CALL,
RETURN y RETLW
◼ La instrucción CALL se encarga de almacenar en la pila (stack) la dirección
de la instrucción que le sigue. Así se preserva la dirección del punto de
retorno. Y a su vez provoca que la ejecución se transfiera a la subrutina 07h
CALL 1Bh 08h
◼ La ejecución de la instrucción RETURN extrae la dirección almacenada en
09h
la pila y la transfiere al PC. Así, la próxima instrucción que se ejecuta 1Ah
después del RETURN es precisamente la siguiente a CALL (que es la que 1Bh
se había guardado previamente en la pila), regresando el control al 1Ch
programa principal. 1Dh
◼ La instrucción RETLW funciona de forma similar que un RETURN, produce RETURN N 1Eh
el retorno de una subrutina pero con un valor en el registro W. Esta
instrucción nos permite acceder a tablas de datos en la memoria de
programa.

33
Ejercicio
◼ Realizar un retardo ó delay de 500 msegundos con un PIC 16F870 a una
frecuencia de 4 MHz y visualizarlo en un led parpadeante
◼ 1 ciclo instrucción (4Mhz)= 1µSeg

◼ 500 mseg = 500000 ciclos de máquina


4 MHz
CLK = 0,25 µs

LIST P=16F870 ;Indica el microcontrolador a utilizar


INCLUDE "P16F870.INC" ;Incluye las librerias del microcontrolador
CONT1 EQU 0x21
CONT2 EQU 0x22
CONT3 EQU 0x23
ORG 0X00 ;Inicia el programa en la posición 0x00
BCF STATUS,RP1 ;Seleccionar banco 1 (0 en bit RP1, bit 6 status)
BSF STATUS,RP0 ;Seleccionar banco 1 (1 en bit RP0, bit 5 status)
MOVLW b'11111110'
MOVWF TRISB ;Configura como salida RB0
BCF STATUS,RP0 ;Seleccionar banco 0 (0 en bit RP0, bit 5 status)
CLRF PORTB ;Envía 0 por RB0

34
Ejercicio
LAZO MOVLW .200 ;(1)Escribe el valor K en W
MOVWF CONT1 ;(1)Guarda el valor de W en CONT1
RET3 MOVLW .40 ;(1)Escribe el valor K en W
MOVWF CONT2 ;(1)Guarda el valor de W en CONT2
RET2 MOVLW .19 ;(1)Escribe el valor K en W
MOVWF CONT3 ;(1)Guarda el valor de W en CONT3
RET1 DECFSZ CONT3,f ;(1)Decrementa el valor de CONT3 salta si cero
GOTO RET1 ;(2)lazo RET1
DECFSZ CONT2,f ;(1)Decrementa el valor de CONT2 salta si cero
GOTO RET2 ;(2)lazo RET2
DECFSZ CONT1,f ;(1)Decrementa el valor de CONT1 salta si cero
GOTO RET3 ;(2)lazo RET3
COMF PORTB ;(1)Invierte la salida de RB0
GOTO LAZO ;(2)Lazo infinito
END 35
Ejercicio
◼ Realizar el programa anterior en MikroC

void main() {
TRISB=0XFE; //Defino el pin RB0 como salida, el resto como entradas
PORTB=0X00; //Escribo 00000000 en pórtico B
while(1){ //Lazo
PORTB.F0=0; //Envió 0L al bit 0 pórtico B
delay_ms(500); // retardo 500ms
RB0_bit=1; //Envió 1L al bit 0 pórtico B
delay_ms(500); // retardo 500ms
}
}

36
Ejercicio
◼ Realizar un programa que realice un contador de 0 a 9 y lo visualice en un
Display de 7 Segmentos cátodo común

37
Ejercicio
LIST P=16F870 ;Avisa al ensamblador que PIC se va a usar
#INCLUDE "P16F870.INC" ;incluye las librerías del PIC16F870
CONT EQU 0x20
R1 EQU 0x21
R2 EQU 0x22
R3 EQU 0x23
ORG 0X00 ;Inicia el programa en la posición 0x00
GOTO INICIO
RETARDO MOVLW .200 ;
MOVWF R1 ;
S3 MOVLW .40 ;
MOVWF R2 ;
S2 MOVLW .19 ;
MOVWF R3 ;
S1 DECFSZ R3 ;
GOTO S1 ;
DECFSZ R2 ;
GOTO S2 ;
DECFSZ R1 ;
GOTO S3 ;
RETURN
38
Ejercicio
TABLA ADDWF PCL,f ;Limpio el contenido del registro CONT
RETLW 0x3F ;Retorna b'00111111'
RETLW 0x06 ;Retorna b'00000110'
RETLW 0x5B ;Retorna b'01011011'
RETLW 0x4F ;Retorna b’01001111'
RETLW 0x66 ;Retorna b'01100110'
RETLW 0x6D ;Retorna b’01101101'
RETLW 0x7D ;Retorna b'01111101'
RETLW 0x07 ;Retorna b'00000111'
RETLW 0x7F ;Retorna b'01111111'
RETLW 0x67 ;Retorna b'01100111'
INICIO BCF STATUS,RP1 ;Seleccionar banco 1 (0 en bit RP1, bit 6 status)
BSF STATUS,RP0 ;Seleccionar banco 1 (1 en bit RP0, bit 5 status)
CLRF TRISB ;Configura como salida todo el pórtico b
BCF STATUS,RP0 ;Seleccionar banco 0 (0 en bit RP0, bit 5 status)
CLRF PORTB ;Limpio el pórtico B
39
Ejercicio
LAZO1 CLRF CONT ;Limpio el contenido del registro CONT
LAZO2 MOVF CONT,0 ;Muevo el contenido del contador a W
CALL TABLA ;Llamo a la subrutina Tabla
MOVWF PORTB ;Escribo en el puerto del display de 7 segmentos
CALL RETARDO ;Llamo a la subrutina de retraso
INCF CONT,f ;Incremento el contador
MOVF CONT,0
XORLW .10 ;Comparo para limitar el contador
BTFSS STATUS,2 ;Si la comparación anterior era cero el bit 2 Z se ponía
en uno en Registro Status
GOTO LAZO2 ;Regresar a LAZO2
GOTO LAZO1 ;Regresar a LAZO1
END

40
Ejercicio
◼ Realizar el programa anterior en MikroC
char contador=0;
void main() {
TRISB=0X00; //Defino el pin RB0 como salida, el resto como entradas
PORTB=0X00; //Escribo 00000000 en pórtico B
while(1){ //Lazo
contador=contador+1; //Contador creciente
delay_ms(500); //Retraso 0,5seg
if(contador>9) contador=0;
switch(contador){ //Subrutina
case 0: portb=0x3F; break;
case 1: portb=0x06; break;
case 2: portb=0x5B; break;
case 3: portb=0x4F; break;
case 4: portb=0x66; break;
case 5: portb=0x6D; break;
case 6: portb=0x7D; break;
case 7: portb=0x07; break;
case 8: portb=0x7F; break;
case 9: portb=0x67; break;
}
}
} 41
Ejercicio
◼ Realizar un programa que realice un contador de 0 a 9 y lo visualice en un Display de 7
Segmentos cátodo común, conectar un switch al pin RA0 cuando este pin reciba 1L el
contador será creciente y cuando reciba un 0L el contador debe ser decreciente

42
Ejercicio
LIST P=16F870 ;Avisa al ensamblador que PIC se va a usar
#INCLUDE "P16F870.INC" ;incluye las librerías del PIC16F870
CONT EQU 0x20 ;variable para table de 7 seg
R1 EQU 0x21 ;variable para retardo
R2 EQU 0x22 ;variable para retardo
R3 EQU 0x23 ;variable para retardo
ORG 0X00 ;Inicia el programa en la posición 0x00
GOTO INICIO
RETARDO
MOVLW .200 ;Retraso 0.5 seg
MOVWF R1 ;Retraso 0.5 seg
S3 MOVLW .40 ;Retraso 0.5 seg
MOVWF R2 ;Retraso 0.5 seg
S2 MOVLW .19 ;Retraso 0.5 seg
MOVWF R3 ;Retraso 0.5 seg
S1 DECFSZ R3 ;Retraso 0.5 seg
GOTO S1 ;Retraso 0.5 seg
DECFSZ R2 ;Retraso 0.5 seg
GOTO S2 ;Retraso 0.5 seg
DECFSZ R1 ;Retraso 0.5 seg
GOTO S3 ;Retraso 0.5 seg
RETURN 43
Ejercicio
TABLA ADDWF PCL,f ;Limpio el contenido del registro CONT
RETLW 0x3F ;Retorna b'00111111'
RETLW 0x06 ;Retorna b'00000110'
RETLW 0x5B ;Retorna b'00000110'
RETLW 0x4F ;Retorna b'01011011'
RETLW 0x66 ;Retorna b'01001111'
RETLW 0x6D ;Retorna b'01100110'
RETLW 0x7D ;Retorna b'01111101'
RETLW 0x07 ;Retorna b'00000111'
RETLW 0x7F ;Retorna b'01111111'
RETLW 0x67 ;Retorna b'01100111'

INICIO BCF STATUS,RP1 ;Seleccionar banco 1 (0 en bit RP1, bit 6 status)


BSF STATUS,RP0 ;Seleccionar banco 1 (1 en bit RP0, bit 5 status)
CLRF TRISB ;Configura como salida todo el pórtico b

44
Ejercicio
MOVLW 0X06 ;Cargo 0110 en W
MOVWF ADCON1 ;Configuro todos los pines del puerto A como entradas digitales
MOVLW 0X01 ;Escribe el valor 0x01 en W
MOVWF TRISA ;Configura el pin 0 del puerto A como entrada resto salidas
BCF STATUS,RP0 ;Seleccionar banco 0 (0 en bit RP0, bit 5 status)
CLRF PORTB ;Limpio el pórtico B
LAZO1 CLRF CONT ;Limpio el contenido del registro CONT
LAZO2 MOVF CONT,0 ;Muevo el contenido del contador a W
CALL TABLA ;Llamo a la subrutina Tabla para l
MOVWF PORTB ;Escribo en el puerto del display de 7 segmentos
CALL RETARDO ;Llamo a la subrutina de retraso
BTFSS PORTA,0 ;Reviso el Pin 0 del portico A
GOTO DECRECER ;Si RA0=0 ir a decrecer

45
Ejercicio
INCF CONT,f ;Incremento el contador
MOVF CONT,0 ;mover el contenido de CONT a W
XORLW .10 ;Comparo W(contenido de CONT) con L para limitar el contador
BTFSS STATUS,2 ;Si la comparación anterior era cero el bit 2 Z se ponía en status
GOTO LAZO2 ;Regresar a LAZO2
GOTO LAZO1 ;Regresar a LAZO1
DECRECER DECF CONT,f ;Decremento el contador
MOVF CONT,0
XORLW .255 ;Comparo para limitar el decrecimiento del contador
BTFSS STATUS,2 ;Si la comparación anterior era 255 el bit 2 Z se ponía
en uno en Registro estatus
GOTO LAZO2 ;Regresar a lazo2
MOVLW .9 ;Cargo valor inicial para el decrecimiento de la tabla
MOVWF CONT
GOTO LAZO2
END 46
Ejercicio
◼ Realizar el programa anterior en MikroC
char contador=255; //inicializo contador 255
void main() {
TRISB=0X00; //Defino EL PUERTO B como salida
ADCON1=0X06;
TRISA=0XFF;
PORTB=0X00; //Escribo 00000000 en pórtico B
while(1){ //Lazo
if(contador==255) contador=9; //Cuando el contado llega a 255 se pone en 9 para que continúe decreciendo
if(contador==10) contador=0; //Cuando el contado llega a 10 se pone en 0 para que continúe creciendo
if(PORTA.F0==0){
contador=contador-1; //Contador decreciente
}
else {
contador=contador+1; //Contador creciente
}
delay_ms(500); //retraso

47
switch(contador){ //tabla a ser mostrada en Display
case 0: portb=0x3F; break;
case 1: portb=0x06; break;
case 2: portb=0x5B; break;
case 3: portb=0x4F; break;
case 4: portb=0x66; break;
case 5: portb=0x6D; break;
case 6: portb=0x7D; break;
case 7: portb=0x07; break;
case 8: portb=0x7F; break;
case 9: portb=0x67; break;
}
}
}

48
Ejercicio
◼ Realizar un programa que realice un contador de 0 a 9 y lo visualice en un
Display de 7 Segmentos cátodo común, conectar un pulsador al pin RA1
cuando este sea pulsado el contador cambiará de sentido

49
Ejercicio
LIST P=16F870 ;Avisa al ensamblador que PIC se va a usar
#INCLUDE "P16F870.INC" ;incluye las librerías del PIC16F870
CONT EQU 0x20 ;variable para table de 7 seg
R1 EQU 0x21 ;variable para retardo
R2 EQU 0x22 ;variable para retardo
R3 EQU 0x23 ;variable para retardo
R4 EQU 0x24 ;variable para retardo pulsador
R5 EQU 0x25 ;variable para retardo pulsador
AUX EQU 0X26 ;variable auxiliar para pulsador
ORG 0X00 ;Inicia el programa en la posición 0x00
GOTO INICIO
RETARDO
MOVLW .200 ;Retraso 0.5 seg
MOVWF R1 ;Retraso 0.5 seg
S3 MOVLW .40 ;Retraso 0.5 seg
MOVWF R2 ;Retraso 0.5 seg
S2 MOVLW .19 ;Retraso 0.5 seg
MOVWF R3 ;Retraso 0.5 seg
S1 DECFSZ R3 ;Retraso 0.5 seg
GOTO S1 ;Retraso 0.5 seg

50
Ejercicio
DECFSZ R2 ;Retraso 0.5 seg
GOTO S2 ;Retraso 0.5 seg
DECFSZ R1 ;Retraso 0.5 seg
GOTO S3 ;Retraso 0.5 seg
RETURN
RET_PUL
MOVLW .40 ;Retraso
MOVWF R4 ;Retraso
S5 MOVLW .19 ;Retraso
MOVWF R5 ;Retraso
S4 DECFSZ R5 ;Retraso
GOTO S4 ;Retraso
DECFSZ R4 ;Retraso
GOTO S5 ;Retraso
RETURN
TABLA ADDWF PCL,f ;Limpio el contenido del registro CONT
RETLW 0x3F ;Retorna b'00111111'
RETLW 0x06 ;Retorna b'00000110'
RETLW 0x5B ;Retorna b'00000110'
RETLW 0x4F ;Retorna b'01011011'
RETLW 0x66 ;Retorna b'01001111'
RETLW 0x6D ;Retorna b'01100110'
RETLW 0x7D ;Retorna b'01111101'
RETLW 0x07 ;Retorna b'00000111'
RETLW 0x7F ;Retorna b'01111111'
RETLW 0x67 ;Retorna b'01100111' 51
Ejercicio
PULSADOR BTFSS PORTA,1
CALL RET_PUL
BTFSS PORTA,1
COMF AUX,f
RETURN
INICIO BCF STATUS,RP1 ;Seleccionar banco 1 (0 en bit RP1, bit 6 status)
BSF STATUS,RP0 ;Seleccionar banco 1 (1 en bit RP0, bit 5 status)
CLRF TRISB ;Configura como salida todo el pórtico b
MOVLW 0X06 ;Cargo 0110 en W
MOVWF ADCON1 ;Configuro todos los pines del puerto A como entradas digitales
MOVLW 0X01 ;Escribe el valor 0x01 en W
MOVWF TRISA ;Configura el pin 0 del puerto A como entrada resto salidas
BCF STATUS,RP0 ;Seleccionar banco 0 (0 en bit RP0, bit 5 status)
CLRF PORTB ;Limpio el pórtico B
CLRF AUX 52
Ejercicio
LAZO1 CLRF CONT ;Limpio el contenido del registro CONT
LAZO2 MOVF CONT,0 ;Muevo el contenido del contador a W
CALL TABLA ;Llamo a la subrutina Tabla para l
MOVWF PORTB ;Escribo en el puerto del display de 7 segmentos
CALL RETARDO ;Llamo a la subrutina de retraso
BTFSS PORTA,1 ;Reviso el Pin 1 del portico A
CALL PULSADOR ;Si RA0=0 ir a decrecer
BTFSS AUX,0
GOTO DECRECER
CRECER INCF CONT,f ;Incremento el contador
MOVF CONT,0 ;mover el contenido de CONT a W
XORLW .10 ;Comparo W(contenido de CONT) con L para limitar el contador
BTFSS STATUS,2 ;Si la comparación anterior era cero el bit 2 Z se ponía en status
GOTO LAZO2 ;Regresar a LAZO2
53
GOTO LAZO1 ;Regresar a LAZO1
DECRECER DECF CONT,f ;Decremento el contador
MOVF CONT,0
XORLW .255 ;Comparo para limitar el decrecimiento del contador
BTFSS STATUS,2 ;Si la comparación anterior era 255 el bit 2 Z se ponía
en uno en Registro estatus
GOTO LAZO2 ;Regresar a lazo2
MOVLW .9 ;Cargo valor inicial para el decrecimiento de la tabla
MOVWF CONT
GOTO LAZO2
END

54

También podría gustarte