You are on page 1of 9

Proyecto.

asm Pgina 1

#include<80c552.h>
ORG 0X00
AJMP PROG_PRINCIPAL

ORG 0x00B
PUSH ACC
PUSH PSW
ACALL DETER_EVENTO
POP ACC
POP B
RETI

ORG 0x053
PUSH ACC
PUSH PSW
MOV ADCON,#00H
ACALL TRANS_TEMP
POP ACC
POP B
RETI

ORG 0X100
PROG_PRINCIPAL:
INICIALIZACION:

; MAQUINA_ESTADO_EVENTO
MOV R2,#00
; ESTADO
MOV R4,#01
; EVENTO

; DETERMINAR EVENTO
MOV R5,#00
; CONT_10MS
MOV R6,#00
; CONT_1S
MOV R7,#00
; CONT_10S

MOV R3,#00
; TEMPERATURA

; HORA
MOV R0,#00
; HORA
MOV R1,#00
; MIN
MOV P3,#01H
MOV P1,#00H

MOV TCON,#10H
MOV TMOD,#01H
MOV TL0,#0E6H
MOV TH0,#0B1H

;INTERRUPCIONES
MOV IEN0,#11000010b

ACALL MAQ_ESTADOS

MAQ_ESTADOS:

MOV A,R2
Proyecto.asm Pgina 2

JZ ESTADO_0
JNZ ESTADO_1

ESTADO_0:
MOV PSW,#00H
; MOV R2,#00H
MOV A,R4
SUBB A,#04H
JZ FIN_ESTADO_0
MOV PSW,#00H
MOV A,R4
SUBB A,#03H
JZ IR_INCR_HORA_0
MOV PSW,#00H
MOV A,R4
SUBB A,#02H
JZ IR_PASAR_HORA_TEMP
MOV PSW,#00H
MOV A,R4
SUBB A,#01H
JZ IR_MOSTRAR_HORA
MOV PSW,#00H
MOV A,R4
JMP FIN_ESTADO_0

IR_INCR_HORA_0:
ACALL INCR_HORA
ACALL IR_PASAR_HORA_TEMP
IR_PASAR_HORA_TEMP:
ACALL PASAR_HORA_TEMP
ACALL ACT_TEMP
ACALL IR_MOSTRAR_HORA
IR_MOSTRAR_HORA:
ACALL MOSTRAR_HORA
; MOV R4,#00H
JMP FIN_ESTADO_0
FIN_ESTADO_0:
JMP MAQ_ESTADOS

ESTADO_1:
MOV PSW,#00H
; MOV R2,#01H
MOV A,R4
SUBB A,#04H
JZ IR_TRANS_TEMP
MOV PSW,#00H
MOV A,R4
SUBB A,#03H
JZ IR_INCR_HORA_1
MOV PSW,#00H
MOV A,R4
SUBB A,#02H
JZ IR_PASAR_TEMP_HORA
MOV PSW,#00H
MOV A,R4
SUBB A,#01H
JZ IR_MOSTRAR_TEMP
MOV PSW,#00H
MOV A,R4
JMP FIN_ESTADO_1

IR_TRANS_TEMP:
ACALL TRANS_TEMP
MOV R4,#00H
JMP FIN_ESTADO_1
IR_INCR_HORA_1:
ACALL INCR_HORA
ACALL IR_PASAR_TEMP_HORA
Proyecto.asm Pgina 3

IR_PASAR_TEMP_HORA:
ACALL PASAR_TEMP_HORA
ACALL IR_MOSTRAR_TEMP
IR_MOSTRAR_TEMP:
ACALL MOSTRAR_TEMP
; MOV R4,#00H
JMP FIN_ESTADO_1
FIN_ESTADO_1:
JMP MAQ_ESTADOS

DETER_EVENTO:
INC R5
MOV TH0,#0B1H
MOV TL0,#0E6H
MOV PSW,#00H
; INCREMENTAMOS EN 1 EL CONT_10MS
MOV A,R5
SUBB A,#64H
JZ PASADOS_10MS
JMP EVENTO_1
EVENTO_1:
MOV PSW,#00H
MOV R4,#01H
JMP FIN_DETER_EVENTO
PASADOS_10MS:
MOV PSW,#00H
INC R6
MOV R5,#00H
MOV PSW,#00H
MOV A,R6
SUBB A,#0AH
JNZ FIN_DETER_EVENTO
INC R7
MOV PSW,#00H
MOV R6,#00H
MOV A,R7
MOV PSW,#00H
SUBB A,#06H
MOV PSW,#00H
JNZ EVENTO_2
MOV R4,#03H
MOV PSW,#00H
MOV R7,#00H
JMP FIN_DETER_EVENTO
EVENTO_2:
MOV R4,#02H
JMP FIN_DETER_EVENTO
FIN_DETER_EVENTO:
RET

