Professional Documents
Culture Documents
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
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
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
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