martes, 4 de diciembre de 2012

Reloj Digital para la escuela

Reloj Digital para la escuela



Plaquetas:

Principal: La placa principal se alimentada con 5V.
Esta compuesta por un MAX232, DS1307 Y PIC16F887.


MAX232: El MAX232 es un integrado que tiene un clock que con el podes programar los minutos, horas, días, meses y años.
También se conecta con el RS232 y el PIC. Cambia las tensiones de TTL a RS232.


DS1307: El DS1307 tiene la función de convertir la tensión de +5V y 0V a +15V y -15V para que la comunicación con el RS232 (Puerto serie) funcione correctamente.
El DS1307 tiene un circuito interno que cuando Vcc es menor a 3V se alimenta con la pila (3V).
Se conecta con el PIC por medio del bus I²C, el integrado usa un clock de 32.768 KHz y con una pila de 3V para seguir funcionando correctamente aunque se desconecte o la luz del colegio se corte.


PIC18F4620: El PIC18F4620 tiene la función de leer la hora del DS1307. Es el que configura la hora de acuerdo a los datos que reciba de la bornera.
Se comunica con la PC por medio del RS232 (Puerto serie) y de esta manera se puede programar el PIC mas rapido (sin tener que sacar el PIC del la plaqueta).

Botonera: La botonera tiene 4 botones (ascendente, descendente, modo y alarma). Mediante esos 4 botones le manda distintos datos al PIC y este se comunica por medio de I2c al integrado DS1307 para escribir la hora y fecha nueva o para leerlas.

Potencia: La potencia lo que hace es alimentar a la plaqueta principal con +5V/0V y la salida de la potencia es el timbre.

Fuente conmutada: La función de la fuente conmutada es convertir los 220V a 5V.
Nosotros cambiamos el transformador por la fuente conmutada ya que nos ahorramos más lugar en el gabinete.



Información de los integrados y PIC:

MAX232:
El MAX232 es un circuito integrado de Maxim que convierte las señales del RS-232 (RS-232) a señales compatibles con los niveles TTL de circuitos lógicos. El MAX232 sirve como interfaz de transmisión y recepción para las señales RX, TX, CTS y RTS.

El circuito integrado tiene salidas para manejar niveles de voltaje del RS-232 (aprox. ± 7.5 V) que las produce a partir de un voltaje de alimentación de + 5 V utilizando multiplicadores de voltaje internamente en el MAX232 con la adición de condensadores externos. Esto es de mucha utilidad para la implementación de puertos serie RS-232 en dispositivos que tengan una alimentación simple de + 5 V.

Asignación de pines:




C1+:       Conexión positiva del condensador C1 del doblador de voltaje de +5V a +10V.
Vs+:      
Conexión de salida del voltaje de +10V.
C1-:       
Conexión negativa del condensador C1 del doblador de voltaje de +5V a +10V.
C2+:      
Conexión positiva del condensador C2 del inversor de voltaje de +10V a -10V.
C2-:       
Conexión negativa del condensador C2 del inversor de voltaje de +10V a -10V.
Vs-:       
Conexión de salida del voltaje de -10V.
T2out:  
Conexiones a niveles de voltaje del protocolo RS-232.
R2in:     
Conexiones a niveles de voltaje del protocolo RS-232.
Vcc:      
Alimentación positiva del MAX232
GND:    
Alimentación negativa del MAX232
T1out:  
Conexiones a niveles de voltaje del protocolo RS-232.
R1in:     
Conexiones a niveles de voltaje del protocolo RS-232.
R1out:
Conexiones a niveles de voltaje de TTL o CMOS.
T1in:
     Conexiones a niveles de voltaje de TTL o CMOS.
T2in:     
Conexiones a niveles de voltaje de TTL o CMOS.
R2out:
Conexiones a niveles de voltaje de TTL o CMOS.
Niveles de Voltaje:
Cuando un circuito integrado MAX232 recibe un nivel TTL y lo convierte a RS-232, lo que hace es 

cambiar el nivel lógico TTL de 0 a un nivel comprendido entre +3 y +15 V, y cambia un nivel lógico TTL 1 a un nivel comprendido entre -3 a -15 V, y viceversa, para convertir niveles de RS-232 a TTL.

Circuito del MAX232:



DC1307:
El DS1307 Real-Time-Clock Serie, es un dispositivo de bajo consumo de energía, completo con código binario decimal (BCD), reloj/calendario más 56 bytes de NV SRAM.
Dirección y datos son transferidos a través de 2 hilos serie, bus bi-direccional (protocolo I²C). El reloj/calendario provee información de, segundos, minutos, horas, día, fecha, mes y año.
El final de fecha de mes se ajusta automáticamente durante meses menores de 31 días, incluyendo correcciones para el año bisiesto. El reloj funciona en cualquiera formato de 24 horas o en 12 horas con indicador AM/PM. El DS1307 tiene incorporado un circuito de sensor de tensión que detecta fallas de energía y cambia automáticamente al suministro de batería de respaldo.


Asignacion de pines:



X1: Conexiones para un cristal de cuarzo estándar 32.768kHz. El circuito oscilador interno está diseñado para funcionar con un cristal con una capacitancia de carga específica (CL) de 12.5pF.
X2: Conexiones para un cristal de cuarzo estándar 32.768kHz. El circuito oscilador interno está diseñado para funcionar con un cristal con una capacitancia de carga específica (CL) de 12.5pF.
Vbat: Alimentacion de bateria (debe ser entre 2V y 3,5V)
GND: Alimentación negativa del DS1307
Vcc: Alimentación positiva del DS1307
SQW/OUT: Cuando se activa, el bit SQWE se establece en 1, el pin SQW/OUT es la salida de una de las cuatro frecuencias de onda cuadrada. El pin SQW/OUT es de drenaje abierto y requiere una RPA SQW/OUT funcionará con cualquiera Vcc o Vbat aplicada.
SCL: (Serial Clock Input) - SCL se utiliza para sincronizar el movimiento de datos en la interfaz serie, requiere una RPA (Resistencia de Polarización a Alto externa).
SDA: (Serial Data Input/Output) - SDA es el pin entrada/salida para el interfaz 2-hilos serie.
El SDA es el pin de drenaje abierto, que requiere una RPA

Circuito:


PIC18F4620:

Asignación de pines:


Imágenes de las plaquetas:

Plaqueta principal: 









A la plaqueta principal invertimos los pines de comunicación (C6 y C7) del PIC con MAX232, por que estaban invertidos en la plaqueta original por lo cual no funcionaba.


Potencia:






En la potencia hicimos una plaqueta nueva, ya que al comprar una fuente conmutada no era necesaria la parte de transformación de corriente alterna a continua ni el regulador de tensión con el 7805. En esta placa dejamos solamente el relay, por que es lo que se encarga de que toque el timbre, por lo que es fundamental para el proyecto.

Fuente conmutada:



