Anda di halaman 1dari 42

ASM MICROPROCESADORES I

PRACTICA 1

;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;
;Leer el estado de los 5 interruptores E0-E4 conectados a RA0-RA4 y reflejar el nivel lgico de
;los mismos sobre los leds S0-S4 conectados en RB0-RB4
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Incluye el fichero P16F84.INC que contiene la
definicin con los nombres
;de los registros internos

Inicio

Loop

org
goto

0x00
Inicio

;Vector de Reset

org

0x05

;Salva el vector de interrupcin

clrf
PORTB
;Borra los latch de salida
bsf
STATUS,RP0 ;Selecciona banco 1 de la memoria de datos
clrf
TRISB
;Puerta B se configura como salida
movlw b'00011111'
movwf TRISA
;Puerta A se configura como entrada
bcf
STATUS,RP0 ;Selecciona banco 0 de la memoria de datos
movf PORTA,W
movwf PORTB
goto Loop

;Leer las entradas RA0-RA4


;Reflejar en las salidas
;Bucle sin fin

end

;Fin del programa fuente

;
PRACTICA 2
;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;Una lmpara conectada en RB0 se controla mediante dos interruptores conectados en RA0 y RA1.
;Cuando cualquiera de los interruptores cambie de estado, la lmpara tambin lo har.

definicin
Temp

List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Incluye el fichero P16F84.INC que contiene la
;con los nombres de los registros internos
;Variable temporal que se almacena en la posicin 0x0c

equ

0x0c

org
goto

0x00
Inicio

;Vector de Reset

org

0x05

;Salva el vector de interrupcin


SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
Inicio

clrf
PORTB
;Borra los latch de salida
bsf
STATUS,RP0 ;Selecciona banco 1 de la memoria de datos
clrf
TRISB
;Puerta B se configura como salida
movlw b'00000011'
movwf TRISA
;RA0 y RA1 se configuran como entrada
bcf
STATUS,RP0 ;Selecciona banco 0 de la memoria de datos
clrf

Loop
RA1

Temp

;Pone a 0 el registo o variable temporal

movf PORTA,W
;Leer el estado de la puerta A
andlw b'00000011' ;Filtra la informacin leda y nos quedamos con el estado de RA0 y
movwf Temp
btfsc STATUS,Z
goto Apagar

;Almacena temporalmente
;RA0=0 y RA1=0 ??
;Si, la lmpara se apaga

movlw b'00000001'
subwf Temp,W
btfsc STATUS,Z ;RA0=1 y RA1=0 ??
goto Encender
;Si, la lmpara se enciende
movlw b'00000010'
subwf Temp,W
btfsc STATUS,Z ;RA0=0 y RA1=1 ??
goto Encender
;Si, la lmpara se enciende
Apagar

Encender

bcf

PORTB,0

goto

Loop

bsf

PORTB,0

goto

Loop

end

;No, la lmpara se apaga

;La lmpara se enciende

;Fin del programa fuente

;
PRACTICA 3
;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;Programa combinacional
;
;Segn el estado de los interruptores RA0 y RA1, activar los leds
;puerta B, conforme a la siguiente tabla de la verdad:
;
;
RA1 RA0
RB7 RB6 RB5 RB4 RB3 RB2
;
--------;
0
0
1
0
1
0
1
0
;
0
1
0
1
0
1
0
1
;
1
0
0
0
0
0
1
1

RB0-RB7 conectados a la
RB1
-1
0
1

SU AMIGABLE BESINO: ANGHEL PMQ

RB0
-0
1
1

Temp

Inicio

Loop:

ASM MICROPROCESADORES I
1
1
0
0
0

List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Incluir la definicin de los registros internos
equ 0x0c
;Variable temporal
org
goto

0x00
Inicio

;Vector de Reset

org

0x05

;Salva el vector de interrupcin

clrf
PORTB
;Borra los latch de salida
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISB
;Puerta B se configura como salida
movlw b'00001001'
movwf OPTION_REG
;Preescaler de 1:2 asociado al WDT
movlw b'00000011'
movwf TRISA
;RA0 y RA1 se configuran como entrada
bcf
STATUS,RP0 ;Selecciona banco 0
clrwdt
;Refrescar el WDT
movf PORTA,W
;Carga el valor de la PUERTA A
andlw b'00000011' ;Filtra el estado de RA0 y RA1
movwf Temp
;Almacena temporalmente
btfsc STATUS,Z ;Estn a 00 ?
goto Secuencia_00
;Si
movlw b'00000001'
subwf Temp,W
btfsc STATUS,Z ;Estn a 01 ?
goto Secuencia_01
;Si
movlw b'00000010'
subwf Temp,W
btfsc STATUS,Z ;Estn a 10 ?
goto Secuencia_10
;Si

Secuencia_11
movlw b'11110000'
movwf PORTB
;Salida de la secuencia 11
goto Loop
Secuencia_00
movlw b'10101010'
movwf PORTB
;Salida de la secuencia 00
goto Loop
Secuencia_01
movlw b'01010101'
movwf PORTB
;Salida de la secuencia 01
goto Loop
Secuencia_10
movlw b'00001111'
movwf PORTB
;Salida de la secuencia 10
goto Loop
end

;Fin del programa fuente


SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;
;
PRACTICA 4
;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;Programa secuencial
;
;Mediante dos pulsadores conectados en RA0 y RA1 se controla la salida RB0 que gobierna un
;zumbador de alarma. Una transicin a "1" en RA0 provoca su activacin, una transicin en RA0
;su desactivacin.
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Incluir la definicin de los registros internos

Inicio

Loop:

org
goto

0x00
Inicio

;Vector de Reset

org

0x05

;Salva el vector de interrupcin

clrf
PORTB
;Borra los latch de salida
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISB
;Puerta B se configura como salida
movlw b'00001001'
movwf OPTION_REG
;Preescaler de 1:2 asociado al WDT
movlw b'00000011'
movwf TRISA
;RA0 y RA1 se configuran como entrada
bcf
STATUS,RP0 ;Selecciona banco 0
clrwdt
;Refrescar el WDT
btfsc PORTA,0
;RA0=1 ??
goto Alarma_On ;Si
btfss PORTA,1
;RA1=1 ??
goto Loop
;No

Alarma_Off bcf
goto

PORTB,0
Loop

Alarma_On btfsc
goto
bsf
goto

PORTA,1
;RA1 tambin en ON ??
Alarma_Off ;Si, desconectar alarma
PORTB,0
;No, activar alarma
Loop

end

;Si, conecta la alarma

;Fin del programa fuente

;
;
PRACTICA 5
;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;Empleando el TMR0; juego de luces
;
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;El programa activa secuencialmente, de una en una, las ocho salidas de la puerta B (RB0-RB7),
;provocacndo un efecto de desplazamiemto de dcha. a izda. Cada salida se mantiene activada
;durante un intervalo de 0.1" (100mS). Dicho intervalo se controla mediante el TMR0.
;
;El TMR0 se carga con el valor 195 y, trabajando a 4MHz, evoluciona cada 1 uS. Como a su vez
;se le asocia un preescaler de 256, el desbordamiento se prodicir al de 49.9 ms
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Incluir la definicin de los registros internos
Temp
Delay

Inicio

equ
equ

0x0c
0x0d

;Variable temporal
;Variable para temporizacin

org
goto

0x00
Inicio

;Vector de Reset

org

0x05

;Salva el vector de interrupcin

clrf
PORTB
;Borra los latch de salida
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISB
;Puerta B se configura como salida
movlw b'00000111'
movwf OPTION_REG
;Preescaler de 1:256 asociado al TMR0
bcf
STATUS,RP0 ;Selecciona banco 0
movlw b'00000001'
movwf Temp
;1er. valor a sacar
bcf
STATUS,C

Loop
Loop_0
Loop_1

