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