TRANS_TEMP:
MOV ADCON,#00H
MOV A,#01H
MOV R3,ADCH
MOV A,R3
MOV B,#32H
MUL AB

MOV 53H,B
MOV 54H,A
MOV PSW,#00H
SUBB A,#40H
JB PSW.7,TRUNCAR
MOV A,54H
MOV PSW,#00H
ADD A,#40H
JB PSW.7, SUMAR_UN_GRADO
MOV R3,B
Proyecto.asm Pgina 4

MOV A,#01H
MOV PSW,#00H
MOV C,ACC.0
MOV 20H.0,C

RETI
TRUNCAR:
MOV R3,B
MOV A,#01H
MOV C,ACC.1
MOV 20H.0,C
JMP FIN_TRANS_TEMP

SUMAR_UN_GRADO:
INC B
MOV R3,B
MOV A,#01h
MOV C,ACC.1
MOV 20H.0,C
JMP FIN_TRANS_TEMP

FIN_TRANS_TEMP:
RET

MOSTRAR_TEMP:
MOV PSW,#00H
; Muestra por los cuatro displays de 7 segmentos (D7S) la temper
atura
MOV A,P3
; Movemos a A P3. Es el Display Status
SUBB A,#08H
; Acondicionamos la siguiente condicion. Restamos a A 08h
JZ DISPLAY_ES_CUARTO
; Si A = 0 (Display Status = 8h ^ A-08H = A=0), es el 4 display. Pasar a subrut
ina correspondiente
JMP DISPLAY_NO_ES_CUARTO ; Si
no, Display no es 4o

DISPLAY_ES_CUARTO:
; Entra si es el cuarto. Llevar el display al 1
MOV A,#01H
; Movemos a A el valor para dar al D7S el Status 1. Pasa de iluminar al
cuarto a iluminar al primero
JMP AVANZAR_MOSTRAR_TEMPERATURA ; Te
rmina. Prosigue con Mostrar_Temperatura. Hay que saltarse Display_No_Es_Cuatro
DISPLAY_NO_ES_CUARTO: ; En
tra si el Display no es cuatro. Pasa al siguiente display
MOV A,P3
; Movemos el Display Status al Acumulador, pues qued corrompido anteriormente
INC A
; Aqu empieza el proceso de cambio del Display que detallamos e
n las siguientes lneas. La instruccion
MOVC A,@A+PC
; MOVC A,@A+PC, coge la instruccion que este a la distancia valor acumulador del
valor en ese momento
JMP AVANZAR_MOSTRAR_TEMPERATURA ; de
l PC. Como el valor del acumulador no es lineal (1h,2h,4h,8h), tenemos que ayudarnos
de alguna
DB 02H
; instruccion NOP (no hace nada) para que las instrucciones enca
jen con lo que queremos que devuelva MOVC
DB 04H
; El sentido de poner INC A justo antes de la instruccin MOVC e
striba en que la instruccion JMP AVANZAR_MOSTRAR_TEMPERATURA
NOP
; ocupa DOS posiciones (2 bytes) en la memoria, y en conclusin,
Proyecto.asm Pgina 5

PC aumenta en 2 cuando pase esa


DB 08H
; instruccin en vez de 1

AVANZAR_MOSTRAR_TEMPERATURA: ; Tras decid


ir si el display es o no es 4, prosigue con mostrar_temperatura
MOV P3,A
; Mueve el valor de A (Display Status) a P3
MOV A,R3
; Movemos la temperatura al acumulador.
MOV B,#64H
MOV PSW,#00H
; Preparamos B para la division.
DIV AB
; Dividimos. Sacaremos el valor entero de la temperatura
; MOV 52H,A
; Salvamos el valor de la temperatura en la posicin de memoria 52h. nec
esitamos el acumulador libre
MOV A,P3
MOV PSW,#00H
; Movemos al acumulador el Display Status
SUBB A,#01H
; Primera comparacion. Es 1?
JZ DISPLAY_1
; Si si (A-01H = 0) -> DISPLAY_1
MOV A,P3
MOV PSW,#00H
; Recuperamos el Display Status
SUBB A,#02H
; Segunda comparacin. Es 2?
JZ DISPLAY_2
; Si si (A-02H = 0) -> DISPLAY_2
MOV A,P3
MOV PSW,#00H
; Recuperamos el Display Status
SUBB A,#04H
; Tercera comparacin. Es 3?
JZ DISPLAY_3
MOV PSW,#00H
; Si si (A-04H = 0) -> DISPLAY_3
MOV A,P3
; Recuperamos el Display Status
SUBB A,#08H
; Cuarta comparacin. Es 4?
JZ DISPLAY_4
; Si si (A-08H = 0) -> DISPLAY_4