Es una fuente conmutada (switching) que tiene una entrada de 220V de alterna y una salida de 5V de continua, con una intensidad de corriente máxima de 1 A.

Botonera:








En esta plaqueta están ubicados los resistores de pull-up, los conectores para los botones y la conexión con la plaqueta principal.

Esquematico y PCB de las plaquetas:
Principal:
Esquematico:





PCB:




Botonera:
Esquematico:




PCB:

Potencia:
Esquematico:


PCB:



Gabinete terminado:



Programa










Para programar el PIC18F4620 usamos el programa PIC C Compiler.




lunes, 9 de julio de 2012

Trabajo Práctico Nº5

Resolución en Ensamblador

Ejercicio 1
; -----------------------------------------------------------
; Descripción:
; Por el puerto B se obtiene el dato de las cinco líneas del
; puerto A al que está conectado un array de interrumptores.
; Por ejemplo, si por el puerto A se introduce "---11001",por
; el puerto B aparecerá "xxx11001" (el valor de las tres
; líneas superiores no importa.

; -----------------------------------------------------------

; -----------------------------------------------------------

; Laboratorio 2
; E.T. N° 28 "República Francesa"
; Grupo: Leibovich, Núñez, Pedre
; 5to 4ta 2012

; -----------------------------------------------------------

; -----------------------------------------------------------

 LIST p=PIC16F84A
 INCLUDE <P16F84A.inc>
 __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
 ERRORLEVEL -302

; -----------------------------------------------------------

; Variables
 CBLOCK 0x0c
 ; Vacío porque no se usan variables
 ENDC

; -----------------------------------------------------------

; -----------------------------------------------------------

; Vectores
 ORG 0x000
 goto Inicio ; Vector de Reset

 ORG 0x004
 retfie ; Vector de Interrupción

; -----------------------------------------------------------
; Programa Principal
; -----------------------------------------------------------
Inicio
 bsf STATUS,RP0
 movlw b'00011111
 movwf TRISA ; PortA como entrada
 clrf TRISB ; PortB como salida
 bcf STATUS,RP0

Loop
 movf PORTA,W ; Valor de PORTA en W
 movwf PORTB ; Enciende LEDS correspondientes
 goto Loop
; -----------------------------------------------------------
END
; -----------------------------------------------------------

Ejercicio 2

; -----------------------------------------------------------

; Descripción:
; Por el puerto B se obtiene el dato de las cinco líneas del
; puerto A al que está conectado un array de interrutores,
; sumándole el valor de una constante.
; Es decir: (PORTB)=(PORTA)+Constante
; -----------------------------------------------------------
 LIST   p=PIC16F84A
 INCLUDE  <P16F84A.inc>
 __CONFIG  _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
 ERRORLEVEL  -302

; -----------------------------------------------------------

; Variables
 CBLOCK 0x0c   ; Inicio bloque de variables
 ; Vacío porque no se usan variables
 ENDC    ; Fin bloque de variables

; -----------------------------------------------------------

; -----------------------------------------------------------
; Vectores
 ORG  0x000
 goto  Inicio ; Vector de Reset

 ORG  0x004
 retfie   ; Vector de Interrupción

; -----------------------------------------------------------
; Programa Principal
; -----------------------------------------------------------

Inicio
 bsf  STATUS,RP0
 movlw  b'00011111'
 movwf  TRISA  ; PortA como entrada
 clrf  TRISB  ; PortB como salida
 bcf  STATUS,RP0
Loop
 movf   PORTA,W  ; Valor de PORTA en W
 addlw  .10   ; Suma 10 al valor del PORTA (W)
 movwf  PORTB  ; Muestra la suma en PORTB
 goto  Loop
; -----------------------------------------------------------
END
; -----------------------------------------------------------

Ejercicio 3

; -----------------------------------------------------------

; Descripción:
; Por el Puerto B se obtiene el dato del Puerto A multiplicado por 2.
; Es decir: (PORTB)=2*(PORTA)=(PORTA)+(PORTA)
; -----------------------------------------------------------

; -----------------------------------------------------------
; Laboratorio 2
; E.T. N° 28 "República Francesa"
; Grupo: Leibovich, Núñez, Pedre
; 5to 4ta 2012

; -----------------------------------------------------------

; -----------------------------------------------------------

 LIST p=PIC16F84A
 INCLUDE <P16F84A.inc>
 __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
 ERRORLEVEL -302

; -----------------------------------------------------------
; Variables
 CBLOCK 0x0c
 ; Vacio porque no se usan variables.

 ENDC

; -----------------------------------------------------------

; -----------------------------------------------------------

; Vectores
 ORG  0x000
 goto  Inicio ; Vector de Reset

 ORG  0x004
 retfie   ; Vector de Interrupción

; -----------------------------------------------------------
; Programa Principal
; -----------------------------------------------------------

Inicio
 bsf  STATUS,RP0
 movlw  b'00011111'
 movwf  TRISA  ; PortA como entrada
 clrf  TRISB  ; PortB como salida
 bcf  STATUS,RP0

Loop
 ; -------------------------------------------------------
 ; Hecho Por Suma
 ; -------------------------------------------------------

 movf  PORTA,W ; Valor de PORTA en W
 addwf  PORTA,W ; Suma PORTA al valor del PORTA
 movwf  PORTB ; Muestra la suma en PORTB
 goto  Loop

 ; -------------------------------------------------------
 ; Hecho Por Rotate
 ; -------------------------------------------------------

 movf  PORTA,W ; Copio el contenido de PORTA en W 
 rlf  W,W ; Roto a izquierda, ya que de ésta manera se
          ; multiplica por 2
 movwf  PORTB ; Muestra el resultado en PORTB
 goto  Loop

; -----------------------------------------------------------
END
; -----------------------------------------------------------

Ejercicio 4

; -----------------------------------------------------------
; Descripción:
;Por el Puerto B obtiene el dato del Puerto A, pero en la salida los bits pares 
;se fijan siempre a "1". El orden de los bits sera "b7 b6 b5 b4 b3 b2 b1 b0",
;siendo los pares b6, b4, b2 y b0.
;Por ejemplo, si por el Puerto A se introduce el dato b'---01100', por el 
;Puerto B se visualizan b'01011101'. 
;Observar que los bits pares están a "1" (efectivamente: 
;Puerto B = b'x1x1x1x1')y los impares permanecen con el dato 
;del puerto de entrada (efectivamente: Puerto A = b'---X1x0x y 
;Puerto B = b'xxx1x0x').
; -----------------------------------------------------------

; -----------------------------------------------------------
; Laboratorio 2 ; E.T. N° 28 "República Francesa" ; Grupo: Leibovich, Núñez, Pedre ; 5to 4ta 2012 ; ----------------------------------------------------------- ; ----------------------------------------------------------- LIST p=PIC16F84A INCLUDE <P16F84A.inc> __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ERRORLEVEL -302 ; ----------------------------------------------------------- ; Variables CBLOCK 0x0c var1 ; Contendrá el valor para la máscara ENDC ; ----------------------------------------------------------- ; ----------------------------------------------------------- ; Vectores ORG 0x000 goto Inicio ; Vector de Reset ORG 0x004 retfie ; Vector de Interrupción ; ----------------------------------------------------------- ; Programa Principal ; ----------------------------------------------------------- Inicio bsf STATUS,RP0 movlw b'00011111' movwf TRISA ; PortA como entrada clrf TRISB ; PortB como salida bcf STATUS,RP0 movlw b'01010101' ; Valor para la máscara movwf var1 ; Guardo valor de la máscara en var1 Loop movf PORTA,W ; Valor de PORTA en W iorwf var1,W ; Función OR (máscara) movwf PORTB ; Muestra el resultado en PORTB goto Loop
; -----------------------------------------------------------
END
; -----------------------------------------------------------

Ejercicio 5

; -----------------------------------------------------------
; Descripción:
; Por el Puerto B obtiene el dato del Puerto A, pero en las
; salidas los bits impares se fijan siempre a "0". El orden
; de los bits será "b7 b6 b5 b4 b3 b2 b1 b0", siendo los
; impares el b7, b5, b3 y b1.
; Por ejemplo si por el Puerto A se introduce el dato
; b'---01100', por el Puerto B se visualiza  b'00000100'.
; Observar que los bits impares están a "0" (efectivamente:
; Puerto B = b'0x0x0x0x') y los pares permanecen con el dato
; del puerto de entrada (efectivamente:
; Puerto A = b'---0x1x0' y Puerto B = b'---0x1x0').
; -----------------------------------------------------------

; -----------------------------------------------------------

; Laboratorio 2
; E.T. N° 28 "República Francesa"
; Grupo: Leibovich, Núñez, Pedre
; 5to 4ta 2012
; -----------------------------------------------------------

; -----------------------------------------------------------

 LIST p=PIC16F84A
 INCLUDE <P16F84A.inc>
 __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
 ERRORLEVEL -302
; -----------------------------------------------------------

; Variables
 CBLOCK 0x0c
 var1 ; Contendrá el valor para la máscara
 ENDC

; -----------------------------------------------------------

; -----------------------------------------------------------
; Vectores
 ORG  0x000
 goto  Inicio ; Vector de Reset

 ORG  0x004
 retfie   ; Vector de Interrupción

; -----------------------------------------------------------
; Programa Principal
; -----------------------------------------------------------

Inicio
 bsf  STATUS,RP0
 movlw  b'00011111'
 movwf  TRISA  ; PortA como entrada
 clrf  TRISB  ; PortB como salida
 bcf  STATUS,RP0
 movlw  b'01010101' ; Valor para la máscara
 movwf  var1  ; Guardo valor de la máscara en var1

Loop
 movf  PORTA,W  ; Valor de PORTA en W
 andwf  var1,W  ; Función AND (máscara)
 movwf  PORTB  ; Muestra el resultado en PORTB
 goto  Loop

; -----------------------------------------------------------
END
; -----------------------------------------------------------

Ejercicio 6

; -----------------------------------------------------------

; Descripción:
; Por el Puerto B se obtiene el dato del Puerto A invirtiendo
; los bits pares. Los impares se dejan como en la entrada. El
; orden de los bits será "b7 b6 b5 b4 b3 b2 b1 b0", siendo
; los pares el b6, b4, b2 y el b0.
; Por ejemplo, si por el Puerto A se introduce "---11001", por
; el Puerto B aparecerá "xxx01100".  Observar que los bits
; pares están invertidos (efectivamente: Puerto A = "---1x0x1"
; y Puerto B = "xxxx0x1x0") y en los impares permanece el dato
; del puerto de entrada (efectivamente: Puerto A = "---x1x0x'
; y Puerto B = b'xxxx1x0x').
; Ayuda: Utiliza la función XOR y la máscara b'01010101'
; -----------------------------------------------------------

; -----------------------------------------------------------

; Laboratorio 2 
; E.T. N° 28 "República Francesa" 
; Grupo: Leibovich, Núñez, Pedre 
; 5to 4ta 2012 
; -----------------------------------------------------------

; -----------------------------------------------------------

 LIST p=PIC16F84A

 INCLUDE <P16F84A.inc>

 __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

 ERRORLEVEL -302

; -----------------------------------------------------------

; Variables

 CBLOCK 0x0c

 var1 ; Contendrá el valor para la máscara

 ENDC

; -----------------------------------------------------------

; -----------------------------------------------------------

; Vectores

 ORG  0x000

 goto  Inicio ; Vector de Reset



 ORG  0x004

 retfie   ; Vector de Interrupción

; -----------------------------------------------------------

; Programa Principal

; -----------------------------------------------------------

Inicio

 bsf  STATUS,RP0

 movlw  b'00011111'

 movwf  TRISA  ; PortA como entrada

 clrf  TRISB  ; PortB como salida

 bcf  STATUS,RP0

 movlw  b'01010101' ; Valor para la máscara

 movwf  var1  ; Guardo valor de la máscara en var1

Loop

 movf  PORTA,W  ; Valor de PORTA en W

 xorwf  var1,W  ; Función XOR (máscara)

 movwf  PORTB  ; Muestra el resultado en PORTB

 goto Loop

; -----------------------------------------------------------

END

; -----------------------------------------------------------

Ejercicio 7

; -----------------------------------------------------------

; Descripción:

; Por el Puerto B se obtiene el dato del Puerto A invertidos

; los unos y ceros. Por ejemplo, si por el Puerto A se

; introduce "---11001", por el Puerto B aparecerá "xxx00110"

; (no importa el estado de los tres bits superiores del

; Puerto B).

; -----------------------------------------------------------

; -----------------------------------------------------------

; Laboratorio 2

; E.T. N° 28 "República Francesa"

; Grupo: Leibovich, Núñez, Pedre

; 5to 4ta 2012

; -----------------------------------------------------------

; -----------------------------------------------------------

 LIST p=PIC16F84A

 INCLUDE <P16F84A.inc>

 __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

 ERRORLEVEL -302

; -----------------------------------------------------------

; Variables

 CBLOCK 0x0c

 ; No se usa variable

 ENDC

; -----------------------------------------------------------

; -----------------------------------------------------------

; Vectores

 ORG  0x000

 goto  Inicio ; Vector de Reset



 ORG  0x004

 retfie   ; Vector de Interrupción

; -----------------------------------------------------------

; Programa Principal

; -----------------------------------------------------------

Inicio

 bsf STATUS,RP0

 movlw  b'00011111'

 movwf  TRISA  ; PortA como entrada

 clrf  TRISB  ; PortB como salida

 bcf  STATUS,RP0

Loop

 movf  PORTA,W  ; Valor de PORTA en W

 comf  W,W   ; Función complemento

 movwf  PORTB  ; Muestra el resultado en PORTB

 goto  Loop

; -----------------------------------------------------------

END

; -----------------------------------------------------------

Ejercicio 8

; -----------------------------------------------------------

; Descripción:

; Por el Puerto B obtiene el dato del Puerto A intercambiando

; los nibbles alto y bajo. Por ejemplo, si por el Puerto A

; se introduce "---11001" por el Puerto B aparecerá "1001xxx1".

; -----------------------------------------------------------

; -----------------------------------------------------------

; Laboratorio 2

; E.T. N° 28 "República Francesa"

; Grupo: Leibovich, Núñez, Pedre

; 5to 4ta 2012

; -----------------------------------------------------------

; -----------------------------------------------------------

 LIST p=PIC16F84A

 INCLUDE <P16F84A.inc>

 __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

 ERRORLEVEL -302

; -----------------------------------------------------------

; Variables

 CBLOCK 0x0c

 ; No se usa variable

 ENDC

; -----------------------------------------------------------

; -----------------------------------------------------------

; Vectores

 ORG  0x000

 goto  Inicio ; Vector de Reset



 ORG  0x004

 retfie   ; Vector de Interrupción

; -----------------------------------------------------------

; Programa Principal

; -----------------------------------------------------------

Inicio

 bsf STATUS,RP0

 movlw  b'00011111'

 movwf  TRISA  ; PortA como entrada

 clrf  TRISB  ; PortB como salida

 bcf  STATUS,RP0

Loop

 movf  PORTA,W  ; Valor de PORTA en W

 swapf  W,W   ; Cambia nibbles

 movwf  PORTB  ; Muestra el resultado en PORTB

 goto  Loop

; -----------------------------------------------------------

END

; -----------------------------------------------------------

Ejercicio 9

; -----------------------------------------------------------

; Descripción:

; Por el Puerto B obtiene el dato del Puerto A desplazando

; un bit hacia la izquierda, por la derecha entrará un "1".

; Por ejemplo, si por el Puerto A se introduce "---11001",

; por el Puerto B aparecerá "xx110011" (no importa el

; estado de los dos bits superiores del Puerto B).

; -----------------------------------------------------------

; -----------------------------------------------------------

; Laboratorio 2

; E.T. N° 28 "República Francesa"

; Grupo: Leibovich, Núñez, Pedre

; 5to 4ta 2012

; -----------------------------------------------------------

; -----------------------------------------------------------

 LIST p=PIC16F84A

 INCLUDE <P16F84A.inc>

 __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

 ERRORLEVEL -302

; -----------------------------------------------------------

; Variables

 CBLOCK 0x0c

 ; No se usa variable

 ENDC

; -----------------------------------------------------------

; -----------------------------------------------------------

; Vectores

 ORG  0x000

 goto  Inicio ; Vector de Reset



 ORG  0x004

 retfie   ; Vector de Interrupción

; -----------------------------------------------------------

; Programa Principal

; -----------------------------------------------------------

Inicio

 bsf STATUS,RP0

 movlw  b'00011111'

 movwf  TRISA  ; PortA como entrada

 clrf  TRISB  ; PortB como salida

 bcf  STATUS,RP0

Loop

 bsf  STATUS,C  ; Carry en 1

 movf  PORTA,W  ; Valor de PORTA en W

 rlf  W,W   ; Rota el valor de PORTA a izquierda

 movwf  PORTB  ; Muestra el resultado en PORTB

 goto  Loop

; -----------------------------------------------------------

END

; -----------------------------------------------------------

Ejercicio 10

; -----------------------------------------------------------
; Descripción:
; Por el Puerto B se obtiene el dato del Puerto A desplazando
; un bit hacia la derecha, por la izquierda entrará un "0".
; Por ejemplo, si por el Puerto A se introduce "---11001",
; por el Puerto B aparecerá "0xxx1100".
; -----------------------------------------------------------

; -----------------------------------------------------------
; Laboratorio 2
; E.T. N° 28 "República Francesa"
; Grupo: Leibovich, Núñez, Pedre
; 5to 4ta 2012
; -----------------------------------------------------------

; -----------------------------------------------------------
 LIST p=PIC16F84A
 INCLUDE <P16F84A.inc>
 __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
 ERRORLEVEL -302
; -----------------------------------------------------------
; Variables
 CBLOCK 0x0c
 ; No se usa variable
 ENDC
; -----------------------------------------------------------

; -----------------------------------------------------------

; Vectores
 ORG 0x000
 goto Inicio ; Vector de Reset

 ORG 0x004
 retfie ; Vector de Interrupción
; -----------------------------------------------------------
; Programa Principal
; -----------------------------------------------------------
Inicio
 bsf STATUS,RP0
 movlw b'00011111'
 movwf TRISA ; PortA como entrada
 clrf TRISB ; PortB como salida
 bcf STATUS,RP0
Loop
 bcf STATUS,C ; Carry en 1
 movf PORTA,W ; Valor de PORTA en W
 rrf W,W ; Rota el valor de PORTA a derecha
 movwf PORTB ; Muestra el resultado en PORTB
 goto Loop
; -----------------------------------------------------------
END
; -----------------------------------------------------------

Ejercicio 11

; -----------------------------------------------------------
; Descripción:
; Por el Puerto B se obtiene el dato de las cinco líneas del
; Puerto A al que está conectado un array de interruptores. 
; Por ejemplo, si por el Puerto A se introduce "---110001"
; por el Puerto B aparecerá "xxx11001" (el valor de las tres
; líneas superiores no importa).
; Esta operación la realizará una única vez. Después el
; programa entrará en modo "Standby" o de bajo consumo del
; cual no podrá salir después.
; -----------------------------------------------------------
; Laboratorio 2
; E.T. N° 28 "República Francesa"
; Grupo: Leibovich, Núñez, Pedre
; 5to 4ta 2012
; -----------------------------------------------------------
 LIST  p=PIC16F84A
 INCLUDE  
 __CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
 ERRORLEVEL -302
; -----------------------------------------------------------
;Variables
 CBLOCK 0x0c
 ; Vacío porque no se usan variables
 ENDC
; -----------------------------------------------------------
;Vectores
 ORG  0x00
 goto Inicio  ; Vector de Reset
 ORG  0x04
 retfie    ; Vector de Interrupción
; -----------------------------------------------------------
; Programa Principal
; -----------------------------------------------------------
Inicio
 ; -------------------------------------------------------
 bsf  STATUS,RP0 ; Cambio de banco
 movlw b'11111'
 movwf TRISA  ; Puerto A como entrada
 clrf TRISB  ; Puerto B como salida
 bcf  STATUS,RP0 ; Cambio de banco
 ; -------------------------------------------------------
 movf PORTA,W  ; Entrada a W
 movwf PORTB  ; W a salida
 sleep    ; Modo bajo consumo
; -----------------------------------------------------------
END
; -----------------------------------------------------------

Ejercicio 12

; -----------------------------------------------------------
; Descripción:
; Compara el dato del puerto de entrada PORTA con un "Numero"
; Tres posibilidades:
; - Si (PORTA)=Numero se encienden todos los LEDs de salida
; - Si (PORTA)>Numero se activan los LEDs pares de salida
; - Si (PORTA)<Numero se encienden los LEDs del nibble alto y 
;se apagan los del bajo.
; -----------------------------------------------------------
; Laboratorio 2
; E.T. N° 28 "República Francesa"
; Grupo: Leibovich, Núñez, Pedre
; 5to 4ta 2012
; -----------------------------------------------------------
 LIST  p=PIC16F84A
 INCLUDE 
 __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
 ERRORLEVEL -302
; -----------------------------------------------------------
; Variables:
 CBLOCK 0x0C
 numero
 ENDC
; -----------------------------------------------------------
; Vectores:
 ORG  0x00
 goto Inicio
 ORG  0x04
 retfie
; -----------------------------------------------------------
; Programa principal
; -----------------------------------------------------------
Inicio
 bsf  STATUS,RP0
 movlw b'11111'
 movwf TRISA
 clrf TRISB
 bcf  STATUS,RP0
Loop
 movlw .2
 movwf numero
 movf PORTA,W
 subwf numero,W
 ; -------------------------------------------------------
 ; Comparaciones:
 ; -------------------------------------------------------
 btfss STATUS,C ; Si carry está en cero quiere decir
 goto Menor  ; que es menor.
 btfss STATUS,Z ; Si carry está en uno y Z en cero
 goto Mayor  ; quiere decir que es mayor.
 goto Igual  ; Sino, es igual.
Mayor
 movlw b'01010101'
 movwf PORTB
 goto Loop
Menor
 movlw b'11110000'
 movwf PORTB
 goto Loop
Igual
 movlw b'11111111'
 movwf PORTB
 goto Loop
; -----------------------------------------------------------
END
; -----------------------------------------------------------

Ejercicio 13

; -----------------------------------------------------------
; Descripción:
; Un número binario de 8 bits es convertido a BCD. El resul-
; tado se guarda en tres posiciones de memoria llamadas
; Centenas, Decenas y Unidades. Además, al final las unidades
; estarán en el nibble bajo del registro W y las decenas en
; el nibble alto. En los diodos LEDs conectado al puerto de
; salida se visualizarán las decenas y las unidades.
; -----------------------------------------------------------
; Laboratorio 2
; E.T. N° 28 "República Francesa"
; Grupo: Leibovich, Núñez, Pedre
; 5to 4ta 2012
; -----------------------------------------------------------
 LIST  p=PIC16F84A
 INCLUDE  
 __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
 ERRORLEVEL -302
; -----------------------------------------------------------
; Variables
 CBLOCK 0x0c
 Centenas
 Decenas
 Unidades
 ENDC
; -----------------------------------------------------------
; Vectores
 ORG  0x00
 goto Inicio
 ORG  0x04
 retfie
; -----------------------------------------------------------
; Programa Principal
; -----------------------------------------------------------
Inicio
 bsf  STATUS,RP0
 clrf TRISB  ; Puerto A como salida
 movlw b'11111111'
 movwf TRISA ; Puerto B como entrada
 bcf  STATUS,RP0
Loop
 movf PORTB,W  ; Entrada a W
 movwf Unidades ; Número listo para operar
Resta
 movlw .10  ; 10 en W
 subwf Unidades,W ; Resto 10 a Unidades. Va a W
 btfss STATUS,C ; Salta si el Carry está en 1
 goto Resultado ; Va a resultado, al finalizar la
      ; conversión
SumaDecenas
 movwf Unidades ; El resultado de la resta a Unidades
 incf Decenas,F ; Sumo 1 a decenas
 movlw .10   ; 10 en W
 subwf Decenas,W ; Resto 10 a decenas. Va a W
 btfss STATUS,C ; Salta si el Carry está en 1
 goto Resta
SumaCentenas
 clrf Decenas  ; Borro el contenido de decenas
 incf Centenas,F ; Sumo 1 a centenas
 goto Resta
Resultado
 swapf Decenas,W ; Valor de decenas en nibble alto. A W
 addwf Unidades,W ; Le sumo las unidades
 movwf PORTA  ; Lo muestro en la salida
 goto Loop  ; Vuelve a empezar
; -----------------------------------------------------------
END
; -----------------------------------------------------------

Ejercicio 14

; -----------------------------------------------------------
; Descripción:
; Controla el nivel de un líquido. Utiliza:
; · Tres sondas detectoras: 
;  # SV, Sonda de Vacío (RA0)
;  # SLL, Sonda de Llenado (RA1)
;  # SR, Sonda de Rebose (RA2)
; · Dos bombas de agua:
;  # B1 (RB5)
;  # B2 (RB6)
; · Cinco indicadores:
;  # Vacío (RB0)
;  # Llenandose (RB1)
;  # Lleno (RB2)
;  # Rebose (RB3)
;  # Alarma (RB4)
; Funcionamiento:
; · Cuando ninguna de las sondas está mojada se entiende
; que el depósito está vacío y se accionarán las dos bombas
; · Cuando el nivel del líquido toque la sona de vacío "SV"
; seguirá llenándose el depósito con las dos bombas. El
; indicador "Llenandose" se ilumina.
; Cuando el nivel del líquido toca la sonda de llenado"SSL",
; para la bomba B2, quedando B1 activada en modo
; mantenimiento.
; · Si el nivel del líquido moja la sonda de rebose "SR"
; se apaga también la bomba B1, quedando las dos bombas
; fuera de servicio. El indicador "Rebose" se enciende.
; · Cuando se produce un fallo o mal funcionamiento en las
; sondas de entrada (por ejemplo que se active la sonda de
; rebose y no active la de vacío) se paran las dos bombas.
; El indicador "Alarma" se ilumina.
; -----------------------------------------------------------
; Laboratorio 2
; E.T. N° 28 "República Francesa"
; Grupo: Leibovich, Núñez, Pedre
; 5to 4ta 2012
; -----------------------------------------------------------
 LIST  p=PIC16F84A
 INCLUDE  
 __CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
 ERRORLEVEL -302
; -----------------------------------------------------------
; Variables
 CBLOCK 0x0c
 ; Vacío porque no uso variables
 ENDC
; -----------------------------------------------------------
;Equivalencias
 SV   EQU 0 ; A
 SLL   EQU 1 ; A
 SR   EQU 2 ; A
 B1   EQU 5 ; B
 B2   EQU 6 ; B
 Vacio  EQU 0 ; B
 Llenandose EQU 1 ; B
 Lleno  EQU 2 ; B
 Rebose  EQU 3 ; B
 Alarma  EQU 4 ; B
; -----------------------------------------------------------
;Vectores
 ORG  0x00
 goto Inicio
 ORG  0x04
 retfie
; -----------------------------------------------------------
; Programa Principal
; -----------------------------------------------------------
Inicio
 bsf  STATUS,RP0
 movlw b'111'
 movwf TRISA ; Puerto A como entrada
 clrf TRISB ; Puerto B como salida
 bcf  STATUS,RP0
Loop
 btfsc PORTA,SV
 goto FuncLlenandose
 btfsc PORTA,SLL
 goto SonarAlarma
 btfsc PORTA,SR
 goto Alarma
 goto FuncVacio
FuncVacio
 bsf  PORTB,Vacio
 bsf  PORTB,B1
 bsf  PORTB,B2
 goto Loop
FuncLlenandose
 btfsc PORTA,SLL
 goto FuncLleno
 bsf  PORTB,Llenandose
 btfsc PORTA,SR
 goto Loop
FuncLleno
 btfsc PORTA,SR
 goto FuncRebose
 bcf  PORTB,B2
 bsf  PORTB,Lleno
 goto Loop
FuncRebose
 bcf  PORTB,B1
 bsf  PORTB,Rebose
 goto Loop
SonarAlarma
 bcf  PORTB,B1
 bcf  PORTB,B2
 bcf  PORTB,Vacio
 bcf  PORTB,Llenandose
 bcf  PORTB,Lleno
 bcf  PORTB,Rebose
 bsf  PORTB,Alarma
 goto Loop
; -----------------------------------------------------------
END
; -----------------------------------------------------------

Ejercicio 15

; -----------------------------------------------------------
; Descripción:
; Por el display de 7 segmentos conectado al Puerto B se
; visualiza una de las 26 letras del alfabeto internacional: 
; de la "A" a la "Z". La letra a visualizar lo determina el 
; orden leído por el Puerto A. Así por ejemplo:
; Si por el Puerto A se lee "---0000"  (cero) la letra
; visualizada será la "A" que es la que está en el orden cero.
; Si por el Puerto A se lee "---1101" (veinticinco) la letra
; visualizada será la "Z" que es la que está en el orden
; veinticinco.
; Por ahora no se contempla la posibilidad que el número de
; entrada sea mayor de 25.
; -----------------------------------------------------------
; Laboratorio 2
; E.T. N° 28 "República Francesa"
; Grupo: Leibovich, Núñez, Pedre
; 5to 4ta 2012
; -----------------------------------------------------------
 LIST  p=PIC16F84A
 INCLUDE  
 __CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
 ERRORLEVEL -302
; -----------------------------------------------------------
; Variables
 CBLOCK 0x0c
 ; Vacío porque no uso variables
 ENDC
; -----------------------------------------------------------
;Vectores
 ORG  0x00
 goto Inicio
 ORG  0x04
 retfie
; -----------------------------------------------------------
; Programa Principal
; -----------------------------------------------------------
Inicio
 bsf  STATUS,RP0
 movlw b'11111'
 movwf TRISA ; Puerto A como entrada
 clrf TRISB ; Puerto B como salida
 bcf  STATUS,RP0
Loop
 btfss PORTA,4
 goto MenorIgual15
 btfss PORTA,3
 goto Mayor15MenorIgual23
 btfss PORTA,0
 ;Código para escribir letra Y
 ;Código para escribir letra Z
 goto Loop
Mayor15MenorIgual23
 btfss PORTA,2
 goto Mayor15MenorIgual20
 btfss PORTA,1
 goto Mayor20MenorIgual23
 btfss PORTA,0
 ;Código para escribir letra W
 ;Código para escribir letra X
 goto Loop
Mayor20MenorIgual23
 btfss PORTA,0
 ;Código para escribir letra U
 ;Código para escribir letra V
 goto Loop
Mayor15MenorIgual20
 btfss PORTA,1
 goto Mayor15MenorIgual19
 btfss PORTA,0
 ;Código para escribir letra S
 ;Código para escribir letra T
 goto Loop
Mayor15MenorIgual19
 btfss PORTA,0
 ;Código para escribir letra Q
 ;Código para escribir letra R
 goto Loop
MenorIgual15
 btfss PORTA,3
 goto MenorIgual7
 btfss PORTA,2
 goto Mayor7MenorIgual11
 btfss PORTA,1
 goto Mayor11MenorIgual15
 btfss PORTA,0
 ;Código para escribir letra O
 ;Código para escribir letra P
 goto Loop
Mayor11MenorIgual15
 btfss PORTA,0
 ;Código para escribir letra M
 ;Código para escribir letra N
Mayor7MenorIgual11
 btfss PORTA,1
 goto Mayor7MenorIgual12
 btfss PORTA,0
 ;Código para escribir letra K
 ;Código para escribir letra L
 goto Loop
Mayor7MenorIgual12
 btfss PORTA,0
 ;Código para escribir letra I
 ;Código para escribir letra J
 goto Loop
MenorIgual7
 btfss PORTA,2
 goto MenorIgual3
 btfss PORTA,1
 goto Mayor3MenorIgual7
 btfss PORTA,0
 ;Código para escribir letra G
 ;Código para escribir letra H
 goto Loop
Mayor3MenorIgual7
 btfss PORTA,0
 ;Código para escribir letra E
 ;Código para escribir letra F
 goto Loop
MenorIgual3
 btfss PORTA,1
 goto Mayor1MenorIgual3
 btfss PORTA,0
 ;Código para escribir letra C
 ;Código para escribir letra D
 goto Loop
Mayor1MenorIgual3
 btfss PORTA,0
 ;Código para escribir letra A
 ;Código para escribir letra B
; -----------------------------------------------------------
END
; -----------------------------------------------------------

Ejercicio 16

; -----------------------------------------------------------
; Descripción:
; Los diodos pares conectados al puerto de salida se encienden
; durante 0,5 segundos y los impares permanecen apagados.
; Después al contrario durante el mismo tiempo.
; -----------------------------------------------------------
; Laboratorio 2
; E.T. N° 28 "República Francesa"
; Grupo: Leibovich, Núñez, Pedre
; 5to 4ta 2012
; -----------------------------------------------------------
 LIST  p=PIC16F84A
 INCLUDE  
 __CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
 ERRORLEVEL -302
; -----------------------------------------------------------
; Variables
 CBLOCK 0x0c
 delay1
 delay2
 delay3
 ENDC
; -----------------------------------------------------------
;Equivalencias
 pares  EQU b'01010101'
 impares  EQU b'10101010'
; -----------------------------------------------------------
;Vectores
 ORG  0x00
 goto Inicio
 ORG  0x04
 retfie
; -----------------------------------------------------------
; Programa Principal
; -----------------------------------------------------------
Inicio
 bsf  STATUS,RP0
 movlw b'11111'
 movwf TRISA ; Puerto A como entrada
 clrf TRISB ; Puerto B como salida
 bcf  STATUS,RP0
Loop
 movlw pares
 movwf PORTB
 call Delay_500ms
 movlw impares
 movwf PORTB
 call Delay_500ms
 goto Loop
 
Delay_500ms
 movlw d'5'
 movwf delay3
Delay_500ms_2
 movlw d'100'
 movwf delay2
Delay_500ms_1
 movlw d'249'
 movwf delay1
Delay_500ms_0         
 nop
 decfsz delay1,F
 goto Delay_500ms_0
 decfsz delay2,F
 goto Delay_500ms_1
 decfsz delay3,F
 goto Delay_500ms_2
 return
; ---------------------------------------------------------
END
; ---------------------------------------------------------

Ejercicio 17

; -----------------------------------------------------------
; Descripción:
; Por la barra de diodos leds conectada al puerto de salida,
; un led encendido rota a la izquierda 0,3 s en cada posición.
; Cuando llega al final se apagan todos los leds y repite de
; nuevo la operación.
; -----------------------------------------------------------
; Laboratorio 2
; E.T. N° 28 "República Francesa"
; Grupo: Leibovich, Núñez, Pedre
; 5to 4ta 2012
; -----------------------------------------------------------
 LIST  p=PIC16F84A
 INCLUDE  
 __CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
 ERRORLEVEL -302
; -----------------------------------------------------------
; Variables
 CBLOCK 0x0c
 d1
 d2
 var1
 ENDC
; -----------------------------------------------------------
;Equivalencias
; -----------------------------------------------------------
;Vectores
 ORG  0x00
 goto Inicio
 ORG  0x04
 retfie
; -----------------------------------------------------------
; Programa Principal
; -----------------------------------------------------------
Inicio
 bsf  STATUS,RP0
 movlw b'11111'
 movwf TRISA ; Puerto A como entrada
 clrf TRISB ; Puerto B como salida
 bcf  STATUS,RP0
 bsf  STATUS,C
 movlw 0x00
 movwf var1
Loop
 rlf  var1,F
 movf var1,W
 movwf PORTB
 call Delay_300ms
 goto Loop
 
Delay_300ms
 movlw 0x5E
 movwf d1
 movlw 0xEB
 movwf d2
Delay_300ms_0
 decfsz d1, f
 goto $+2
 decfsz d2, f
 goto Delay_300ms_0
 goto $+1
 nop
 return

; ---------------------------------------------------------
END
; ---------------------------------------------------------

Ejercicio 18

; -----------------------------------------------------------
; Descripción:
; Por la barra de LEDs conectada al puerto de salida un LED
; encendido rota a la izquierda durante 0.5 s en cada posición
; empezando por la línea RB0. El número de posiciones a
; desplazar lo fija el valor de las tres primeras líneas del
; Puerto A entrada.
; Así por ejemplo, si (PORTA)=b'---00011' (3 decimal), la
; secuencia de salida sería:
; 00000000, 00000001, 00000010, 00000100, 00000000, 00000001,
; 00000010,... ( y repite)
; -----------------------------------------------------------
; Laboratorio 2
; E.T. N° 28 "República Francesa"
; Grupo: Leibovich, Núñez, Pedre
; 5to 4ta 2012
; -----------------------------------------------------------
 LIST  p=PIC16F84A
 INCLUDE  
 __CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
 ERRORLEVEL -302
; -----------------------------------------------------------
; Variables
 CBLOCK 0x0c
 delay1
 delay2
 delay3
 veces
 ENDC
; -----------------------------------------------------------
;Equivalencias
; -----------------------------------------------------------
;Vectores
 ORG  0x00
 goto Inicio
 ORG  0x04
 retfie
; -----------------------------------------------------------
; Programa Principal
; -----------------------------------------------------------
Inicio
 bsf  STATUS,RP0
 movlw b'111'
 movwf TRISA ; Puerto A como entrada
 clrf TRISB ; Puerto B como salida
 bcf  STATUS,RP0
Loop
 movf PORTA,W
 movwf veces
 bsf  STATUS,C
 movlw b'0'
 movwf PORTB
 btfsc PORTA,2
 goto Rotacion
 btfsc PORTA,1
 goto Rotacion
 btfsc PORTA,0
 goto Rotacion
 goto Loop
Rotacion
 rlf  W,W
 movwf PORTB
 call Delay_500ms
 decfsz veces,F
 goto Rotacion
 goto Loop
 
Delay_500ms
 movlw d'5'
 movwf delay3
Delay_500ms_2
 movlw d'100'
 movwf delay2
Delay_500ms_1
 movlw d'249'
 movwf delay1
Delay_500ms_0         
 nop
 decfsz delay1,F
 goto Delay_500ms_0
 decfsz delay2,F
 goto Delay_500ms_1
 decfsz delay3,F
 goto Delay_500ms_2
 return
; ---------------------------------------------------------
END
; ---------------------------------------------------------

Ejercicio 19


Ejercicio 20

; -----------------------------------------------------------
; Descripción:
; Si la línea RA0 del Puerto A es "0", por el display se
; visualiza un contador descendente (9, 8, 7, 6, 5, 4, 3, 2,
; 1, 0, 9, ..) con una cadencia de 0,5 segundos.
; Si la línea RA0 del Puerto A es "1", por el display se
; visualizará un contador ascendente (0, 1, 2, 3, 5, 6, 7, 8,
; 9, 0, 1, 2, ..) con una cadencia de 0,5 s.
; -----------------------------------------------------------
; Laboratorio 2
; E.T. N° 28 "República Francesa"
; Grupo: Leibovich, Núñez, Pedre
; 5to 4ta 2012
; -----------------------------------------------------------
 LIST  p=PIC16F84A
 INCLUDE  
 __CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
 ERRORLEVEL -302
; -----------------------------------------------------------
; Variables
 CBLOCK 0x0c
 delay1
 delay2
 delay3
 veces
 ENDC
; -----------------------------------------------------------
;Equivalencias
 #DEFINE Mostrar0 movlw b'0111111'
 #DEFINE Mostrar1 movlw b'0000110'
 #DEFINE Mostrar2 movlw b'1011011'
 #DEFINE Mostrar3 movlw b'1001111'
 #DEFINE Mostrar4 movlw b'1100110'
 #DEFINE Mostrar5 movlw b'1101101'
 #DEFINE Mostrar6 movlw b'1111101'
 #DEFINE Mostrar7 movlw b'0000111'
 #DEFINE Mostrar8 movlw b'1111111'
 #DEFINE Mostrar9 movlw b'1101111'
; -----------------------------------------------------------
;Vectores
 ORG  0x00
 goto Inicio
 ORG  0x04
 retfie
; -----------------------------------------------------------
; Programa Principal
; -----------------------------------------------------------
Inicio
 bsf  STATUS,RP0
 movlw b'1'
 movwf TRISA ; Puerto A como entrada
 clrf TRISB ; Puerto B como salida
 bcf  STATUS,RP0
Loop
 btfss PORTA,0
 goto ContadorAscendente
 goto ContadorDescendente
ContadorAscendente
 Mostrar0
 movwf PORTB
 call Delay_500ms
 Mostrar1
 movwf PORTB
 call Delay_500ms
 Mostrar2
 movwf PORTB
 call Delay_500ms
 Mostrar3
 movwf PORTB
 call Delay_500ms
 Mostrar4
 movwf PORTB
 call Delay_500ms
 Mostrar5
 movwf PORTB
 call Delay_500ms
 Mostrar6
 movwf PORTB
 call Delay_500ms
 Mostrar7
 movwf PORTB
 call Delay_500ms
 Mostrar8
 movwf PORTB
 call Delay_500ms
 Mostrar9
 movwf PORTB
 call Delay_500ms
 goto Loop
ContadorDescendente
 Mostrar9
 movwf PORTB
 call Delay_500ms
 Mostrar8
 movwf PORTB
 call Delay_500ms
 Mostrar7
 movwf PORTB
 call Delay_500ms
 Mostrar6
 movwf PORTB
 call Delay_500ms
 Mostrar5
 movwf PORTB
 call Delay_500ms
 Mostrar4
 movwf PORTB
 call Delay_500ms
 Mostrar3
 movwf PORTB
 call Delay_500ms
 Mostrar2
 movwf PORTB
 call Delay_500ms
 Mostrar1
 movwf PORTB
 call Delay_500ms
 Mostrar0
 movwf PORTB
 call Delay_500ms
 goto Loop
 
Delay_500ms
 movlw d'5'
 movwf delay3
Delay_500ms_2
 movlw d'100'
 movwf delay2
Delay_500ms_1
 movlw d'249'
 movwf delay1
Delay_500ms_0         
 nop
 decfsz delay1,F
 goto Delay_500ms_0
 decfsz delay2,F
 goto Delay_500ms_1
 decfsz delay3,F
 goto Delay_500ms_2
 return
; ---------------------------------------------------------
END
; ---------------------------------------------------------

Resolución en C


Ejercicio 1
#include <ej1.h>

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
    set_tris_b(0xff); // PuertoB como entrada
    set_tris_a(0x00); // PuertoA como salida
   while (TRUE)
   {
      output_b(input_a());
   }
}