movwf PORTB
;Salida
del valor correspondiente
movlw .2
movwf Delay
;Una temporizacin de 50 mS se repetir 2 veces
movlw ~.195
movwf TMR0
;Carga el TMR0 con el complemento del valor 195
bcf
INTCON,T0IF
;Restaura el flag de desbordamiento del TMR0
clrwdt
;Refrescar el WDT
btfss INTCON,T0IF
;Se ha desbordado el TMR0 ??
goto Loop_1
;No, todava no han transcurrido los 50 mS
decfsz Delay,F
;Se ha repetido 2 veces la temporizacin de 50 mS (0.1")
goto Loop_0
;No
rlf
Temp,F
;Si, Desplaza a la izquierda para obtener el siguiente
movf Temp,W
;valor a sacar por la puerta B
goto Loop
end

;Fin del programa fuente

;
;
PRACTICA 6
;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;Usando el preescaler, ms juego de luces
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;
;El programa activa secuencialmente, de una en una, las ocho salidas de la puerta B (RB0-RB7),
;provocacndo un efecto de desplazamiemto de dcha. a izda. Cada salida se mantiene activada
;durante un intervalo de tiempo variable en funcin de las entradas RA0-RA2, que seleccionan
;los 8 valores posibles del preescaler comprendidos entre 1:2 y 1:256.
;
;El TMR0 realiza una cuenta de 50 eventos que se repite 200 veces. La temporizacin mnima es
;de 20mS (preesacler 1:2) y la mxima 2.5" (preescaler 1:256)
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Incluir la definicin de los registros internos
Temp
Delay

Inicio

equ
equ

0x0c
0x0d

;Variable temporal
;Variable para temporizacin

org
goto

0x00
Inicio

;Vector de Reset

org

0x05

;Salva el vector de interrupcin

clrf
PORTB
;Borra los latch de salida
bsf
STATUS,RP0 ;Selecciona banco 1
movlw b'00000111'
movwf TRISA
;RA0-RA2 actan como entradas
clrf
TRISB
;Puerta B se configura como salida
bcf
STATUS,RP0 ;Selecciona banco 0
movlw b'00000001'
movwf Temp
;1er. valor a sacar
bcf
STATUS,C

Loop

Loop_0
Loop_1

movf PORTA,W
;Lee las entradas RA0-RA2
andlw b'00000111'
bsf
STATUS,RP0 ;Selecciona banco 1
movwf OPTION_REG
;Ajusta valor del preescaler segn las entradas
bcf
STATUS,RP0 ;Selecciona el banco 0
movf Temp,W
movwf PORTB
;Salida
del valor correspondiente
movlw .200
movwf Delay
;Una temporizacin de 50 eventos se repetir 200 veces
movlw ~.50
movwf TMR0
;Carga el TMR0 con el complemento del valor 50
bcf
INTCON,T0IF
;Restaura el flag de desbordamiento del TMR0
clrwdt
;Refrescar el WDT
btfss INTCON,T0IF
;Se ha desbordado el TMR0 ??
goto Loop_1
;No, todava no han transcurrido los 50 mS
decfsz Delay,F
;Se ha repetido 200 veces la temporizacin de 50 eventos ?
goto Loop_0
;No
rlf
Temp,F
;Si, Desplaza a la izquierda para obtener el siguiente
goto Loop
end

;Fin del programa fuente


SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
PRACTICA 7

;
;
;
;
;

Autor: BARRABAZ
(c) Microsystems Engineering (Bilbao)

;El modo "sleep" y el "wake-up" (despertar) mediante el watch-dog Timer (WDT)


;
;Este ejemplo pretende mostrar el empleo de la instruccin SLEEP para poner al PIC en el
;modo standby de bajo consumo. El despertar del mismo se producir cada vez que el WDT rebase.
;En ese momento se producir un incremento del valor de la puerta B que actuar como contador
;binario y nuevamente se volver a la situacind de standby.
;
;El preescaler se asociar al WDT y estar comprendido entre 1 y 128, dependiendo del estado
;lgico de los interruptores RA0-RA2.
;
;El valor nominal del WDT es de 18mS. Es decir, con un preescaler de 1, el pic "despertar"
;cada 18mS, con un prrescaler de 128, lo har cada 2,3 segundos.
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Definiciones de registros internos
org
goto
org
Inicio

Loop

0x00
Inicio
0x05

;Vector de Reset
;Salva vector de interrupcin

clrf
PORTB
;Borra los latch de salida
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISB
;Puerta B se configura como salida
movlw b'00011111'
movwf TRISA
;RA0-RA4 entradas
movlw b'00001000'
movwf OPTION_REG
;Preescaler de 1 para el WDT
bcf
STATUS,RP0 ;Selecciona banco 0
sleep

;Modo Standby

incf PORTB,F
;Incrementa el contador binario sobre la puerta B
movf PORTA,W
andlw b'00000111' ;Lee el estado de los interruptores RA0-RA2
iorlw b'00001000'
bsf
STATUS,RP0 ;Selecciona el banco 1
movwf OPTION_REG
;Ajusta valor del preescaler
bcf
STATUS,RP0 ;Selecciona el banco 1
goto Loop
;Volver al modo Standby
end

;Fin del programa fuente

SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;
PRACTICA 8
;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;El modo TMR0 como contador de eventos externos
;
;El ejemplo pretende mostrar el funcionamiento del TMR0 en el modo contador. Mediante las
;entradas RA0-RA3 se introduce el nmero de pulsos a contar. Por RA4 se aplican dichos pulsos
;Cuando se alcance el valor deseado se disparan dos salidas durante un tiempo. La salida RB1 se
;utiliza para desconectar la fuente de entrada de pulsos y RB0 para activar cualquier otro
;dispositivo (p.e. un rel, en led, etc.)
;El WDT se emplear a modo de temporizador para determinar el tiempo de disparo de ambas
;salidas
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Definiciones de registros internos
org
goto
org
Inicio

0x00
Inicio
0x05

;Vector de Reset
;Salva vector de interrupcin

clrf
PORTB
;Borra los latch de salida
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISB
;Puerta B se configura como salida
movlw b'00011111'
movwf TRISA
;RA0-RA4 entradas
movlw b'00111111'
movwf OPTION_REG
;Preescaler de 256 para el WDT. El TMR0 evoluciona a
;cada flanco descendente aplicado por RA4
bcf
STATUS,RP0 ;Selecciona banco 0

Loop

movf PORTA,W
andlw b'00001111' ;Lee las entradas RA0-RA3
xorlw b'11111111' ;Complementa el valor ledo (el TMR0 es ascendente)
addlw .1
movwf TMR0
;Carga el TMR0 con el valor ledo
bsf
PORTB,1
;Activa la entrada de pulsos a contar
bcf
INTCON,T0IF
;Repone el flag del TMR0

Espera

clrwdt
btfss INTCON,T0IF
goto Espera
bcf
PORTB,1
bsf
PORTB,0
clrwdt
sleep
bcf
goto
end

PORTB,0
Loop

;Refresca el WDT
;Ha finalizado la cuenta ??
;No

;Desconecta la entrada de pulsos a contar


;Activa la salida a rel, led, etc.
;El WDT se refresca y comienza la temporizacin
;El modo standby se mantiene hasta que el WDT desborde
;transcurridos aprox. 2" (18mS*256 de preescaler)
;Desactiva la salida a rel, led, etc.
;Fin del programa fuente
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;
PRACTICA 9
;
;
Autor:BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;
;La interrupcin del TMR0.
;
;Se trata de comprobar la interrupcin provocada por el TMR0. El programa
;lee constantemente el estado de los interruptores conectados a RA0 y RA1 para reflejarlo en
;los leds conectados a RB0 y RB1 respectivamente. Al mismo tiempo el TMR0
;genera una interrupcin cada 0.05 seg. (50 mS) que se repetir 5 veces con objeto
;de hacer intermitencia de 250 mS sobre el led conectado a RB7.
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Definiciones de registros internos
Temp
Temp_2

equ

0x0c
;Variable para la temporizacin
equ 0x0d
;Registro temporal

org
goto

0x00
Inicio

;Vector de Reset

org

0x04

;Vector de interrupcin

;Programa de tratamiento de la interrupcin


Tratamiento

btfss INTCON,T0IF
;Ha sido el TMR0 ??
goto Fin_Tratamiento
;No
bcf
INTCON,T0IF
;Si, repone flag del TMR0
decfsz
Temp,F
;Se ha repetido la interrupcin 5 veces ??
goto Seguir
;No
Con_si_0
movlw
5
movwf
Temp
;Repone el contador nuevamente con 5
movlw b'10000000'
xorwf PORTB,F
;RB7 cambia de estado
Seguir
movlw
~.195
movwf
TMR0
;Repone el TMR0 con el complemento de 195
Fin_Tratamiento
retfie
;Retorno de interrupcin
Inicio

clrf
PORTB
;Borra los latch de salida
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISB
;Puerta B se configura como salida
movlw b'00011111'
movwf TRISA
;Puerta A se configura como entrada
movlw b'00000111'
movwf OPTION_REG
;Preescaler de 256 asignado al TMR0
bcf
STATUS,RP0 ;Selecciona banco 0

;El TMR0 se incrementa cada 1 uS. Si se emplea un preescaler de 256, deber sufrir 195
;incrementos para provocar una interrupcin cada 50000 uS (50 mS). Si esta se repite 5
;veces, el tiempo total transcurrido es de 250000 uS (250 mS). Se debe usar el
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;complemento de 195
movlw ~.195
movwf TMR0
;Carga el TMR0 con el complemeto de 195
movlw 0x05
movwf Temp
;N de veces a repetir la interrupcin
movlw b'10100000'
movwf INTCON
;Activa la interrupcin del TMR0
Loop

clrwdt
;Refresca el WDT
movf PORTA,W
andlw b'00000011' ;Lee el estado de RA0 y RA1
movwf Temp_2
;Lo salva temporalmente
movf PORTB,W
andlw b'10000000'
iorwf Temp_2,W
movwf PORTB
;Salida por RB0 y RB1 respentando valor actual de RB7
goto Loop
end

;Fin del programa fuente

;
;
PRACTICA 10
;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;
;Otras interrupciones
;
;Los dispositivos PIC pueden provocar interrupcin por otras dos causas diferentes adems de
;por la del TMR0. Una de ellas es por la deteccin de una seal de un determinado flanco por
;la entrada RB0/INT. La otra es por el cambio de estado lgico producido en cualquiera de las
;lneas de entrada RB4-RB7.
;
;El ejemplo pretende mostrar la deteccin y tratamiento de cada una de estas nuevas fuentes de
;interrupcin. Cuando se produce la interrupcin RB0/INT se activa la salida RA0 durante 1".
;Cuando se produce la interrupcin por cambio de estado en RB4-RB7 se activa la salida RA1
;durante 1".
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Definiciones de registros internos
Temp

equ

0x0c

;Variable para la temporizacin

org
goto

0x00
Inicio

;Vector de Reset

org

0x04

;Vector de interrupcin

;Programa de tratamiento de la interrupcin


SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
Tratamiento

btfsc INTCON,INTF
;Ha sido el RB0/INT ??
goto Tratar_INTF ;Si
btfss INTCON,RBIF
;No, ha sido cambio en RB4-RB7 ?
goto Fin_Tratamiento
;No, falsa interrupcin

Cambio_RB4_RB7 bsf
goto Fin
Tratar_INTF bsf

PORTA,1

PORTA,0

;Activa salida RB1


;Activa salida RB0

;Se hace un delay de 1 segundo antes de reponer los correspondientes flags de interrupcin.
;De esta forma se evitan posibles rebotes que puediera haber en las entradas.
Fin

movlw
.20
;Comienza una temporizacin de 1"
movwf Temp
;Inicia una variable temporal
Seguir
bcf
INTCON,T0IF
;Repone el flag del TMR0
movlw
~.195
movwf
TMR0
;Repone el TMR0 con el complemento de 195
Delay_50mS clrwdt
;Comienza un bucle de temporizacin de 50mS
btfss INTCON,T0IF
;Fin de los 50 mS ??
goto Delay_50mS ;Todava no
nop
decfsz Temp,F
;Se ha repetido 20 veces los 50mS ??
goto Seguir
;No
Fin_Tratamiento
clrf
PORTA
;Si, ha pasado 1". Desconecta las salidas
movf PORTB,W
;Lee estado actual de las entradas RA4-RA7 para reponer
bcf
INTCON,RBIF
;el flag de interrupcin por cambio en RB4-RB7. Hay que
;hacerlo en este rden
bcf
INTCON,INTF
;Repone el flag de interrupcin por RBO/INT
retfie
;Retorno de interrupcin
Inicio

clrf
PORTA
;Borra los latch de salida
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISA
;Puerta A se configura como salidas
movlw b'11111111'
movwf TRISB
;Puerta B se configura como entrada
movlw b'01000111' ;Preescaler de 256 asignado al TMR0 y
movwf OPTION_REG
;RB0/INT sensible al flanco ascendente
bcf
STATUS,RP0 ;Selecciona banco 0
movf PORTB,W
movlw b'10011000'
movwf INTCON

Loop

;Lee el estado inicial de las entradas RB4-RB7


;Activa la interrupcines INTF y RBIF

sleep
goto Loop

;El dispositivo queda en standby

end

;Fin del programa fuente


SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;
PRACTICA 11
;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;Decodificador BCD a 7 segmentos
;
;Mediante los cuatro interruptores conectador a RA0-RA3 se aplica el cdigo BCD de los nmeros
;comprendidos entre 0 y 9. El programa obtiene el cdigo de 7 segmentos para representar dicho
;nmero sobre un display de nodo comn, en el que cada segmento particular se activa mediante
;nivel lgico "0"
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Incluir la definicin de los registros internos
Temp

equ

0x0c

;Variable temporal

org
goto

0x00
Inicio

;Vector de Reset

org

0x05

;Salva el vector de interrupcin

Tabla_7_seg addwf PCL,F


retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
Inicio

Loop:

b'11000000'
b'11111001'
b'10100100'
b'10110000'
b'10011001'
b'10010010'
b'10000010'
b'11111000'
b'10000000'
b'10011000'

;Desplaza al PC tantas posiciones como indique el valor


;del registro W
;Cdigo 7 seg. del dgito 0
;Cdigo del 1
;2
;3
;4
;5
;6
;7
;8
;9

clrf
PORTB
;Borra los latch de salida
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISB
;Puerta B se configura como salida
movlw b'00001001'
movwf OPTION_REG
;Preescaler de 1:2 asociado al WDT
movlw b'00001111'
movwf TRISA
;RA0-RA3 se configuran como entrada
bcf
STATUS,RP0 ;Selecciona banco 0
clrwdt
movf PORTA,W
andlw b'00001111'
movwf Temp
movlw 0x0a
subwf Temp,W
btfsc STATUS,Z
goto NULO
btfsc STATUS,C

;Refrescar el WDT
;Lee las entradas RA0-RA3
;Almacena valor ledo
;El valor es igual a 0x0A ??
;Si
;No, el valor es mayor a 0x0A ??

SU AMIGABLE BESINO: ANGHEL PMQ

goto

ASM MICROPROCESADORES I
;Si

NULO

movf Temp,W
call
Tabla_7_seg ;Convierte el valor a cdigo de 7 segmentos
movwf PORTB
;Lo deposita en la puerta de salida para visualizarlo
goto Loop
NULO

movlw b'11111111' ;El valor de entrada no estaba comprendido entre 0 y 9


movwf PORTB
;El display permanece apagado
goto Loop
end

;Fin del programa fuente

;
;
PRACTICA 12
;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;Contador UP/DOWN decimal de un dgito
;
;Sobre el display 7 segmentos conectado a la puerta B se visualizar el nmero de pulsos
;aplicados por la entrada RA0. RA1 determina si la cuenta es ascendente (a "1")
;o descendente
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Definiciones de registros internos
Contador

equ

0x0c

;Variable del contador

org
goto

0x00
Inicio

;Vector de Reset

org

0x05

;Salva el vector de interrupcin

;**********************************************************************************
;Tabla_7_seg: Esta rutina convierte el cdigo BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El cdigo 7 segmentos retorna tambin
;en el reg. W
Tabla_7_seg addwf PCL,F
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

b'11000000'
b'11111001'
b'10100100'
b'10110000'
b'10011001'
b'10010010'
b'10000010'
b'11111000'
b'10000000'
b'10011000'

;Desplaza al PC tantas posiciones como indique el valor


;del registro W
;Cdigo 7 seg. del dgito 0
;Cdigo del 1
;2
;3
;4
;5
;6
;7
;8
;9

SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
Inicio

clrf
PORTB
;Borra los latch de salida
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISB
;Puerta B se configura como salida
movlw b'00011111'
movwf TRISA
;Puerta A se configura como entrada
movlw b'00000110'
movwf OPTION_REG
;Preescaler de 128 para el TMR0
bcf
STATUS,RP0 ;Selecciona banco 0
clrf
Contador
;Puesta a 0 del contador

Loop

movf Contador,W
call
Tabla_7_seg ;Convierte BCD a 7 segmentos
movwf PORTB
;Visualiza el valor del contador

Wait_0

clrwdt
btfss PORTA,0
goto Wait_0
sleep

;Refrescar el WDT
;Subida de la seal RA0 ?
;No
;Modo standby en espara de 18mS. Elimina rebotes

Wait_1

clrwdt
btfsc PORTA,0
goto Wait_1
sleep

;Refrescar el WDT
;Bajada de RA0 (pulso) ??
;No
;Modo standby en espara de 18mS. Elimina rebotes

btfss PORTA,1
goto Down

;RA1 = 1 ??
;No, cuenta descendente

incf Contador,F
movlw .10
subwf Contador,W
btfss STATUS,Z
goto Loop
clrf
Contador
goto Loop

;Incrementa contador

decf Contador,F
movlw 0xff
subwf Contador,W
btfss STATUS,Z
goto Loop
movlw .9
movwf Contador
goto Loop

;Decrementa el contador

end

;Fin del programa fuente

Up

Down

;
;
;
;
;
;

;Es mayor de 9 ??
;No
;Si, puesta a 0 del contador

;Es menor de 0 ??
;No
;Si, puesta a 9 del contador

PRACTICA 13
Autor: BARRABAZ
(c) Microsystems Engineering (Bilbao)
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;
;Generacin de nmeros aleatorios. El dado electrnico
;
;Se trata de generar un nmero aleatorio entre 1 y 6. Cuando RA0 est a "1", sobre el
;dsiplay 7 segmentos conectado a la puerta B, se van visualizando de forma secuecial
;los nmeros del 1 al 6, con intervalos de 0.05". Al pasar RA0 a nivel "0", se visualiza
;el nmero aleatorio obtenido, durante un tiempo de 3". Luego el display se apaga y la
;secuencia se repite.
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Definiciones de registros internos
Numero
Delay_Cont equ
Temporal
equ
org
goto
org

equ 0x0c
;Nmero aleatorio
0x0d
;Contador de intervalos
0x0e
;Variable temporal
0x00
Inicio
0x05

;Vector de Reset
;Salva vector de interrupcin

;**********************************************************************************
;Tabla_7_seg: Esta rutina convierte el cdigo BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El cdigo 7 segmentos retorna tambin
;en el reg. W
Tabla_7_seg addwf PCL,F
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

b'11000000'
b'11111001'
b'10100100'
b'10110000'
b'10011001'
b'10010010'
b'10000010'
b'11111000'
b'10000000'
b'10011000'

;Desplaza al PC tantas posiciones como indique el valor


;del registro W
;Cdigo 7 seg. del dgito 0
;Cdigo del 1
;2
;3
;4
;5
;6
;7
;8
;9

;*********************************************************************************
;Delay_var: Esta rutina de propsito general realiza una temporizacin variable
;entre 50 mS y 12.8". Se emplea un preescaler de 256 y al TMR0 se le carga con 195.
;La velocidad de trabajo es de 4Mhz y por tanto el TMR0 se incrementa cada uS. De
;esta forma, el TMR0 debe contar 195 eventos que, con un preescaler de 256 hace una
;intervalo total de 50000 uS/50 mS (195 * 256). Dicho intervalo de 50 mS se repite
;tantes veces como indique la variable "Delay_cont", es por ello que el delay mnimo
;es de 50 mS ("Delay_cont=1) y el mxima de 12.8" (Delay_cont=255).
Delay_var:
Intervalo

bcf
INTCON,T0IF
;Desconecta el flag de rebosamiento
movlw ~.195
movwf TMR0
;carga el TMR0 con el complemento de 195
clrwdt
;Refrescar el WDT
btfss INTCON,T0IF
;Rebasamiento del TMR0 al de 50mS ??
goto Intervalo
;Todava no
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
decfsz Delay_Cont,F
;Decrementa contador de intervalos
goto Delay_var
;Repite el intervalo de 50 mS
return
Inicio

Loop

movlw b'11111111'
movwf
PORTB
;Pone a "1" los latch de salida
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISB
;Puerta B se configura como salida
movlw b'00011111'
movwf TRISA
;Puerta A se configura como entrada
movlw b'00000111'
movwf OPTION_REG
;Preescaler de 256 para el TMR0
bcf
STATUS,RP0 ;Selecciona banco 0
clrwdt
btfss PORTA,0
goto Loop
movf TMR0,W
movwf Numero

;Refrescar el WDT
;Activado RA0 ??
;Todava No
;Ahora si.
;Captura el valor del TMR0 (N aleatorio)

;El nmero aleatorio es, mediante restas consecutivas, dividido entre 6. De esta forma
;el ltimo resto ser entre 0 y 5 que ser incrementado en una unidad para que defini;tivamente de un nmero entre 1 y 6
Divide:

movlw .6
subwf Numero,W
movwf Numero
sublw .5
btfss STATUS,C
goto Divide
incf Numero,F

;Resta 6 al nmero aleatorio


;lo guarda
;Mira si es menor de 5
;No
;El nmero queda entre 1 y 6

;Esta secuencia de instrucciones tiene por misin presentar sobre el display los nmeros
;del 1 al 6 a intervalos de 0.05" con objeto de dar una sensacin de movimiento del dado.
;Dicho movimiento se mantiene mientras RA0 est a "1". Al ponerse a "0" se presenta el
;nmero aleatorio capturado previamente desde el TMR0
Dado:
RA0_1

movlw .6
movwf Temporal
clrwdt
btfss PORTA,0
goto Salida
movf Temporal,W
call
Tabla_7_seg
movwf PORTB
movlw .1
movwf Delay_Cont
call
Delay_var
decfsz Temporal,F
goto RA0_1
goto Dado

;Inicia el contador del dado


;Refresco del WDT
;Mira si RA0 est a 1
;No, visualiza el aleatorio
;Nmero a visualizar
;Conversin a BCD
;Visualiza sobre el display
;Variable de temporizacin
;temporiza 0.05"
;Siguiente nmero

SU AMIGABLE BESINO: ANGHEL PMQ

Salida:

sleep
movf Numero,W
call
Tabla_7_seg
movwf PORTB
movlw d'60'
movwf Delay_Cont
call
Delay_var
movlw b'11111111'
movwf PORTB
goto

ASM MICROPROCESADORES I
;Elimina rebotes
;Recoge el aleatorio
;Lo convierte en 7 segmentos
;Salida a Display
;Inicia variable de temporizacin
;Temporiza 3"
;Apaga el display

Loop

end

;Fin del programa fuente

;
;
PRACTICA 14
;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;Multiplexado de displays
;
;El ejemplo presenta un subrutina que realiza el multiplexado o barrido de 3 displays de
;nodo comn y que visualiza el valor actual de las variables D0, D1 y D2 a las que se
;supone previamente cargadas.
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Definiciones de registros internos
DIG0
DIG1
DIG2
Delay_Fijo
Delay_Cont

equ
equ
equ
equ
equ

0x0c
0x0d
0x0e
0x0f
0x10

;Variable
;Variable
;Variable
;Variable
;Variable

para
para
para
para
para

el dgito 0
el dgito 1
el dgito 2
temporizacin fija
temporizacin variable

org
goto
org

0x00
Inicio
0x05

;Vector de Reset
;Salva vector de interrupcin

;**********************************************************************************
;Tabla_7_seg: Esta rutina convierte el cdigo BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El cdigo 7 segmentos retorna tambin
;en el reg. W
Tabla_7_seg addwf PCL,F
retlw
retlw
retlw
retlw
retlw
retlw

b'11000000'
b'11111001'
b'10100100'
b'10110000'
b'10011001'
b'10010010'

;Desplaza al PC tantas posiciones como indique el valor


;del registro W
;Cdigo 7 seg. del dgito 0
;Cdigo del 1
;2
;3
;4
;5

SU AMIGABLE BESINO: ANGHEL PMQ

retlw
retlw
retlw
retlw

b'10000010'
b'11111000'
b'10000000'
b'10011000'

ASM MICROPROCESADORES I
;6
;7
;8
;9

;**********************************************************************************
;Display: Esta rutina activa secuencialmente cada uno de los dgitos D0, D1 y D2
;conectados a RA0, RA1 y RA2 respectivamente, a la vez que visualiza en cada uno de
;ellos el contenido de las variables DIG1, DIG2 y DIG3, previa conversin a 7 segmentos
Display

bsf
PORTA,0
;Activa dgito 0
movf DIG0,W
;Carga variable DIG0
call
Tabla_7_seg ;Convierte a 7 segmentos
movwf PORTB
;Visualiza DIG0 sobre el dgito 0
call
Delay
;Temporiza 1mS
bcf
PORTA,0
;Desactiva dgito 0
movlw b'11111111'
movwf PORTB
;Desactiva segmentos
bsf
PORTA,1
;Activa dgito 1
movf DIG1,W
;Carga variable DIG1
call
Tabla_7_seg ;Convierte a 7 segmentos
movwf PORTB
;Visualiza DIG1 sobre el dgito 1
call
Delay
;Temporiza 1mS
bcf
PORTA,1
;Desactiva dgito 1
movlw b'11111111'
movwf PORTB
;Desactiva segmentos
bsf
PORTA,2
;Activa dgito 2
movf DIG2,W
;Carga variable DIG2
call
Tabla_7_seg ;Convierte a 7 segmentos
movwf PORTB
;Visualiza DIG2 sobre el dgito 2
call
Delay
;Temporiza 1mS
bcf
PORTA,2
;Desactiva dgito 2
movlw b'11111111'
movwf PORTB
;Desactiva segmentos
return
;Fin del multiplexado

;**********************************************************************************
;Delay: Rutina de temporizacin por software. Un bucle hace decermentar una variable hasta
;alcanzar 0. El tiempo que consume su ejecucin es del orden de 1mS, dado que la ejecucin de
;tres instrucciones que consumen 4 uS, se repite 255 veces
;
Delay
clrf
Delay_Fijo ;Se manda repetir el bucle 255 veces
Delay_1
nop
;Consume 1 uS
decfsz Delay_Fijo,F ;Consume 1 uS
goto Delay_1
;Consume 2 uS
return
;*********************************************************************************
;Delay_var: Esta rutina de propsito general realiza una temporizacin variable
;entre 5 mS y 1.2". Se emplea un preescaler de 256 y al TMR0 se le carga con 19.
;La velocidad de trabajo es de 4Mhz y por tanto el TMR0 se incrementa cada uS. De
;esta forma, el TMR0 debe contar 19 eventos que, con un preescaler de 256 hace una
;intervalo total de 5000 uS/5 mS (19 * 256). Dicho intervalo de 5 mS se repite
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;tantes veces como indique la variable "Delay_cont", es por ello que el delay mnimo
;es de 5 mS ("Delay_cont=1) y el mxima de 1.2" (Delay_cont=255).
Delay_var:
Intervalo

Inicio

bcf
INTCON,T0IF
;Desconecta el flag de rebosamiento
movlw ~.19
movwf TMR0
;carga el TMR0 con el complemento de 195
clrwdt
;Refrescar el WDT
btfss INTCON,T0IF
;Rebasamiento del TMR0 al de 50mS ??
goto Intervalo
;Todava no
decfsz Delay_Cont,F
;Decrementa contador de intervalos
goto Delay_var
;Repite el intervalo de 50 mS
return
movlw b'11111111'
movwf
PORTB
;Pone a "1" los latch de salida
clrf
PORTA
;Desconecta los dgitos
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISB
;Puerta B se configura como salida
movlw b'00011000'
movwf TRISA
;RA0-RA2 se configuran como salidas
movlw b'00000111'
movwf OPTION_REG
;Preescaler de 256 para el TMR0
bcf
STATUS,RP0 ;Selecciona banco 0
movlw 1
movwf DIG2
movlw 2
movwf DIG1
movlw 3
movwf DIG0

Loop

;Carga en las variables el valor a visualizar (123)

clrwdt
;Refrescar el WDT
call
Display
;
movlw .1
movwf Delay_Cont
call
Delay_var
goto Loop
end

;Fin del programa fuente

;
;
PRACTICA 15
;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;Contador UP/DOWN de 3 dgitos
;
;Se trata de un contador UP/DOWN de 3 dgitos que cuenta desde 000 hasta 999. La entrada de
;pulsos a contar se aplica por RA4 es sensible al flanco descendente. La entrada RA3 determina
;si la cuenta es ascendente "1" o descendente "0"
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Definiciones de registros internos
DIG0
DIG1
DIG2
Delay_Fijo

equ
equ
equ
equ

0x0c
0x0d
0x0e
0x0f

;Variable
;Variable
;Variable
;Variable

para
para
para
para

el dgito 0
el dgito 1
el dgito 2
temporizacin fija

org
goto
org

0x00
Inicio
0x05

;Vector de Reset
;Salva vector de interrupcin

;**********************************************************************************
;Tabla_7_seg: Esta rutina convierte el cdigo BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El cdigo 7 segmentos retorna tambin
;en el reg. W
Tabla_7_seg addwf PCL,F
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

b'11000000'
b'11111001'
b'10100100'
b'10110000'
b'10011001'
b'10010010'
b'10000010'
b'11111000'
b'10000000'
b'10011000'

;Desplaza al PC tantas posiciones como indique el valor


;del registro W
;Cdigo 7 seg. del dgito 0
;Cdigo del 1
;2
;3
;4
;5
;6
;7
;8
;9

;**********************************************************************************
;Display: Esta rutina activa secuencialmente cada uno de los dgitos D0, D1 y D2
;conectados a RA0, RA1 y RA2 respectivamente, a la vez que visualiza en cada uno de
;ellos el contenido de las variables DIG1, DIG2 y DIG3, previa conversin a 7 segmentos
Display

bsf
PORTA,0
;Activa dgito 0
movf DIG0,W
;Carga variable DIG0
call
Tabla_7_seg ;Convierte a 7 segmentos
movwf PORTB
;Visualiza DIG0 sobre el dgito 0
call
Delay
;Temporiza 1mS
bcf
PORTA,0
;Desactiva dgito 0
movlw b'11111111'
movwf PORTB
;Desactiva segmentos
bsf
PORTA,1
;Activa dgito 1
movf DIG1,W
;Carga variable DIG1
call
Tabla_7_seg ;Convierte a 7 segmentos
movwf PORTB
;Visualiza DIG1 sobre el dgito 1
call
Delay
;Temporiza 1mS
bcf
PORTA,1
;Desactiva dgito 1
movlw b'11111111'
movwf PORTB
;Desactiva segmentos
bsf
PORTA,2
;Activa dgito 2
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
movf DIG2,W
;Carga variable DIG2
call
Tabla_7_seg ;Convierte a 7 segmentos
movwf PORTB
;Visualiza DIG2 sobre el dgito 2
call
Delay
;Temporiza 1mS
bcf
PORTA,2
;Desactiva dgito 2
movlw b'11111111'
movwf PORTB
;Desactiva segmentos
return
;Fin del multiplexado
;**********************************************************************************
;Delay: Rutina de temporizacin por software. Un bucle hace decermentar una variable hasta
;alcanzar 0. El tiempo que consume su ejecucin es del orden de 1mS, dado que la ejecucin de
;tres instrucciones que consumen 4 uS, se repite 255 veces
;
Delay
clrf
Delay_Fijo ;Se manda repetir el bucle 255 veces
Delay_1
nop
;Consume 1 uS
decfsz Delay_Fijo,F ;Consume 1 uS
goto Delay_1
;Consume 2 uS
return
;****************************************************************************************
;Incrementa en una unidad las variables DIG0, DIG1 y DIG2 con el correspondiente ajuste BCD
;
Incrementa incf DIG0,F
;Incrementa DIG0 en una unidad
movlw 0x0a
subwf DIG0,W
btfss STATUS,Z ;Es mayor de 9 ??
return
;No
clrf
DIG0
;Si, ajusta a 0 variable DIG0
incf DIG1,F
;Incrementa DIG1
movlw 0x0a
subwf DIG1,W
btfss STATUS,Z ;Es mayor de 9 ??
return
;No
clrf
DIG1
;Si, ajusta a 0 variable DIG1
incf DIG2,F
;Incrementa DIG2
movlw 0x0a
subwf DIG2,W
btfss STATUS,Z ;Es mayor de 9 ??
return
;No
clrf
DIG2
;Si, agista a 0 variable DIG2
return
;*******************************************************************************************
;Decrementa en una unidad las variables DIG0, DIG1 y DIG2 con el correspondiente ajuste BCD
;
Decrementa decf DIG0,F
;Decrementa DIG0 en una unidad
movlw 0xff
subwf DIG0,W
btfss STATUS,Z ;Es menor de 0 ?
return
;No
movlw .9
movwf DIG0
;Si ajuste de DIG0
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;Decrementa DIG1

decf DIG1,F
movlw 0xff
subwf DIG1,W
btfss STATUS,Z
return
movlw .9
movwf DIG1
decf DIG2,F
movlw 0xff
subwf DIG2,W
btfss STATUS,Z
return
movlw .9
movwf DIG2
return
Inicio

;Si, ajusta DIG1


;Decrementa DIG2
;Es menor de 0 ?
;No
;Si, ajusta DIG2

movlw b'11111111'
movwf
PORTB
;Pone a "1" los latch de salida
clrf
PORTA
;Desconecta los dgitos
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISB
;Puerta B se configura como salida
movlw b'00011000'
movwf TRISA
;RA0-RA2 se configuran como salidas
movlw b'00000111'
movwf OPTION_REG
;Preescaler de 256 para el TMR0
bcf
STATUS,RP0 ;Selecciona banco 0
clrf
clrf
clrf

Loop

;Es menor de 0 ?
;No

DIG0
DIG1
DIG2

;Carga las variables con valor inicial 000

clrwdt
;Refrescar el WDT
btfsc PORTA,4
;Flanco ascendente en RA4 ??
goto Descendente ;Si
call
Display
;No, mantiene el refresco del display
goto Loop
;Esperar

Descendente clrwdt
;Refrescar el WDT
btfss PORTA,4
;Flanco descendente en RA4
goto Pulso
;Si, ha habido un pulso en RA4
call
Display
;No, mantiene el refresco del display
goto Descendente ;Esperar
Pulso

Dec_Cont

btfss
goto
call
goto
call
goto
end

PORTA,3
Dec_Cont
Incrementa
Loop
Decrementa
Loop

;RA3 est a "1" ??


;No
;Si, incrementa el contador
;Esperar al siguiente pulso
;Decrementar el contador
;Esperar el siguiente pulso
;Fin del programa fuente

SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;
;
PRACTICA 16
;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;Cronmetro digital
;
;Se trata de un cronmetro capaz de medir lapsus de tiempo de hasta 99.9 segundos. El pulsador
;conectado a RA4 acta de START/STOP mientras que RA3 acta como puesta a 00.0
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Definiciones de registros internos
DIG0
equ
DIG1
equ
DIG2
equ
Delay_Fijo equ
W_Temp
STATUS_Temp
Delay_Cont equ
org
goto
org
goto
org

0x0c
;Variable para el dgito 0
0x0d
;Variable para el dgito 1
0x0e
;Variable para el dgito 2
0x0f
;Variable para temporizacin fija
equ 0x10
;Registro temporal para el W
equ 0x11
;Registro temporal para el registro de estado
0x12
;Variable de temporizacin
0x00
;Vector de Reset
Inicio
0x04
Interrupcion ;Vector de interrupcin
0x05
;Salva vector de interrupcin

;**********************************************************************************
;Tabla_7_seg: Esta rutina convierte el cdigo BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El cdigo 7 segmentos retorna tambin
;en el reg. W
Tabla_7_seg addwf PCL,F
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

b'11000000'
b'11111001'
b'10100100'
b'10110000'
b'10011001'
b'10010010'
b'10000010'
b'11111000'
b'10000000'
b'10011000'

;Desplaza al PC tantas posiciones como indique el valor


;del registro W
;Cdigo 7 seg. del dgito 0
;Cdigo del 1
;2
;3
;4
;5
;6
;7
;8
;9

;**********************************************************************************
;Display: Esta rutina activa secuencialmente cada uno de los dgitos D0, D1 y D2
;conectados a RA0, RA1 y RA2 respectivamente, a la vez que visualiza en cada uno de
;ellos el contenido de las variables DIG1, DIG2 y DIG3, previa conversin a 7 segmentos
Display

bsf

PORTA,0

;Activa dgito 0

SU AMIGABLE BESINO: ANGHEL PMQ

movf DIG0,W
call
Tabla_7_seg
movwf PORTB
call
Delay
bcf
PORTA,0
movlw b'11111111'
movwf PORTB
bsf
PORTA,1
movf DIG1,W
call
Tabla_7_seg
andlw b'01111111'
movwf PORTB
call
Delay
bcf
PORTA,1
movlw b'11111111'
movwf PORTB
bsf
PORTA,2
movf DIG2,W
call
Tabla_7_seg
movwf PORTB
call
Delay
bcf
PORTA,2
movlw b'11111111'
movwf PORTB
return

ASM MICROPROCESADORES I
;Carga variable DIG0
;Convierte a 7 segmentos
;Visualiza DIG0 sobre el dgito 0
;Temporiza 1mS
;Desactiva dgito 0
;Desactiva segmentos
;Activa dgito 1
;Carga variable DIG1
;Convierte a 7 segmentos
;Activa el punto decimal en el dgito 1
;Visualiza DIG1 sobre el dgito 1
;Temporiza 1mS
;Desactiva dgito 1
;Desactiva segmentos
;Activa dgito 2
;Carga variable DIG2
;Convierte a 7 segmentos
;Visualiza DIG2 sobre el dgito 2
;Temporiza 1mS
;Desactiva dgito 2
;Desactiva segmentos
;Fin del multiplexado

;**********************************************************************************
;Delay: Rutina de temporizacin por software. Un bucle hace decermentar una variable hasta
;alcanzar 0. El tiempo que consume su ejecucin es del orden de 1mS, dado que la ejecucin de
;tres instrucciones que consumen 4 uS, se repite 255 veces
;
Delay
clrf
Delay_Fijo ;Se manda repetir el bucle 255 veces
Delay_1
nop
;Consume 1 uS
decfsz Delay_Fijo,F ;Consume 1 uS
goto Delay_1
;Consume 2 uS
return
;****************************************************************************************
;Incrementa en una unidad las variables DIG0, DIG1 y DIG2 con el correspondiente ajuste BCD
;
Incrementa incf DIG0,F
;Incrementa DIG0 en una unidad
movlw 0x0a
subwf DIG0,W
btfss STATUS,Z ;Es mayor de 9 ??
return
;No
clrf
DIG0
;Si, ajusta a 0 variable DIG0
incf DIG1,F
;Incrementa DIG1
movlw 0x0a
subwf DIG1,W
btfss STATUS,Z ;Es mayor de 9 ??
return
;No
clrf
DIG1
;Si, ajusta a 0 variable DIG1
incf DIG2,F
;Incrementa DIG2
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
movlw 0x0a
subwf DIG2,W
btfss STATUS,Z
return
clrf
DIG2
return

;Es mayor de 9 ??
;No
;Si, agista a 0 variable DIG2

;***************************************************************************************
;Interrupcin: Programa de tratamiento que se ejecuta cada vez que desborde el TMR0. Este
;se carga con 195 que junto con un preescaler de 256 genera interrupcin cada 50mS. Cuando
;se producen dos interrupciones (0.1") se actualiza el valor de los contadores.
Interrupcion btfss INTCON,T0IF
;Ha sido el TMR0 ??
retfie
;No, falsa interrupcin
bcf
INTCON,T0IF
;Si, reponer flag del TMR0
movwf W_Temp
;Salva el registro W
swapf STATUS,W
movwf STATUS_Temp
;Salva el registro de estado
movlw ~.195
movwf TMR0
;Recarga el TMR0 para la siguiente temporizacin
decfsz Delay_Cont,F
;Ha habido dos interrupciones ??
goto Inter_Fin
;No
movlw .2
movwf Delay_Cont ;Si, repone el contador de interrupciones con 2
call
Incrementa ;Actualiza el contador del cronmetro
Inter_Fin
swapf STATUS_Temp,W
movwf STATUS
;Recupera el registro de estado
swapf W_Temp,F
swapf W_Temp,W ;Recupera el registro W
retfie
Inicio

Loop

movlw b'11111111'
movwf
PORTB
;Pone a "1" los latch de salida
clrf
PORTA
;Desconecta los dgitos
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISB
;Puerta B se configura como salida
movlw b'00011000'
movwf TRISA
;RA0-RA2 se configuran como salidas
movlw b'00000111'
movwf OPTION_REG
;Preescaler de 256 para el TMR0
bcf
STATUS,RP0 ;Selecciona banco 0
clrf
clrf
clrf
bcf

DIG0
DIG1
DIG2
;Puesta a 000 del contador
INTCON,T0IF
;Repone flag del TMR0

btfsc
goto
call
goto

clrwdt
PORTA,4
Descendente ;Si
Display
Loop_1

Loop_1

;Refrescar el WDT
;Flanco ascendente en RA4 ??
;No, mantiene el refresco del display
;Esperar

SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
Descendente clrwdt
;Refrescar el WDT
btfss PORTA,4
;Flanco descendente en RA4
goto START
;Si, ha habido un pulso en RA4
call
Display
;No, mantiene el refresco del display
goto Descendente ;Esperar
;Se comienza a cronometrar
START

movlw ~.195
movwf TMR0
;Carga el TMR0 con 195 (interrupcin cada 50mS)
movlw .2
movwf Delay_Cont ;Inicia variable de temporizacin
bsf
INTCON,T0IE
;Habilita interrupcin del TMR0
bsf
INTCON,GIE ;Permiso general de interrupciones

Crono_Fin

clrwdt
btfsc PORTA,4
goto STOP
call
Display
goto Crono_Fin

;Flanco ascendente en RA4 ?


;Si, parada del cronmetro
;No, mantiene el refresco del display
;Sigue cronometrando

;Secuencia de parada del cronmetro y puesta a 000


STOP
Fin_1

bcf
INTCON,GIE ;Se detiene la interrupcin del TMR0
clrwdt
btfss PORTA,4
;Flanco descendente de RA4 ??
goto Fin_2
;Si
call
Display
;An no se ha soltado RA4, refrescar el display
goto Fin_1
;Esperar a que se suelte RA4

Fin_2

clrwdt
btfsc PORTA,3
goto Fin_3
call
Display
goto Fin_2
clrwdt
btfss PORTA,3
goto Loop
call
Display
goto Fin_3

Fin_3

end

;Flanco ascendente en RA3 ?


;Si
;No, mantiene el refresco del display
;Esperar a que se active RA3
;Flanco descendente en RA3 ?
;Si, ha habido pulso para puesta a 0 del cronmetro
;No, mantiene el refresco del display
;Esperar a que se suelte RA3
;Fin del programa fuente

;
;
PRACTICA 17
;
;
Autor: BARRABAZ
;
(c) Microsystems Engineering (Bilbao)
;
;La memoria EEPROM de datos. La mquina "Su Turno"
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;
;Sobre los display D0 y D1 se visualiza el nmero de turno entre 00 y 99. Cada vez que se
;aplica un pulso por RA4 el contador se incrementa una unidad al tiempo que se activa una seal
;acstica conectada a RA2 durante 0.5". La entrada RA3 se emplea para cponer a 00 el contador.
;
;El valor de la cuenta es constantemente registrado en la EEPROM de datos. Si hubiera un fallo
;de alimentacin, el contador visualiza el ltimo estado.
List p=16F84
;Tipo de procesador
include
"P16F84.INC"
;Definiciones de registros internos
DIG0
DIG1
Delay_Fijo
Delay_Cont
N_Bytes

equ
equ
equ
equ

0x0c
0x0d
0x0e
0x0f
equ 0x10

;Variable para el dgito 0


;Variable para el dgito 1
;Variable para temporizacin fija
;Variable de temporizacin
;N de bytes a grabar/leer en la EEPROM

org
goto

0x00
Inicio

;Vector de Reset

org

0x05

;Salva vector de interrupcin

;****************************************************************************************
;EE_Write: Graba n bytes a partir de la primera posicin de la EEPROM de datos. El nmero
;de bytes a grabar est contenido en la variable N_Bytes.
EE_Write

movlw
.2
movwf N_Bytes
;Inicia N de bytes a leer
clrf
EEADR
;Direccin 0 de EEPROM
movlw DIG0
movwf FSR
;Inicia ndice con el 1er. byte a grabar
EE_Write_1 movf INDF,W
movwf EEDATA
;Carga dato a grabar
bsf
STATUS,RP0 ;Selecciona banco 1
bsf
EECON1,WREN ;Permiso de escritura
movlw b'01010101'
movwf EECON2
movlw b'10101010'
movwf EECON2
;Secuencia establecida por Microchip
bsf
EECON1,WR
;Orden de escritura
bcf
EECON1,WREN ;Desconecta permiso de escritura
Wait
btfss EECON1,EEIF
;Fin de escritura ??
goto Wait
;No, todava no ha finalizado la escritura
bcf
EECON1,EEIF
;Reponer flag de fin de escritura
bcf
STATUS,RP0
;Seleccin banco 0
incf FSR,F
;Si, siguiente byte a escribir
incf EEADR,F
;Siguiente posicin de EEPROM
decfsz N_Bytes,F
;Decrementa el contador de bytes. Es 0 ??
goto EE_Write_1 ;No, faltan bytes por grabar
return
;Si, fin de escritura
;**************************************************************************************
;EE_Read: Leer tantos bytes de la EEPROM de datos como se indique en la variable N_Bytes.
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;Se empieza a leer desde la posicin 0 de la EEPROM y los datos ledos se depositan a partir
;de la posicin indicada por FSR
EE_Read

movlw
.2
movwf N_Bytes
;N de bytes a leer
clrf
EEADR
;1 direccin EEPROM a leer
movlw DIG0
movwf FSR
;1 direeccin a almacenar lo ledo
EE_Read_1 bsf
STATUS,RP0 ;Seleccin de banco 1
bsf
EECON1,RD
;Orden de lectura
bcf
STATUS,RP0
;Seleccin de banco 0
movf
EEDATA,W
movwf INDF
;Almacena dato recien ledo
incf EEADR,F
;Siguiente direccin de EEPROM a leer
incf FSR,F
;Siguiente posicin de almacenamiento
decfsz N_Bytes,F
;Se han ledo todos los bytes deseados ??
goto EE_Read_1 ;No, nueva lectura
return
;Si
;**********************************************************************************
;Tabla_7_seg: Esta rutina convierte el cdigo BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El cdigo 7 segmentos retorna tambin
;en el reg. W
Tabla_7_seg addwf PCL,F
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

b'11000000'
b'11111001'
b'10100100'
b'10110000'
b'10011001'
b'10010010'
b'10000010'
b'11111000'
b'10000000'
b'10011000'

;Desplaza al PC tantas posiciones como indique el valor


;del registro W
;Cdigo 7 seg. del dgito 0
;Cdigo del 1
;2
;3
;4
;5
;6
;7
;8
;9

;**********************************************************************************
;Display: Esta rutina activa secuencialmente cada uno de los dgitos D0 y D1
;conectados a RA0 y RA1 respectivamente, a la vez que visualiza en cada uno de
;ellos el contenido de las variables DIG0 y DIG1, previa conversin a 7 segmentos
Display

bsf
PORTA,0
;Activa dgito 0
movf DIG0,W
;Carga variable DIG0
call
Tabla_7_seg ;Convierte a 7 segmentos
movwf PORTB
;Visualiza DIG0 sobre el dgito 0
call
Delay
;Temporiza 1mS
bcf
PORTA,0
;Desactiva dgito 0
movlw b'11111111'
movwf PORTB
;Desactiva segmentos
bsf
PORTA,1
;Activa dgito 1
movf DIG1,W
;Carga variable DIG1
call
Tabla_7_seg ;Convierte a 7 segmentos
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
movwf PORTB
;Visualiza DIG1 sobre el dgito 1
call
Delay
;Temporiza 1mS
bcf
PORTA,1
;Desactiva dgito 1
movlw b'11111111'
movwf PORTB
;Desactiva segmentos
return
;Fin del multiplexado
;**********************************************************************************
;Delay: Rutina de temporizacin por software. Un bucle hace decermentar una variable hasta
;alcanzar 0. El tiempo que consume su ejecucin es del orden de 1mS, dado que la ejecucin de
;tres instrucciones que consumen 4 uS, se repite 255 veces
;
Delay
clrf
Delay_Fijo ;Se manda repetir el bucle 255 veces
Delay_1
nop
;Consume 1 uS
decfsz Delay_Fijo,F ;Consume 1 uS
goto Delay_1
;Consume 2 uS
return
;****************************************************************************************
;Incrementa en una unidad las variables DIG0 y DIG1 con el correspondiente ajuste BCD
;
Incrementa incf DIG0,F
;Incrementa DIG0 en una unidad
movlw 0x0a
subwf DIG0,W
btfss STATUS,Z ;Es mayor de 9 ??
return
;No
clrf
DIG0
;Si, ajusta a 0 variable DIG0
incf DIG1,F
;Incrementa DIG1
movlw 0x0a
subwf DIG1,W
btfss STATUS,Z ;Es mayor de 9 ??
return
;No
clrf
DIG1
;Si, ajusta a 0 variable DIG1
return
Inicio

movlw b'11111111'
movwf
PORTB
;Pone a "1" los latch de salida
clrf
PORTA
;Desconecta los dgitos
bsf
STATUS,RP0 ;Selecciona banco 1
clrf
TRISB
;Puerta B se configura como salida
movlw b'00011000'
movwf TRISA
;RA0-RA2 se configuran como salidas
movlw b'00000111'
movwf OPTION_REG
;Preescaler de 256 para el TMR0
bcf
STATUS,RP0 ;Selecciona banco 0

;En la secuencia de inicio es necesario conocer si la EEPROM de datos contiene valores de


;contaje apropiados en sus dos primeras posiciones y que se correspondern con DIG0 y DIG1.
;Esos valores deben estar comprendidos entre 00 y 09. En caso contrario significa que la
;memoria EEPROM de datos no ha sido utilizada o bien se emple en otras aplicaciones.
call

EE_Read

;Lee los dos primeros bytes y los deposita en


SU AMIGABLE BESINO: ANGHEL PMQ

movlw 0x09
subwf DIG0,W
btfsc STATUS,C
goto Clear
movlw 0x09
subwf DIG1,W
btfss STATUS,C
goto Loop
Clear

Loop

clrf
clrf
call

DIG0
DIG1
EE_Write

ASM MICROPROCESADORES I
;las variable DIG0 y DIG1
;DIG0 > 09 ??
;Si, el contador a de ponerse a 00
;DIG1 > 09 ??
;No, DIG0 y DIG1 estn entre los valores correctos

;Pone le contador a 00

clrwdt
;Refresca el WDT
btfsc PORTA,4
;Flanco ascendente en RA4 ??
goto Descendente ;Si, esperar el descendente para incrementar contador
btfsc PORTA,3
;Flanco ascendente en RA3 (borrado) ??
goto Borrar
;Si, puesta a 00 del contador
call
Display
;No, mantiene el refresco del display
goto Loop
;Esperar

Descendente bsf
PORTA,2
;Activa seal sonora
clrwdt
;Refrescar el WDT
btfss PORTA,4
;Flanco descendente en RA4
goto Inc_Cont
;Si, ha habido un pulso en RA4
call
Display
;No, mantiene el refresco del display
goto Descendente ;Esperar
Inc_Cont

call
Incrementa ;Incrementa el contador
call
EE_Write
;Actualiza el contador en la EEPROM
movlw .250
movwf Delay_Cont ;Inicia variable de temporizacin
Inc_Cont_1 clrwdt
call
Display
;Refresca el display (el refresco tarda 2 mS)
decfsz Delay_Cont,F
;Repite el refresco 250 veces (500 mS)
goto Inc_Cont_1
bcf
PORTA,2
;Desconecta la seal sonora
goto Loop
Borrar

clrwdt
call
Display
btfsc PORTA,3
goto Borrar
clrf
DIG0
clrf
DIG1
call
EE_Write
goto Loop
end

;No

;Refresca el display
;Flanco descendente en RA3 ?

;Si, borrar el contador

;Fin del programa fuente

b. Archivo fuente Ensamblador .asm


SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
LIST P=16F877A
#INCLUDE "P16F877A.INC"
ORG 0
BSF STATUS,RP0 ;Ir al Banco 1
CLRF TRISB ;Puerto RB como Salida
BCF STATUS,RP0 ;Regresar al banco 0
MOVLW 0x55
MOVWF PORTB ;Mostrar dato en el Puerto RB
SLEEP ;Detener procesador
END
c. Archivo Listado .lst
00001 LIST P=16F877A
00002 #INCLUDE "P16F877A.INC"
00003 ORG 0
0000 1683 00004 BSF STATUS,RP0
0001 0186 00005 CLRF TRISB
0002 1283 00006 BCF STATUS,RP0
0003 3055 00007 MOVLW 0X55
0004 0086 00008 MOVWF PORTB
0005 0063 00009 SLEEP
00010 END
Modificar el programa del Ejemplo de manera tal que el puerto RB muestre el dato si y solo si por el
puerto RD se ingresa el primer digito del C.I. del primer integrante (ordenado alfabticamente por
apellido) del grupo de trabajo.
LIST P=16F877A
#INCLUDE "P16F877A.INC"
ORG 0
BSF STATUS,RP0
;Banco 1
CLRF TRISB
;PuertoB como salida
MOVLW 0x0F
;0x0F a W
MOVWF TRISD
;PuertoD como entrada nible bajo
BCF STATUS,RP0
;Banco 0
CLRF PORTB
;Estado bajo al puerto B
CLRF PORTD
BUCLE:
MOVF PORTD,W
;Portd a W
ANDLW 0x0F
;Enmascaramos el puerto D
XORLW 0x06
;Igualamos el numero con el carnet de identidad CI ("3")
BTFSS STATUS,Z
;Verificamos si es igual
GOTO RESET
;Saltar
MOVLW 0X55
;PuertoD a W
MOVWF PORTB
;Mostramos en Puerto B
BCF STATUS,Z
;Estado bajo a la bandera Z
GOTO BUCLE
;Saltar
RESET:
CLRF PORTB
;Limpiar el puerto B
GOTO BUCLE
;Saltar
END

SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I

LIST P=16F877
INCLUDE "P16F877.INC"
ORG 0X000
; ORIGEN DEL CODIGO
BSF STATUS,RP0
; IR BANCO 1
MOVLW B'00111111'
; PORTD COMO ENTRADA
MOVWF TRISD
CLRF TRISB
; PORTB COMO SALIDA
BCF STATUS,RP0

; IR BANCO 0

BUCLE
MOVF PORTD,W
MOVWF PORTB
GOTO BUCLE

; W=PORTA
; PORTB=W
; IR BUCLE

END

;DISEO DE barrabas
; FIN DEL PROGRAMA

LIST P=16F877A
#INCLUDE "P16F877A.INC"
ORG 0
BSF STATUS,RP0
MOVLW 0XFF
MOVWF TRISB
MOVLW 0X0F
MOVWF TRISB
BCF STATUS,RP0
CLRF PORTB
ANGHEL
BTFSC PORTB,0
BSF PORTB,7
BTFSS PORTB,0
BCF PORTB,7
BTFSC PORTB,1
BSF PORTB,6
BTFSS PORTB,1
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
BCF PORTB,6
BTFSC PORTB,2
BSF PORTB,5
BTFSS PORTB,2
BCF PORTB,5
BTFSC PORTB,3
BSF PORTB,4
BTFSS PORTB,3
BCF PORTB,4
GOTO ANGHEL
;

realisado por barraz

END

LIST p=16F877A
#INCLUDE "P16F877A.INC"
ORG 0x00

; Inicio de programa

N EQU 0x00
cont1 EQU 0x20
cont2 EQU 0x21
BCF STATUS,RP0 ; Accede a banco 0
BCF STATUS,RP1
CLRF PORTB
; Limpia PORTB
BSF STATUS,RP0 ; Accede a banco 1
CLRF TRISB ; Configura todas las patitas de PORTB como salidas
BCF STATUS,RP0 ; Regresa a banco 0
BARRZ
MOVLW 0X01
MOVWF PORTB

; La lnea Rb0 de PORTB toma el valor 1, se enciende el LED

Encledsec
CALL Retardo
RLF PORTB,1
BTFSS PORTB,7
GOTO Encledsec
CALL Retardo
GOTO BARRZ
Retardo
MOVLW N

; Llamada a la rutina de retardo


; Recorre el bit de RB0 a RB7
; Va a la etiqueta Encledsec

; Rutina de retardo
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
MOVWF cont1
Rep1
MOVLW N
MOVWF cont2
Rep2
DECFSZ cont2,1
GOTO Rep2
DECFSZ cont1,1
GOTO Rep1
RETURN

; Retorno a la llamada de rutina de retardo.

;realisado por
END ; Fin de programa

LIST p=16F877A
#INCLUDE "P16F877A.INC"
ORG 0x00 ; Inicio de programa
N EQU 0x00
cont1 EQU 0x20
cont2 EQU 0x21
BCF STATUS,RP0 ; Accede a banco 0
BCF STATUS,RP1
CLRF PORTB ; Limpia PORTB
BSF STATUS,RP0 ; Accede a banco 1
CLRF TRISB ; Configura todas las patitas de PORTB como salidas
BCF STATUS,RP0 ; Regresa a banco 0
MOVLW 0X01 ; La lnea RB0 de PORTB toma el valor 1, se enciende el LED
MOVWF PORTB
Encledsec
CALL Retardo ; Llamada a la rutina de retardo
RLF PORTB,1 ; Recorre el bit de RB7 a RB0
BTFSS PORTB,7
GOTO Encledsec ; Va a la etiqueta Encledsec
RETORNAR
CALL Retardo ; Llamada a la rutina de retardo
RRF PORTB,1 ; Recorre el bit de RB7 a RB0
BTFSS PORTB,0
GOTO RETORNAR ; Va a la etiqueta Encledsec
SU AMIGABLE BESINO: ANGHEL PMQ

barrabas

ASM MICROPROCESADORES I
GOTO Encledsec
Retardo ; Rutina de retardo
MOVLW N
MOVWF cont1
Rep1
MOVLW N
MOVWF cont2
Rep2
DECFSZ cont2,1
GOTO Rep2
DECFSZ cont1,1
GOTO Rep1
RETURN ; Retorno a la llamada de rutina de retardo.
diseo de barrabas
END ; Fin de programa

LIST P=16F877A
#INCLUDE "P16F877A.INC"
var1 EQU 0x20
var2 EQU 0x21
ORG 0
BSF STATUS,RP0
CLRF TRISB
BCF STATUS,RP0
CLRF PORTB
UNOS:
BSF STATUS,C
RLF PORTB,F
CALL ESPERA
MOVF PORTB,W
XORLW 0xFF
BTFSS STATUS,Z
GOTO UNOS
CEROS:
BCF STATUS,C
RRF PORTB,F
CALL ESPERA
MOVF PORTB,W
XORLW 0
BTFSS STATUS,Z
GOTO CEROS
GOTO UNOS
ESPERA:
DECFSZ var1,F
GOTO ESPERA
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I

END

DECFSZ var2,F
GOTO ESPERA
RETURN

2. Archivo fuente Ensamblador .asm

Modificar el programa del Ejemplo aadiendo un switch en el pin RD.0 de manera tal que si el valor
ingresado por el switch es 1, entonces el conteo se realiza en forma ASCENDENTE de otra manera
el conteo se realiza en forma DESCENDENTE.
LIST P=16F877A
#INCLUDE "P16F877A.INC"
AUX1 EQU 0X20
AUX2 EQU 0X21
ORG 0
BSF STATUS,RP0
MOVLW 0X00
MOVWF TRISB
BCF STATUS,RP0
CLRF PORTB
CASA:
PRUEBA:
CALL RETARDO
INCF PORTB,F
BTFSC PORTD, 0 ; comprueba el estado del bit 0 del puerto A
GOTO PRUEBA ; si no cambia, vuelve a comprobarlo
LAZO:
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
CALL RETARDO ; Llamada a la rutina de retardo
DECF PORTB,F
BTFSS PORTD,0
GOTO LAZO ; Va a la etiqueta Encledsec
GOTO CASA
RETARDO
MOVLW 0
MOVWF AUX2
MOVWF AUX1
RET1:
DECFSZ AUX1,F
GOTO RET1
DECFSZ AUX2,F
GOTO RET1
RETURN

END

;DISEO DE BARRAZ

a) Se compara el dato del puerto de entrada PORTC con el nmero 13. Pueden darse tres
posibilidades en la salida de RB:
Si PORTC es igual a 13, todos los leds se encienden y el programa termina.
Si PORTC es mayor a 13, en el puerto RB.0 se muestra la secuencia de leds donde 1 led se desplaza
de izquierda a derecha partiendo en el bit 0 y terminando en bit7 (aadir el retardo necesario para
visualizar la secuencia).
Si PORTC es menor a 13 todos los leds de salida parpadean 5 veces y luego se apagan.
LIST P=16F877A
#INCLUDE "P16F877A.INC"
AUX1 EQU 0X20
AUX2 EQU 0X21
CONT EQU 0X22
ORG 0
BSF STATUS,RP0
MOVLW 0XFF
MOVWF TRISC
MOVLW 0X00
MOVWF TRISB
BCF STATUS,RP0
CLRF PORTB
MOVF PORTC,W
ANDLW 0X0F
SUBLW .13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
BTFSS STATUS,C
CALL ROTACION
BTFSC STATUS,Z
CALL TERMINA
BTFSC STATUS,C
CALL PARPADEA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ROTACION
BSF PORTB,0 ; La lnea RB0 de PORTB toma el valor 1, se enciende el LED
Encledsec:
CALL RETARDO ; Llamada a la rutina de retardo
RLF PORTB,1 ; Recorre el bit de RB7 a RB0
BTFSS PORTB,7
GOTO Encledsec ; Va a la etiqueta Encledsec
RETORNAR:
CALL RETARDO ; Llamada a la rutina de retardo
RRF PORTB,1 ; Recorre el bit de RB7 a RB0
BTFSS PORTB,0
GOTO RETORNAR ; Va a la etiqueta Encledsec
GOTO Encledsec
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PARPADEA
movlw 5
movwf CONT
CASA
CALL RETARDO
MOVLW 0XFF ;
MOVWF PORTB
CALL RETARDO
MOVLW 0X00
MOVWF PORTB
DECFSZ CONT,f
GOTO CASA
SLEEP
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TERMINA
MOVLW 0XFF
MOVWF PORTB
SLEEP
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RETARDO
MOVLW 0
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
MOVWF AUX2
MOVWF AUX1
RET1:
DECFSZ AUX1,F
GOTO RET1
DECFSZ AUX2,F
GOTO RET1
RETURN
;DISEO DE
BARRAZ
END
b) Se leen las tres lneas ms bajas del puerto RC, que fijan el nmero de leds que se iluminarn a
la salida del puerto RB. As por ejemplo, si lee el dato 5, en los leds conectados al puerto B se
iluminarn los primeros 5 leds 00011111
LIST P=16F877A
#INCLUDE "P16F877A.INC"
ORG 0
BSF STATUS,RP0
MOVLW 0XFF
MOVWF TRISC
CLRF TRISB
BCF STATUS,RP0
CLRF PORTB
PRINCIPAL:
MOVF PORTC,W
ANDLW 0X07
MOVWF 20H
CLRF 21H
MOVF 20H,F
BTFSC STATUS,Z
GOTO SALIDA
DESPL_OTRAVEZ:
BSF STATUS,C
RLF 21H,F
DECFSZ 20H,F
GOTO DESPL_OTRAVEZ
SALIDA:
MOVF 21H,W
MOVWF PORTB
GOTO PRINCIPAL

SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
;DISEO DE BARRAZ
END
c) A travs de un pulsador conectado al bit RD.0 se muestran en los 4 leds conectados a RC, el
nmero de pulsos ingresados. Cuan este nmero supera 15 los leds parpadean 3 veces y luego el
programa termina.
LIST P=16F877A
#INCLUDE "P16F877A.INC"
AUX1 EQU 0X21
AUX2 EQU 0X22
CONT EQU 0X23
ORG 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BSF STATUS,RP0
MOVLW 0XFF
MOVWF TRISD
MOVLW 0XF0
MOVWF TRISC
BCF STATUS,RP0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CLRF PORTC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PRINCIPAL:
NADA:
MOVWF 21H
MOVF PORTD,W
BTFSC PORTD,0
GOTO NADA
MOVF 21H,W
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ANDLW 0X01
ADDWF 20H,1
MOVF 20H,F
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOVF 20H,W
MOVWF PORTC
SUBLW .16
BTFSC STATUS,Z
CALL PARPADEA
CLRW
CLRF 21H
GOTO PRINCIPAL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PARPADEA
movlw 3
movwf CONT
CASA
CALL RETARDO
MOVLW 0XFF ;
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
MOVWF PORTC
CALL RETARDO
MOVLW 0X00
MOVWF PORTC
DECFSZ CONT,f
GOTO CASA
CLRF 20H
SLEEP
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RETARDO
MOVLW 0
MOVWF AUX2
MOVWF AUX1
RET1:
DECFSZ AUX1,F
GOTO RET1
DECFSZ AUX2,F
GOTO RET1
RETURN
;DISEO DE BARRAZ
END
d) Se obtiene un valor de temperatura en grados Fahrenheit (F) de los 4 bits inferiores del puerto D
(RD0 a RD3). Se convierte este valor a grados Celsius (C). El resultado se muestra en los 8 bits del
puerto B (RB0 a RB7)
LIST P=16F877A
#INCLUDE "P16F877A.INC"
VAR EQU 0x20
ORG 0
BSF STATUS,RP0
CLRF TRISB
MOVLW 0x0F
MOVWF TRISD
BCF STATUS,RP0
CLRF PORTB
CLRF PORTD
BUCLE:
MOVF PORTD,W
MOVWF VAR
COMF VAR,F
;RESTA AL W
MOVLW .1 ;RESTA AL W
ADDWF VAR,W
;RESTA AL W
ADDLW .32
MOVWF VAR
RRF VAR,F
MOVF VAR,W
MOVWF PORTB
goto BUCLE ;SLEEP
;DISEO DE BARRAZ
END
SU AMIGABLE BESINO: ANGHEL PMQ

