-
1Assembly Code
ROA EQU 7FH ;es Reloj o es Alarma
USR EQU 50H ;Unidades de Segundos del Reloj
DSR EQU 51H ;Decenas de Segundos del Reloj
UMR EQU 52H ;Unidades de Minutos del Reloj
DMR EQU 53H ;Decenas de Minutos del Reloj
UHR EQU 54H ;Unidades de Horas del Reloj
DHR EQU 55H ;Decenas de Horas del Reloj
AIR EQU 56H ;Alarma es Igual al Reloj (0 <= AIR <= 4)
;Registros para guardar valores de alarma
USA EQU 57H ;Unidades de Segundos del Alarma
DSA EQU 58H ;Decenas de Segundos del Alarma
UMA EQU 59H ;Unidades de Minutos del Alarma
DMA EQU 5AH ;Decenas de Minutos del Alarma
UHA EQU 5BH ;Unidades de Horas del Alarma
DHA EQU 5CH ;Decenas de Horas del Alarma
;Para multiplexor se usa el valor 20h de la memoria
ORG 0000H
SJMP inicio
ORG 0003H ;VECTOR DE INTERRUPCIÓN EXTERNA 0
CPL ROA ;Cambio entre alarma y reloj
CPL P0.0
RETI
ORG 000BH ;Vector de interrupción Temp0
JMP INTT0
ORG 0013H ;Vector de interrupción Ext1
SETB INT1 ;Apaga la interrupción uno para evitar múltiples cambios de minutos
JMP INTEX1
ORG 0040H
INICIO: MOV TMOD, #00100010 B ;Inicia los dos temporizadores en modo 2, disparados por software y como temporizadores
MOV TH0, #-250 ;Recarga del temporizador de inicio (250us)
;Inicialización de registros y variables
SETB ROA ;INICIA EN MODO RELOJ
SETB TR0 ;ACTIVA EL TEMPORIZADOR 0
SETB IT1 ;INT EXTERNA 1
SETB IT0 ;INT EXTERNA 0
CLR A
MOV P1, #0FEH ;MANDA AL PUERTO 1 (MULTIPLEXOR) UN 11111110b
SETB P2.7 ;MANDA 5V AL BUZZER
;Inicia el reloj en 12:00:00
MOV R2, #5
MOV R3, #5
MOV R4, #6
MOV R5, #5
MOV R6, #23
NOP
MOV A, AIR
CLR A
MOV AIR, A
;Inicia el reloj en 12:00:00
MOV USR, #0
MOV DSR, #0
MOV UMR, #6
MOV DMR, #5
MOV UHR, #3
MOV DHR, #2
;TABLA DECODIFIDORA
; gfedcba
MOV 60H,#1000000B ;0
MOV 61H,#1111001B ;1
MOV 62H,#0100100B ;2
MOV 63H,#0110000B ;3
MOV 64H,#0011001B ;4
MOV 65H,#0010010B ;5
MOV 66H,#0000010B ;6
MOV 67H,#1111000B ;7
MOV 68H,#0000000B ;8
MOV 69H,#0011000B ;9
;Inicia la alarma en 18:00:00
MOV USA, #0
MOV DSA, #0
MOV UMA, #9
MOV DMA, #5
MOV UHA, #9
MOV DHA, #1
SETB P2.5
MOV 20h, #0FEH
MOV IP, #05H ;Da prioridad a las interrupciones externas
MOV IE, #87H ;Habilita interrupciones (EA, EX1, ET0, EX0)
JMP $
;Inicia el conteo
INTT0: INC R1
CJNE R1,#8,REGRESAR ;Mientras R1 != 8 regresa
ACALL MULT ;Si no, Manda a llamar al multiplexor
INC R2 ;Incrementa los segundos
ACALL COMP
MOV A, R1 ;MUEVE R1 AL ACUMULADOR *
CLR A ;Pone A n ceros
MOV R1, A ;Mueve A a R1
CJNE R2,#23,REGRESAR
INC R3
MOV R2, #1
CJNE R3,#20,REGRESAR ;CONTADOR DE 1 SEGUNDO
MOV AIR, #0 ;Reinicializa la variable del contador
ACALL DISP ;Subrutina para obtener el valor de cada display
ACALL ALARMA ;Subrutina para activar la alarma
MOV R3, #0
INC R4
CJNE R4,#60,REGRESAR ;CONTADOR DE 60 SEG O 1 MIN
MOV R4, #0
INC R5
SETB P0.1 ;Después de un minuto apaga por completo la alarma
; ACALL INTEX1
CJNE R5,#60,REGRESAR ;CONTADOR DE 60 MIN O 1 HORA
MOV R5, #0
INC R6
CJNE R6,#25,REGRESAR
MOV R6, #1
REGRESAR: RETI
;Subrutina para el multiplexor
MULT: MOV A, 20h
RL A ;Mueve el bit en 0 a la derecha
MOV 20h, A
MOV P1, 20h ;Envia el valor de 20h al puerto 1
JNB 00h, MUS ;Muestra Unidades de Segundos
JNB 01h, MDS ;Muestra Decenas de Segundos
JNB 02h, MUM ;Muestra Unidades de Minutos
JNB 03h, MSM ;Muestra Decenas de Minutos
JNB 04h, MUH ;Muestra Unidades de Horas
JNB 05h, MDH ;Muestra Decenas de Horas
EPRT: RET
;ROA = 0 -> alarma, ROA =1 -> reloj
MUS: JNB ROA, MSUA ;Mostrar Segundos Unidades Alarma
MOV A, USR
JMP PRINT
MSUA: MOV A, USA
JMP PRINT
MDS: JNB ROA, MSDA ;Mostrar Segundos Decenas Alarma
MOV A, DSR
JMP PRINT
MSDA: MOV A, DSA
JMP PRINT
MUM: JNB ROA, MMUA ;Mostrar Minutos Unidades Alarma
MOV A, UMR
JMP PRINT
MMUA: MOV A, UMA
JMP PRINT
MSM: JNB ROA, MMDA ;Mostrar Minutos Decenas Alarma
MOV A, DMR
JMP PRINT
MMDA: MOV A, DMA
JMP PRINT
MUH: JNB ROA, MHUA ;Mostrar Horas Unidades Alarma
MOV A, UHR
JMP PRINT
MHUA: MOV A, UHA
JMP PRINT
MDH: JNB ROA, MHDA ;Mostrar Horas Decenas Alarma
MOV A, DHR
JMP PRINT
MHDA: MOV A, DHA
JMP PRINT
;Suma al valor del acomulador (Un número del uno al nueve) 60H, dirección
;donde se encuentran los segmentos de cada número
PRINT: ADD A, #60H ;Inicio de Tabla
MOV R0, A ;Mueve ese valor a R0
MOV P2, @R0 ;Mueve el contenido de R0 a P2
JMP EPRT
DISP: MOV A, R4 ;Mueve los segundos al acomulador
MOV B, #10
DIV AB ;Divide A entre B, como B es 10 convierte el numero de dos dígitos en
; un cociente de uno y un residuo de uno
MOV USR, B ;B es la parte Unidades de los segundos (Residuo)
MOV DSR, A ;A es la parte alta de los segundos (Cociente)
MOV A, R5 ;Mueve los minutos al acomulador
MOV B, #10
DIV AB ;Divide A entre B, como B es 10 convierte el número de dos dígitos en
; un cociente de uno y un residuo de uno
MOV UMR, B ;B es la parte baja de los minutos (Residuo)
MOV DMR, A ;A es la parte alta de los minutos (Cociente)
MOV A, R6 ;Mueve las horas al acomulador
MOV B, #10
DIV AB ;Divide A entre B, como B es 10 convierte el número de dos dígitos en
; un cociente de uno y un residuo de uno
MOV UHR, B ;B es la parte baja de las horas (Residuo)
MOV DHR, A ;A es la parte alta de las horas (Cociente)
RET
ALARMA: MOV A, UMA
CJNE A, UMR, UMAR ;Sí minutos es igual en alarma y reloj incrementa AIR
INC AIR
UMAR: MOV A, DMA
CJNE A, DMR, DMAR ;Sí minutos es igual en alarma y reloj incrementa AIR
INC AIR
DMAR: MOV A, UHA
CJNE A, UHR, UHAR ;Si horas es igual en alarma y reloj incrementa AIR
INC AIR
UHAR: MOV A, DHA
CJNE A, DHR, DHAR ;Si horas es igual en alarma y reloj incrementa AIR
INC AIR
DHAR: MOV A, AIR
CJNE A, #4, REG ;Si todas las comparaciones fueron correctas, AIR debe valer 4
CPL P0.1 ;Enciende el buzzer
;MOV A, DHR
;CJNE A, #2, REG
;MOV A, UHR
;CJNE A, #3, REG
;MOV A, DMR
;CJNE A, #5, REG
;MOV A, UMR
;CJNE A, #9, REG
;MOV A, DSR
;CJNE A, #5, REG
;MOV A, USR
;CJNE A, #9, CERO
;CALL INTEX1
REG: RET
INTEX1: JNB ROA, INTEX1A ;Si ROA es cero, cambia a una subrutina para aumentar la alarma
MOV A, R5
CJNE A, #59, INC0 ;Si los minutos NO son 59, llama a una subrutina para aumentarlos en 1
MOV R5, #0 ;Si son 59, los cambia a 0, e intenta aumentar horas
MOV A, R6
CJNE A, #23, INC1 ;Si las horas NO son 23, llama a una subrutina para aumentarlos en 1
;CJNE A, #24, INC1
MOV R6, #0 ;Si son 23 los vuelve 0
JMP REGR
INC0: ADD A, #1 ;Aumenta una minuto
;ADD A, #1
MOV R5, A
JMP REGR
INC1: MOV A, R6
ADD A, #1 ;Aumenta una hora
MOV R6, A
JMP REGR
INTEX1A: MOV A, UMA
CJNE A, #9, INC4 ;se sigue con el siguiente valor
MOV UMA, #0
MOV A, DMA
CJNE A, #5, INC5
MOV DMA, #0
NOP
MOV A, UHA
CJNE A, #9, INC6
MOV UHA, #0
MOV A, DHA
CJNE A, #2, INC7
MOV A, UHA
INC4: ADD A, #1 ;Incrementa UNIDADESvde los minutos
MOV UMA, A
JMP REGR
INC5: ADD A, #1 ;Incrementa DECENAS de los minutos
MOV DMA, A
JMP REGR
INC6: MOV A, DHA
CJNE A, #2, INC8 ;Cambio para las 24 hrs
MOV A, UHA
CJNE A, #3, INC8
MOV DHA, #0
MOV UHA, #0
JMP REGR
INC7: MOV A, DHA ;Incrementa las unidades de horas
ADD A, #1
MOV DHA, A
JMP REGR
INC8: MOV A, UHA ;Incrementa las decenas de horas
ADD A, #1
MOV UHA, A
REGR: RETI
CERO:
MOV DHR,#2
MOV UHR,#3
MOV DMR,#5
MOV UMR,#9
MOV DSR,#5
MOV USR,#9
MOV R6, #0
RETI
COMP: CJNE R6,#24,NADA
JMP CERO
RETI
NADA: RETI
END
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.