ej1.h:
#include <16f84a .h=".h">

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                     //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                    //Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading

#use delay(clock=4000000)
Ejercicio 2
#include <ej2.h>

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   set_tris_b(0xff); // PuertoB como entrada
   set_tris_a(0x00); // PuertoA como salida
   while(TRUE)
   {
      output_b(input_a()+5);
   }
}

ej2.h:
#include <16f84 .h=".h">

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                     //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                    //Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading

#use delay(clock=4000000)
Ejercicio 3
#include <ej3.h>

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   set_tris_a(0xFF)
   set_tris_b(0x00)
   while (TRUE)
   {
      output_b(input_a()+input_a());
   }
}

ej3.h:
#include <16f84 .h=".h">

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                     //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                    //Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading

#use delay(clock=4000000)
Ejercicio 4
#include <ej4.h>

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   set_tris_a(0xFF);
   set_tris_b(0x00);
   while(TRUE)
   {
      output_b(input_a()|0b01010101);
   }
}

ej4.h:
#include <16f84 .h=".h">

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                     //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                    //Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading

#use delay(clock=4000000)
Ejercicio 5
#include <ej5.h>

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   set_tris_a(0xFF);
   set_tris_b(0x00);
   while(TRUE)
   {
      output_b(input_a()&0b01010101);
   }
}