ASM MICROPROCESADORES I
e) Se tienen 2 pulsadores en RD.0 y RD.1. Al presionar el pulsador en RD.0 el nmero mostrado en
los leds en RC se incrementa. Al presionar el pulsador en RD.1 el nmero mostrado en los leds en
RC se decrementa. Si se presionan ambos pulsadores, los leds se apagan y el programa termina.
LIST P=16F877A
#INCLUDE "P16F877A.INC"
AUX1 EQU 0X20
AUX2 EQU 0X21
ORG 0
BSF STATUS,RP0
MOVLW 0X00
MOVWF TRISB
BCF STATUS,RP0
CLRF PORTB
PRUEBA:
CALL RETARDO ; Llamada a la rutina de retardo
BTFSC PORTD,1 ; comprueba el estado del bit 1 del puerto
DECF PORTB,F ; DECREMENTA EN PUERTO PORTB
BTFSS PORTD,0 ; comprueba el estado del bit 0 del puerto
GOTO PRUEBA ; si no cambia, vuelve a comprobarlo
LAZO:
CALL RETARDO ; Llamada a la rutina de retardo
BTFSC PORTD,0 ; comprueba el estado del bit 0 del puerto
INCF PORTB,F ; INCREMENTA EN PUERTO PORTB
BTFSS PORTD,1 ; comprueba el estado del bit 1 del puerto
GOTO LAZO ; si no cambia, vuelve a comprobarlo
BTFSS PORTD,0 ; comprueba el estado del bit 0 del puerto
GOTO PRUEBA ; Va a la etiqueta
CLRF PORTB
SLEEP
RETARDO
MOVLW 0
MOVWF AUX2
MOVWF AUX1
RET1:
DECFSZ AUX1,F
GOTO RET1
DECFSZ AUX2,F
GOTO RET1
RETURN
;DISEO DE BARRAZ
END
SU AMIGABLE BESINO: ANGHEL PMQ

Anda mungkin juga menyukai