A continuación, se presentarán los enunciados de los ejercicios con su correspondiente resolución:
Manejo de PORTS
Ejercicio 1
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 "---11001", por el Puerto B aparecerá "xxx11001" (el valor de las tres líneas superiores no importa).
;Actividad 5 ejercicio 1
;================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;================================================================
; Defino las variables
;================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
;================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W ;muevo el PORTA al work
movwf PORTB ;muevo el work al file(PORTB)
goto Loop
;================================================================
END
;================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;================================================================
; Defino las variables
;================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
;================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W ;muevo el PORTA al work
movwf PORTB ;muevo el work al file(PORTB)
goto Loop
;================================================================
END
Funciones Matemáticas
Ejercicio 2
Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A, al que está conectado un array de interruptores, sumándole el valor de una constante, por ejemplo 74.
Es decir: (PORTB)=(PORTA)+Constante
;Actividad 5 Ejercicio 2
;================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;================================================================
; Defino las variables
;================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
k EQU .74
;================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W ;mueve el valor del PORTA a W
addlw k ;suma el literal(K) al work(porta)
movwf PORTB ;se pasa el work al PORTB
goto Loop
;================================================================
END
;================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;================================================================
; Defino las variables
;================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
k EQU .74
;================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W ;mueve el valor del PORTA a W
addlw k ;suma el literal(K) al work(porta)
movwf PORTB ;se pasa el work al PORTB
goto Loop
;================================================================
END
Ejercicio 3
Por el Puerto B se obtiene el dato del Puerto A multiplicado por 2.
Es decir: (PORTB)=2(PORTA)=(PORTA)+(PORT A).
;Actividad 5 Ejercicio 3
;================================================================LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;================================================================
; Defino las variables
;================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
k EQU .74
;================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W
addwf PORTA,W
movwf PORTB
goto Loop
;=======================================================================
END
Máscaras
Ejercicio 4
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 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 el dato b'---01100', por el Puerto B se visualiza 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'xxxx1x0x').
;Actividad 5 ejercicio 4
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W ;muevo el PORTA al work
iorlw b'01010101' ;hago una or entre el literal(valor en binario)y ; el work (PORTA)
movwf PORTB ;muevo el work al file(PORTB)
goto Loop
;=======================================================================
END
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W ;muevo el PORTA al work
iorlw b'01010101' ;hago una or entre el literal(valor en binario)y ; el work (PORTA)
movwf PORTB ;muevo el work al file(PORTB)
goto Loop
;=======================================================================
END
Ejercicio 5
Por el Puerto B obtiene el dato del Puerto A, pero en las salida 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').
;Actividad 5 ejercicio 5
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W ;muevo el PORTA al work
andlw b'10101010' ;hago una and entre el literal(valor en binario)y el
;work (PORTA)
movwf PORTB ;muevo el work al file(PORTB)
goto Loop
;=======================================================================
END
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W ;muevo el PORTA al work
andlw b'10101010' ;hago una and entre el literal(valor en binario)y el
;work (PORTA)
movwf PORTB ;muevo el work al file(PORTB)
goto Loop
;=======================================================================
END
Ejercicio 6
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'
;Actividad 5 ejercicio 6
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W ;muevo el PORTA al work
xorlw b'01010101' ;hago una xor entre el literal(valor en binario) y
;el work (PORTA)
movwf PORTB ;muevo el work al file(PORTB)
goto Loop
;=======================================================================
END
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W ;muevo el PORTA al work
xorlw b'01010101' ;hago una xor entre el literal(valor en binario) y
;el work (PORTA)
movwf PORTB ;muevo el work al file(PORTB)
goto Loop
;=======================================================================
END
Funciones lógicas
Ejercicio 7
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).
;Actividad 5 ejercicio 7
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
comf PORTA,W ;complemento el PORTA y lO guardo en el work
movwf PORTB ;muevo el work al file(PORTB)
goto Loop
;=======================================================================
END
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
comf PORTA,W ;complemento el PORTA y lO guardo en el work
movwf PORTB ;muevo el work al file(PORTB)
goto Loop
;=======================================================================
END
Ejercicio 8
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".
;Actividad 5 ejercicio 8
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
swapf PORTA,W
movwf PORTB
goto Loop
;=======================================================================
END
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
swapf PORTA,W
movwf PORTB
goto Loop
;=======================================================================
END
Ejercicio 9
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).
;Actividad 5 ejercicio 9
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
rlf PORTA,W
bsf PORTB,RB0
movwf PORTB
goto Loop
;=======================================================================
END
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
rlf PORTA,W
bsf PORTB,RB0
movwf PORTB
goto Loop
;=======================================================================
END
Ejercicio 10
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".
;Actividad 5 ejercicio 10
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
rrf PORTA,W
movwf PORTB
bcf PORTB,RB7
goto Loop
;=======================================================================
END
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
rrf PORTA,W
movwf PORTB
bcf PORTB,RB7
goto Loop
;=======================================================================
END
Funciones especiales
Ejercicio 11
Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A al que están conectado un array de interruptores. 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).
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.
;Actividad 5 ejercicio 11
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W
movwf PORTB
Sleep
goto Loop
;=======================================================================
END
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W
movwf PORTB
Sleep
goto Loop
;=======================================================================
END
Comparaciones
Ejercicio 12
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.
Hay que destacar que al no haber instrucciones de comparación, estas se realizan mediante restas.
Actividad 5 Ejercicio 12
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
Numero EQU .4
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Inicio
movlw Numero
subwf PORTA,W
btfss STATUS,Z
goto NoEsCero
goto EsCero
EsCero
movlw b'11111111'
movwf PORTB
goto Inicio
NoEsCero
btfss STATUS,C
goto NoEsUno
goto EsUno
EsUno
movlw b'01010101'
movwf PORTB
goto Inicio
NoEsUno
movlw b'11110000'
movwf PORTB
goto Inicio
END
;=======================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bSf STATUS,RP0
Numero EQU .4
;=======================================================================
ORG 0x000
goto Main
ORG 0X004
retfie
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
Inicio
movlw Numero
subwf PORTA,W
btfss STATUS,Z
goto NoEsCero
goto EsCero
EsCero
movlw b'11111111'
movwf PORTB
goto Inicio
NoEsCero
btfss STATUS,C
goto NoEsUno
goto EsUno
EsUno
movlw b'01010101'
movwf PORTB
goto Inicio
NoEsUno
movlw b'11110000'
movwf PORTB
goto Inicio
END
BCD
Ejercicio 13
Un número binario de 8 bits es convertido a BCD. El resultado se guarda en tres posiciones de memorias 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 conectados al puerto de salida se visualizarán las decenas y las unidades.
El máximo número a convertir será el 255 que es el máximo valor que puede adquirir el número binario de entrada de 8 bits.
El procedimiento utilizado es mediante restas de 10 tal como se explica en el siguiente ejemplo que trata de la conversión del número 124 a BCD:
(Centenas) (Decenas) (Unidades) ¿(Unidades)<10? ¿(Decenas)=10?
---------- --------- ---------- -------------- -------------------------
0 0 124 NO, resta 10 Incrementa (Decenas).
0 1 114 NO, resta 10 NO. Incrementa (Decenas).
0 2 104 NO, resta 10 NO. Incrementa (Decenas).
0 3 94 NO, resta 10 NO. Incrementa (Decenas).
0 4 84 NO, resta 10 NO. Incrementa (Decenas).
0 5 74 NO, resta 10 NO. Incrementa (Decenas).
0 6 64 NO, resta 10 NO. Incrementa (Decenas).
0 7 54 NO, resta 10 NO. Incrementa (Decenas).
0 8 44 NO, resta 10 NO. Incrementa (Decenas).
0 9 34 NO, resta 10 NO. Incrementa (Decenas).
1 0 24 NO, resta 10 Sí. (Decenas)=0, y además
incrementa (Centenas)
1 1 14 NO, resta 10 NO. Incrementa (Decenas)
1 2 4 SÍ, se acabó. El número a convertir será la constante "Numero".
;Actividad 5 Ejercicio 13
;===============================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
cblock 0x0c
Numero
Centenas
Decenas
Unidades
endc
;===============================================================================
ORG 0x000
bank1
movlw 0xFF
movwf TRISA
clrf TRISB
bank0
inicio
movlw .73 ;Numero elegido entre 0 - 255
movwf Numero
clrf Centenas
clrf Decenas
clrf Unidades
again
movf Numero,w
movwf Unidades
movlw .10
subwf Numero,f
movf Numero,w
btfss STATUS,0
goto carry0
incf Decenas,f
movlw .10
subwf Decenas,w
btfss STATUS,2
goto again
clrf Decenas
incf Centenas,f
goto again
carry0
rlf Decenas,f
rlf Decenas,f
rlf Decenas,f
rlf Decenas,w
addwf Unidades,w
movwf PORTB
goto inicio
END
;===============================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
cblock 0x0c
Numero
Centenas
Decenas
Unidades
endc
;===============================================================================
ORG 0x000
bank1
movlw 0xFF
movwf TRISA
clrf TRISB
bank0
inicio
movlw .73 ;Numero elegido entre 0 - 255
movwf Numero
clrf Centenas
clrf Decenas
clrf Unidades
again
movf Numero,w
movwf Unidades
movlw .10
subwf Numero,f
movf Numero,w
btfss STATUS,0
goto carry0
incf Decenas,f
movlw .10
subwf Decenas,w
btfss STATUS,2
goto again
clrf Decenas
incf Centenas,f
goto again
carry0
rlf Decenas,f
rlf Decenas,f
rlf Decenas,f
rlf Decenas,w
addwf Unidades,w
movwf PORTB
goto inicio
END
Salto Indexado
Ejercicio 14
Controla el nivel de un depósito de líquido. Utiliza (entre paréntesis las líneas del microcontrolador a la que se han conectado):
- 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: Vacio (RB0), Llenandose (RB1), Lleno (RB2), Rebose (RB3), Alarma (RB4).
- Cuando ninguna de las sondas está mojada se entiende que el depósito está vacío y se accionarán las dos bombas. El indicador "Vacio" se iluminará.
- Cuando el nivel del líquido toque la sonda 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 "SLL", para la bomba B2, quedando B1 activada en modo mantenimiento. El indicador "Lleno" se ilumina. - 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.
Según el enunciado del problema, teniendo en cuenta las conexiones citadas y poniendo la salida no utilizada (RB7) siempre a cero, la tabla de verdad resultante es:
RA2.. RA0 | RB7 ... ... RB0
----------|------------------------------------------------------------------
0 0 0 | 0 1 1 0 0 0 0 1 (Configuración 0. Estado "Vacio").
0 0 1 | 0 1 1 0 0 0 1 0 (Configuración 1.Estado "Llenandose").
0 1 0 | 0 0 0 1 0 0 0 0 (Configuración 2. Estado "Alarma").
0 1 1 | 0 0 1 0 0 1 0 0 (Configuración 3. Estado "Lleno").
1 0 0 | 0 0 0 1 0 0 0 0 (Configuración 4. Estado "Alarma").
1 0 1 | 0 0 0 1 0 0 0 0 (Configuración 5. Estado "Alarma").
1 1 0 | 0 0 0 1 0 0 0 0 (Configuración 6. Estado "Alarma").
1 1 1 | 0 0 0 0 1 0 0 0 (Configuración 7. Estado "Rebose").
;===============================================================================
;Actividad 5 Ejercicio 14
;===============================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
;===============================================================================
ORG 0x000
bank1
movlw 0x1F
movwf TRISA
clrf TRISB
bank0
inicio
movf PORTA,w
andlw b'00000111'
addwf PCL,F
goto vacio
goto llenandose
goto alarma
goto lleno
goto alarma
goto alarma
goto alarma
goto rebose
vacio
movlw b'01100001' ;Estado "Vacio"
movwf PORTB
goto inicio
llenandose
movlw b'01100010' ;Estado "Llenandose"
movwf PORTB
goto inicio
alarma
movlw b'00010000' ;Estado "Alarma"
movwf PORTB
goto inicio
lleno
movlw b'00100100' ;Estado "Lleno"
movwf PORTB
goto inicio
rebose
movlw b'00001000' ;Estado "Rebose"
movwf PORTB
goto inicio
END
;Actividad 5 Ejercicio 14
;===============================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
;===============================================================================
ORG 0x000
bank1
movlw 0x1F
movwf TRISA
clrf TRISB
bank0
inicio
movf PORTA,w
andlw b'00000111'
addwf PCL,F
goto vacio
goto llenandose
goto alarma
goto lleno
goto alarma
goto alarma
goto alarma
goto rebose
vacio
movlw b'01100001' ;Estado "Vacio"
movwf PORTB
goto inicio
llenandose
movlw b'01100010' ;Estado "Llenandose"
movwf PORTB
goto inicio
alarma
movlw b'00010000' ;Estado "Alarma"
movwf PORTB
goto inicio
lleno
movlw b'00100100' ;Estado "Lleno"
movwf PORTB
goto inicio
rebose
movlw b'00001000' ;Estado "Rebose"
movwf PORTB
goto inicio
END
Tablas
Ejercicio 15
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.
;===============================================================================
;Actividad 5 Ejercicio 15
;===============================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
;===============================================================================
ORG 0x000
bank1
movlw 0x1F
movwf TRISA
clrf TRISB
bank0
clrf PORTB
inicio
movf PORTA,w
sublw .25
btfss STATUS,C
goto $-4
movf PORTA,w
call tabla
movwf PORTB
goto inicio
tabla
addwf PCL,f
retlw 0x77
retlw 0x7c
retlw 0x39
retlw 0x5e
retlw 0x79
retlw 0x71
retlw 0x6f
retlw 0x76
retlw 0x19
retlw 0x1e
retlw 0x7a
retlw 0x38
retlw 0x37
retlw 0x54
retlw 0x3f
retlw 0x73
retlw 0x67
retlw 0x50
retlw 0x60
retlw 0x78
retlw 0x1c
retlw 0x3e
retlw 0x1d
retlw 0x70
retlw 0x6e
retlw 0x49
END
;Actividad 5 Ejercicio 15
;===============================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
;===============================================================================
ORG 0x000
bank1
movlw 0x1F
movwf TRISA
clrf TRISB
bank0
clrf PORTB
inicio
movf PORTA,w
sublw .25
btfss STATUS,C
goto $-4
movf PORTA,w
call tabla
movwf PORTB
goto inicio
tabla
addwf PCL,f
retlw 0x77
retlw 0x7c
retlw 0x39
retlw 0x5e
retlw 0x79
retlw 0x71
retlw 0x6f
retlw 0x76
retlw 0x19
retlw 0x1e
retlw 0x7a
retlw 0x38
retlw 0x37
retlw 0x54
retlw 0x3f
retlw 0x73
retlw 0x67
retlw 0x50
retlw 0x60
retlw 0x78
retlw 0x1c
retlw 0x3e
retlw 0x1d
retlw 0x70
retlw 0x6e
retlw 0x49
END
Retardos
Ejercicio 16
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.
;Actividad 5 Ejercicio 16
;===============================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
cblock 0x0c
contador
multiplicador
endc
;===============================================================================
ORG 0x000
bank1
movlw 0x1F
movwf TRISA
clrf TRISB
bank0
movlw b'01010101'
movwf PORTB
loop
call delay500ms
comf PORTB
call delay500ms
comf PORTB
goto loop
;===============================================================================
delay500ms
movlw b'11000101'
movwf OPTION_REG
clrf multiplicador
iniTMR0
movlw .61 ;499200 ciclos = (256-61).4.64.10
movwf TMR0 ;TMR0.instr.pre.multi
incTMR0
incf TMR0,f
btfss INTCON,T0IF
goto incTMR0
bcf INTCON,T0IF
incf multiplicador,f
movf multiplicador,w
sublw .10
btfss STATUS,2
goto iniTMR0
return
END
;===============================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
cblock 0x0c
contador
multiplicador
endc
;===============================================================================
ORG 0x000
bank1
movlw 0x1F
movwf TRISA
clrf TRISB
bank0
movlw b'01010101'
movwf PORTB
loop
call delay500ms
comf PORTB
call delay500ms
comf PORTB
goto loop
;===============================================================================
delay500ms
movlw b'11000101'
movwf OPTION_REG
clrf multiplicador
iniTMR0
movlw .61 ;499200 ciclos = (256-61).4.64.10
movwf TMR0 ;TMR0.instr.pre.multi
incTMR0
incf TMR0,f
btfss INTCON,T0IF
goto incTMR0
bcf INTCON,T0IF
incf multiplicador,f
movf multiplicador,w
sublw .10
btfss STATUS,2
goto iniTMR0
return
END
Ejercicio 17
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.
===========================================================================
;Actividad 5 Ejercicio 17
;===============================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
cblock 0x0c
cont1
cont2
endc
;===============================================================================
ORG 0x000
bank1
movlw 0x1F
movwf TRISA
clrf TRISB
bank0
inicio
clrf PORTB
call delay300ms
bsf PORTB,0
repeat
call delay300ms
;Actividad 5 Ejercicio 17
;===============================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
cblock 0x0c
cont1
cont2
endc
;===============================================================================
ORG 0x000
bank1
movlw 0x1F
movwf TRISA
clrf TRISB
bank0
inicio
clrf PORTB
call delay300ms
bsf PORTB,0
repeat
call delay300ms
Ejercicio 18
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)
;===============================================================================
;Actividad 5 Ejercicio 18
;===============================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
cblock 0x0c
limite
multiplicador
endc
;===============================================================================
ORG 0x000
bank1
movlw 0x1F
movwf TRISA
clrf TRISB
bank0
clrf PORTB
movf PORTA,w
andlw b'00000111'
call tabla
movwf limite
inicio
call delay500ms
bsf PORTB,0
repeat
call delay500ms
rlf PORTB,f
movf PORTB,w
subwf limite,w
btfss STATUS,2
goto repeat
clrf PORTB
;================================================================================
tabla
addwf PCL,f
retlw b'00000001'
retlw b'00000010'
retlw b'00000100'
retlw b'00001000'
retlw b'00010000'
retlw b'00100000'
retlw b'01000000'
retlw b'10000000'
;================================================================================
delay500ms
movlw b'11000101'
movwf OPTION_REG
clrf multiplicador
iniTMR0
movlw .61 ;499200 ciclos = (256-61).4.64.10
movwf TMR0 ; TMR0.instr.pre.multi
incTMR0
incf TMR0,f
btfss INTCON,T0IF
goto incTMR0
bcf INTCON,T0IF
incf multiplicador,f
movf multiplicador,w
sublw .10
btfss STATUS,2
goto iniTMR0
return
;Actividad 5 Ejercicio 18
;===============================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
cblock 0x0c
limite
multiplicador
endc
;===============================================================================
ORG 0x000
bank1
movlw 0x1F
movwf TRISA
clrf TRISB
bank0
clrf PORTB
movf PORTA,w
andlw b'00000111'
call tabla
movwf limite
inicio
call delay500ms
bsf PORTB,0
repeat
call delay500ms
rlf PORTB,f
movf PORTB,w
subwf limite,w
btfss STATUS,2
goto repeat
clrf PORTB
;================================================================================
tabla
addwf PCL,f
retlw b'00000001'
retlw b'00000010'
retlw b'00000100'
retlw b'00001000'
retlw b'00010000'
retlw b'00100000'
retlw b'01000000'
retlw b'10000000'
;================================================================================
delay500ms
movlw b'11000101'
movwf OPTION_REG
clrf multiplicador
iniTMR0
movlw .61 ;499200 ciclos = (256-61).4.64.10
movwf TMR0 ; TMR0.instr.pre.multi
incTMR0
incf TMR0,f
btfss INTCON,T0IF
goto incTMR0
bcf INTCON,T0IF
incf multiplicador,f
movf multiplicador,w
sublw .10
btfss STATUS,2
goto iniTMR0
return
Ejercicio 19
Por la barra de diodos LEDs conectada al puerto de salida se visualizará un juegos de luces que al lector le resulte divertido. Hay que utilizar una tabla de datos.
;Actividad 5 Ejercicio 19
;=========================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
cblock 0x0c
cont1
cont2
counter
endc
;===============================================================================
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
inicio
clrf PORTB
call delay100ms
bsf PORTB,0
call delay100ms
bsf PORTB,1
call delay100ms
bsf PORTB,2
call delay100ms
bsf PORTB,3
call delay100ms
bsf PORTB,4
call delay100ms
bsf PORTB,5
call delay100ms
bsf PORTB,6
call delay100ms
bsf PORTB,7
call delay100ms
bcf PORTB,7
call delay100ms
bcf PORTB,6
call delay100ms
bcf PORTB,5
call delay100ms
bcf PORTB,4
call delay100ms
bcf PORTB,3
call delay100ms
bcf PORTB,2
call delay100ms
bcf PORTB,1
call delay100ms
incf counter
movf counter,w
sublw .3
btfss STATUS,2
goto inicio
clrf counter
clrf PORTB
call delay100ms
call delay100ms
movlw b'01010101'
movwf PORTB
aca1
call delay100ms
call delay100ms
comf PORTB
incf counter
movf counter,w
sublw .9
btfss STATUS,2
goto aca1
clrf counter
clrf PORTB
call delay100ms
movlw b'00001111'
movwf PORTB
aca2
comf PORTB
call delay100ms
call delay100ms
incf counter
movf counter,w
sublw .8
btfss STATUS,2
goto aca2
clrf PORTB
;===================================================================================
delay100ms
movlw .31
movwf cont1
movlw .79
movwf cont2 ;99998 ciclos
delayloop
decfsz cont1, f
goto $+2
decfsz cont2, f
goto delayloop
return
END
;=========================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
cblock 0x0c
cont1
cont2
counter
endc
;===============================================================================
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
inicio
clrf PORTB
call delay100ms
bsf PORTB,0
call delay100ms
bsf PORTB,1
call delay100ms
bsf PORTB,2
call delay100ms
bsf PORTB,3
call delay100ms
bsf PORTB,4
call delay100ms
bsf PORTB,5
call delay100ms
bsf PORTB,6
call delay100ms
bsf PORTB,7
call delay100ms
bcf PORTB,7
call delay100ms
bcf PORTB,6
call delay100ms
bcf PORTB,5
call delay100ms
bcf PORTB,4
call delay100ms
bcf PORTB,3
call delay100ms
bcf PORTB,2
call delay100ms
bcf PORTB,1
call delay100ms
incf counter
movf counter,w
sublw .3
btfss STATUS,2
goto inicio
clrf counter
clrf PORTB
call delay100ms
call delay100ms
movlw b'01010101'
movwf PORTB
aca1
call delay100ms
call delay100ms
comf PORTB
incf counter
movf counter,w
sublw .9
btfss STATUS,2
goto aca1
clrf counter
clrf PORTB
call delay100ms
movlw b'00001111'
movwf PORTB
aca2
comf PORTB
call delay100ms
call delay100ms
incf counter
movf counter,w
sublw .8
btfss STATUS,2
goto aca2
clrf PORTB
;===================================================================================
delay100ms
movlw .31
movwf cont1
movlw .79
movwf cont2 ;99998 ciclos
delayloop
decfsz cont1, f
goto $+2
decfsz cont2, f
goto delayloop
return
END
Ejercicio 20
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.
;Actividad 5 Ejercicio 20
;====================================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
cblock 0x0c
contador
multiplicador
endc
;===============================================================================
ORG 0x000
bank1
movlw 0x1F
movwf TRISA
clrf TRISB
bank0
clrf PORTB
btfss PORTA,0
goto descendente
goto ascendente
ascendente
clrf contador
movf contador,w
call tabla
movwf PORTB
loop
incf contador,f
movf contador,w
sublw .10
btfsc STATUS,2
goto ascendente
movf contador,w
call tabla
movwf PORTB
call delay500ms
btfss PORTA,0
goto descendente
goto loop
descendente
clrf contador
movf contador,w
call tabla
movwf PORTB
movlw .9
movwf contador
call tabla
movwf PORTB
loop1
decf contador,f
movf contador,w
btfsc STATUS,2
goto descendente
call tabla
movwf PORTB
call delay500ms
btfsc PORTA,0
goto ascendente
goto loop1
;===================================================================================
tabla
addwf PCL,F
retlw b'00111111' ;cero
retlw b'00000110' ;uno
retlw b'01011011' ;dos
retlw b'01001111' ;tres
retlw b'01100110' ;cuatro
retlw b'01101101' ;cinco
retlw b'01111100' ;seis
retlw b'00000111' ;siete
retlw b'01111111' ;ocho
retlw b'01100111' ;nueve
;===================================================================================
delay500ms
movlw b'11000111'
movwf OPTION_REG
clrf multiplicador
movlw .61
movwf TMR0
incTMR0
incf TMR0,f
btfss INTCON,T0IF
goto incTMR0
bcf INTCON,T0IF
incf multiplicador,f
movf multiplicador,w
sublw .10
btfss STATUS,2
goto incTMR0
return
END
;====================================================================================
LIST p=PIC16F84A
INCLUDE <p16f84a.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
ERRORLEVEL -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf STATUS,RP0
cblock 0x0c
contador
multiplicador
endc
;===============================================================================
ORG 0x000
bank1
movlw 0x1F
movwf TRISA
clrf TRISB
bank0
clrf PORTB
btfss PORTA,0
goto descendente
goto ascendente
ascendente
clrf contador
movf contador,w
call tabla
movwf PORTB
loop
incf contador,f
movf contador,w
sublw .10
btfsc STATUS,2
goto ascendente
movf contador,w
call tabla
movwf PORTB
call delay500ms
btfss PORTA,0
goto descendente
goto loop
descendente
clrf contador
movf contador,w
call tabla
movwf PORTB
movlw .9
movwf contador
call tabla
movwf PORTB
loop1
decf contador,f
movf contador,w
btfsc STATUS,2
goto descendente
call tabla
movwf PORTB
call delay500ms
btfsc PORTA,0
goto ascendente
goto loop1
;===================================================================================
tabla
addwf PCL,F
retlw b'00111111' ;cero
retlw b'00000110' ;uno
retlw b'01011011' ;dos
retlw b'01001111' ;tres
retlw b'01100110' ;cuatro
retlw b'01101101' ;cinco
retlw b'01111100' ;seis
retlw b'00000111' ;siete
retlw b'01111111' ;ocho
retlw b'01100111' ;nueve
;===================================================================================
delay500ms
movlw b'11000111'
movwf OPTION_REG
clrf multiplicador
movlw .61
movwf TMR0
incTMR0
incf TMR0,f
btfss INTCON,T0IF
goto incTMR0
bcf INTCON,T0IF
incf multiplicador,f
movf multiplicador,w
sublw .10
btfss STATUS,2
goto incTMR0
return
END
Además, para probar el correcto funcionamiento de los programas realizados, utilizamos un simulador denominado "Isis", con el siguiente circuito:
En el PORTA, tenemos una serie de "pulsadores" donde podemos implicar un 1 o un 0 lógicos al micro, y en el PORTB, están los indicadores de estado, para poder saber si poseemos un 1 o un 0 lógico en cada bit.
No hay comentarios:
Publicar un comentario