DISPLAY_1:
; En caso de que sea Display Status = 1, no hace nada. Est apagado.
RET
; Acaba la subrutina Mostrar_Temp
DISPLAY_2:
; En caso de que sea Display_2 Recuperamos la temperatura y si el decima
l es cero pasamos a Display_1 (no mostrar nada)
; MOV 52H,A
; GUARDAMOS dato (Decimal) de la temperatura
MOV A,B
MOV B,#0AH
DIV AB
SUBB A,#00H
; Si es cero no mostramos nada en este
JZ DISPLAY_1
; Salta a Display_1 para no mostrar nada
JMP MOSTRAR_DIG
; Si eso no ocurre, va a mostrar un digito
DISPLAY_3:
; En caso de que sea Display = 3 Ilumina las unidades de la temperatura
MOV A,B
; Mueve B (Parte entera) al acumulador
Proyecto.asm Pgina 6

MOV B,#0AH
; Mueve 10 a B para dividir. Queremos sacar solo las decenas en A
DIV AB
; Divide
SETB 21H.0
MOV A,B
JMP MOSTRAR_DIG
; Mostramos el digito que queremos (Con puntito)
DISPLAY_4:
; Display_4 ilumina el decimal de la temperatura
MOV C,20H.0
JC CON_DECIMAL
JNC SIN_DECIMAL
CON_DECIMAL:
MOV A,#05H
JMP MOSTRAR_DIG
SIN_DECIMAL:
MOV A,#00H
JMP MOSTRAR_DIG

MOSTRAR_HORA:
MOV PSW,#00H
; Muestra la hora y los minutos en pantalla (No de una vez)
MOV A,P3
; Cogemos el Display Status
SUBB A,#08H
; Si el Display_Status es 08 (DS = 3)
JZ DISPLAY_A_UNO
; Saltamos a DISPLAY_A_UNO

MOV PSW,#00H
MOV A,P3
; Si esto no ocurre tenemos que aumentar el display. Recuperamos el valor del Di
splay
INC A
; Aqu empieza el proceso de cambio del Display que detallamos e
n las siguientes lneas. La instruccion
MOVC A,@A+PC
; MOVC A,@A+PC, coge la instruccion que este a la distancia valor acumulador del
valor en ese momento
JMP AVANZAR_MOSTRAR_HORA ; de
l PC. Como el valor del acumulador no es lineal (1h,2h,4h,8h), tenemos que ayudarnos
de alguna
DB 02H
; instruccion NOP (no hace nada) para que las instrucciones enca
jen con lo que queremos que devuelva MOVC
DB 04H
; El sentido de poner INC A justo antes de la instruccin MOVC e
striba en que la instruccion JMP AVANZAR_MOSTRAR_TEMPERATURA
NOP
; ocupa DOS posiciones (2 bytes) en la memoria, y en conclusin,
PC aumenta en 2 cuando pase esa
DB 08H
; instruccin en vez de 1

AVANZAR_MOSTRAR_HORA: ; Co
ntinuamos con Mostrar_Hora
MOV P3,A
; Cogemos el nuevo valor de Display_Status y lo colocamos en su lugar
JMP COMPROBAR_SI_HORA ; Sa
ltamos a comprobar si tenemos que mostrar la hora o los minutos

DISPLAY_A_UNO:
; Entra si hay que poner display a 1
MOV P3,#01H
; Ponemos el display status a 1
JMP COMPROBAR_SI_HORA
Proyecto.asm Pgina 7

; Saltamos a comprobar si tenemos que mostrar la hora o los minutos

COMPROBAR_SI_HORA:
MOV PSW,#00H
; Comprueba si vamos a mostrar la hora o los minutos
MOV A,P3
; Movemos el Display Status a A
SUBB A,#01H
MOV PSW,#00H
; Restamos para comprobar si es el DS = 1
JZ ES_HORA
; Si es, A-01 = 00H, es Hora.
MOV A,P3
MOV PSW,#00H
; Si no es, recuperamos el valor de DS
SUBB A,#02H
; y miramos si es DS = 2
JZ ES_HORA
; Si es, A-02h = 00H, es Hora.
JMP SON_MINUTOS
; Si todavia no ha entrado en Es_Hora, es que mostraremos minutos.