ej5.h:
#include <16f84a .h=".h">

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                     //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                    //Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading

#use delay(clock=4000000)
Ejercicio 6
#include <ej6.h>

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   set_tris_a(0xFF);
   set_tris_b(0x00);
   while(TRUE)
   {
      output_b(input_a()^0b01010101);
   }
}

ej6.h:
#include <16f84a .h=".h">

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                     //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                    //Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading

#use delay(clock=4000000)
Ejercicio 7
#include <ej7.h>

void main(){
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   output_b(~input_a());
}

ej7.h:
#include <16f84a .h=".h">

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                     //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                    //Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading

#use delay(clock=4000000)
Ejercicio 8
#include <ej8.h>

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   output_b(swap(input_a()));
}

ej8.h:
#include <16f84a .h=".h">

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                     //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                    //Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading

#use delay(clock=4000000)
Ejercicio 9
#include <ej9.h>

void main(){
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   int8 numero;
   set_tris_b(0x00);
   set_tris_a(0xFF);
   while(TRUE){
      numero=input_a();
      rotate_left(&numero,1);
      output_b(numero|0x01);
   }
}

ej9.h:
#include <16f84a .h=".h">

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                     //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                    //Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading

#use delay(clock=4000000)
Ejercicio 10
#include <ej10.h>

void main(){
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   int8 numero;
   set_tris_b(0xFF);
   set_tris_a(0x00);
   while(TRUE){
      numero=input_a();
      rotate_right(&numero,1);
      output_b(numero);
   }
}

ej10.h:
#include <16f84a .h=".h">

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                     //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                    //Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading

#use delay(clock=4000000)
Ejercicio 11
#include <ej11.h>

void main(){
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   set_tris_a(0xFF);
   set_tris_b(0x00);
   output_b(input_a());
   sleep();
}

ej11.h:
#include <16f84a .h=".h">

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                     //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                    //Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading

#use delay(clock=4000000)
Ejercicio 12
#include <ej12.h>

void main(){
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   set_tris_a(0xFF);
   set_tris_b(0x00);
   int8 numeroEntrada;
   int8 numeroComparar=4;
   while(TRUE){
      numeroEntrada=input_a();
      if(numeroEntrada==numeroComparar){
         output_b(0xFF);
      }else{
         if(numeroEntrada

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                     //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                    //Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading

#use delay(clock=4000000)
Ejercicio 13
#include <ej13.h>

void main(){
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   set_tris_a(0xFF);
   set_tris_b(0x00);
   int8 numero;
   int8 centenas;
   int8 decenas;
   int8 unidades;
   while(TRUE){
      numero=input_a();
      if(numero>=100){
         do{
            numero=numero-100;
            centenas=centenas+1;
         }while(numero>=100);
      }
      if(numero>=10){
         do{
            numero=numero-10;
            decenas=decenas+1;
         }while(numero>=10);
      }
      unidades=numero;
      rotate_left(&decenas,4);
      output_b(decenas|unidades);
   }
}

ej13.h:
#include <16f84a .h=".h">

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                     //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                    //Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading

#use delay(clock=4000000)
Ejercicio 14

Ejercicio 15

Ejercicio 16

Ejercicio 17

Ejercicio 18

Ejercicio 19

Ejercicio 20