ES_HORA:
; Mostramos hora. Cargamos el valor y pasamos a preparar la divisin
MOV A,R0
; R0 contiene la hora. R0 va al acumulador
JMP PREPARAR_NUMERO
; Saltamos a Preparar_Division

SON_MINUTOS:
; Mostramos minutos. Cargamos el valor y pasamos a preparar la divisin
MOV A,R1
; R1 contiene los minutos. R1 va al acumulador
JMP PREPARAR_NUMERO
; Saltamos a Preparar_Division

PREPARAR_NUMERO:
MOV PSW,#00H
; Divide el numero y lo guarda. Luego se pregunta si el DS es DS
=2 o DS=4
MOV B,#0AH
; Mueve a B el valor 0AH para luego dividirlo
DIV AB
; Dividimos
MOV 50H,A
; Guardamos las decenas
MOV 51H,B
; Guardamos las unidades
MOV A, P3
MOV PSW,#00H
; Metemos al acumulador el valor de DS
SUBB A,#01H
; Comprobamos si es DS = 1
JZ POSICION_PAR
; Si si (A-01H = 00h) entonces saltar a posicion par
MOV A, P3
MOV PSW,#00H
; Recuperamos el valor de DS en el acumulador
SUBB A,#04H
; Comprobamos si DS = 3
JZ POSICION_PAR
MOV PSW,#00H
; Si si (A-04H = 00h) entonces saltar a posicion par
MOV A,B
; Si no es par, movemos posicion de B (Unidades al acumulador)
JMP MOSTRAR_DIG
; Saltamos a Mostrar Digito

POSICION_PAR:
Proyecto.asm Pgina 8

; Si es posicion par entonces recuperar valor de las decenas y mostrar digito


MOV A,50H
; Recuperamos valor de las decenas
JMP MOSTRAR_DIG
; Mostramos digito

MOSTRAR_DIG:
; Muestra el digito en el display que corresponde
SELECCIONAR_DIG:
; Selecciona digito
ADD A,#02H
; Suma 2 al acumulador
MOVC A,@A+PC
; Coge el valor de DB que corresponde a A + 2 + PC
JMP SEG_H
; Cuando lo ha cogido salta a Seg_H. Se suma dos a A porque la instrucci
on JMP ocupa dos posiciones de memoria
DB 3FH
; 0
DB 06H
; 1
DB 5BH ; 2
DB 4FH
; 3
DB 66H
; 4
DB 6DH
; 5
DB 7DH
; 6
DB 07H
; 7
DB 7FH
; 8
DB 6FH
; 9

SEG_H:
; Comprueba si hay que iluminar el segmento h del D7S
MOV P1,A
; Mueve el contenido del acumulador a P1
MOV A,R2
; Mueve al acumulador el estado
SUBB A,#01H
; Comprobamos si el estado es igual a 1
JNZ FIN_MOSTRAR_DIG
; Si no (A-01H /= 00H) -> FIN_MOSTRAR_DIG
MOV A,P3
; Movemos el DS al acumulador
SUBB A,#04H
; Comparamos con 04H (DS = 2)
JNZ FIN_MOSTRAR_DIG
; Si no (A-04H /= 00H) -> FIN_MOSTRAR_DIG

;MOV A,P1
; Si si mover al acumulador
JNB 21H.0,FIN_MOSTRAR_DIG
MOV A,#01H
; Para poder poner el bit p1.7 a 1
MOV C, ACC.0
; Pone el carry a 1
MOV P1.7,C
; Cambia el valor del bit h a 1 (Lo trae del carry.

; MOV P1,A
CLR 21H.0

FIN_MOSTRAR_DIG:
; Fin mostrar_Dig
Proyecto.asm Pgina 9

RET
; Vuelve a la rutina de la que procede

ACT_TEMP:
MOV ADCON,#08H
RET

INCR_HORA:
MOV PSW,#00H
MOV A,R1
SUBB A,#3BH
JZ INCR_HORA_MINUTOS
MOV A,R1
INC A
MOV R1,A
JMP FIN_INCR_HORA
INCR_HORA_MINUTOS:
MOV PSW,#00H
MOV R1,#00H
MOV A,R0
SUBB A,#17H
JZ CERO_CERO
MOV A,R0
INC A
MOV R0,A
JMP FIN_INCR_HORA
CERO_CERO:
MOV PSW,#00H
MOV R1,#00H
MOV R0,#00H
JMP FIN_INCR_HORA

FIN_INCR_HORA:
RET

PASAR_HORA_TEMP:
MOV R2,#01H
MOV R4,#01H
RET

PASAR_TEMP_HORA:
MOV PSW,#00H
MOV R2,#00H
MOV R4,#01H
RET

END