'UNIVERSIDAD EXPERIMENTAL POLITECNICA DE LA FUERZA ARMADA 'U.N.E.F.A. NUCLEO MARACAY. PROYECTO FINAL MICROCONTROLADORES 'INTEGRANTES: ' DIAZ LORETO, WILKING ' ROJAS, ELIZABETH 'UNEFA, INGENIERIA ELECTRÓNICA XI TÉRMINO, MICROPROCESADORES 'PORGRAMADOR HORARIO DE CARGAS '-------------------------------------- '------------------------------------------------------------------------------ 'VARIABLES '------------------------------------------------------------------------------ RELOJ VAR BYTE (8) ' ARREGLO CON INFORMACION DE LA HORA CADENA VAR BYTE (8) MER VAR BYTE ' MERIDIANO SEMANA VAR BYTE (3) ' ARREGLO PARA ALMACENAR EL DIA DE LA SEMANA CUENTA VAR BYTE PULSADOR VAR BYTE POSICION VAR BYTE DIA_SEMANA VAR BYTE CONTADOR VAR BYTE SUPERIOR VAR BYTE INFERIOR VAR BYTE DIRECCION VAR BYTE INTERVALO VAR BYTE MEMORIA VAR BYTE (4) CADENA_STRING VAR BYTE (16) HORAS VAR BYTE MINUTOS VAR BYTE MER_INI VAR BYTE MER_FIN VAR BYTE INDICE VAR BYTE MINUTOS_INICIALES VAR WORD MINUTOS_FINALES VAR WORD MINUTOS_ACTUALES VAR WORD MINUTOS_GEN VAR WORD MIN_GEN VAR BYTE HORA_GEN VAR BYTE BIT_MERIDIANO VAR BIT BIT_RELE VAR BIT MANUAL VAR BIT '------------------------------------------------------------------------------ 'CONSTANTES '------------------------------------------------------------------------------ RTC_ID CON %11010000 ' Identificación del DS1307 dentro del bus I2C MEMID CON %10100001 'Id. de la memoria el 1 en LSB indica dir. de 15 bits SEG CON 0 ' POS. DENTRO DEL ARREGLO RTC DE LOS SEGUNDOS MINU CON 1 ' POS. DENTRO DEL ARREGLO RTC DE LOS MINUTOS HORA CON 2 ' POS. DENTRO DEL ARREGLO RTC DE LAS HORAS SEM CON 3 ' POS. DENTRO DEL ARREGLO RTC DEL DIA DE LA SEMANA DIA CON 4 ' POS. DENTRO DEL ARREGLO RTC DEL DÍA DEL MES MES CON 5 ' POS. DENTRO DEL ARREGLO RTC DEL MES ANO CON 6 ' POS. DENTRO DEL ARREGLO RTC DEL AÑO MENU CON 15 ENTER CON 14 ARRI CON 13 ABAJ CON 12 SDA CON 8 SCL CON 9 PIN_RELE CON P0 '------------------------------------------------------------------------------ 'PROGRAMA PRINCIPAL '------------------------------------------------------------------------------ CLEAR GOSUB INICIAR_LCD GOSUB PANTALLA_BIENVENIDA GOSUB INICIAR_DS1307 LOW PIN_RELE MANUAL=0 MAIN DO GOSUB LEER_DS1307 'GOSUB MANEJO_DE_RELE GOSUB CHEQUEAR_CONSIGNA_MANUAL GOSUB COMPROBAR_DIA_DE_SEMANA GOSUB PANTALLA_INICIAL GOSUB LEER_PULSADOR IF PULSADOR = MENU THEN GOSUB MENU_HORARIO ENDIF PULSADOR=0 WHILE 1 END '------------------------------------------------------------------------------ 'SUBRUTINAS '------------------------------------------------------------------------------ DISABLE INT_CONTROL: RESUME 'SUBRUTINAS DE LA PANTALLA LCD INICIAR_LCD: PAUSE 500 LCDWRITE P1\P3\P2,OUTB,[INITLCD1,INITLCD2,TWOLINE,CLEAR,HOME,SCR] RETURN PANTALLA_BIENVENIDA: LCDWRITE P1\P3\P2,OUTB, [INITLCD1,INITLCD2,TWOLINE,CLEAR,HOME,SCR] LCDWRITE P1\P3\P2, OUTB, [CLEAR,HOME,SCR," CONTROLADOR "] LCDWRITE P1\P3\P2, OUTB, [SCRRAM+$40," HORARIO "] PAUSE 2000 RETURN PANTALLA_INICIAL: LCDWRITE P1\P3\P2,OUTB,[INITLCD1,INITLCD2,TWOLINE,HOME,SCR] LCDWRITE P1\P3\P2, OUTB, [HOME,SCR,HEX RELOJ(HORA)\2,":",HEX RELOJ(MINU)\2,":",HEX RELOJ(SEG)\2," ",STR MER\1,"M ",STR SEMANA\3] LCDWRITE P1\P3\P2, OUTB, [SCRRAM+$40,HEX RELOJ(DIA)\2,"-",HEX RELOJ(MES)\2,"-",HEX RELOJ(ANO)\2," (1) MEN"] RETURN 'SUBRUTINAS DEL RELOJ DE TIEMPO REAL INICIAR_DS1307: HIGH SDA HIGH SCL PAUSE 100 I2CIN SDA,SCL,RTC_ID,0,[RELOJ (SEG)] I2COUT SDA,SCL,RTC_ID,0,[RELOJ (SEG)& $7F] RELOJ(7)=$90 I2COUT SDA,SCL,RTC_ID,7,[RELOJ(7)] RETURN LEER_DS1307: I2CIN SDA,SCL,RTC_ID,0,[STR RELOJ\7] MER="A" IF (RELOJ(2).BIT5) THEN MER="P" ENDIF RELOJ(2)=RELOJ(2)&$1F RETURN COMPROBAR_DIA_DE_SEMANA: IF RELOJ(SEM)=1 THEN SEMANA="DOM" ENDIF IF RELOJ(SEM)=2 THEN SEMANA="LUN" ENDIF IF RELOJ(SEM)=3 THEN SEMANA="MAR" ENDIF IF RELOJ(SEM)=4 THEN SEMANA="MIE" ENDIF IF RELOJ(SEM)=5 THEN SEMANA="JUE" ENDIF IF RELOJ(SEM)=6 THEN SEMANA="VIE" ENDIF IF RELOJ(SEM)=7 THEN SEMANA="SAB" ENDIF RETURN 'SUBRUTINAS DEL MENU LEER_PULSADOR: CUENTA=0 DO CUENTA=CUENTA+1 PAUSE 50 WHILE (IN15=0 AND CUENTA<>5) IF IN15=1 THEN PULSADOR = MENU ENDIF RETURN LEER_PULSADORES_MENU: DO PAUSE 50 WHILE (IN15=0 AND IN14=0 AND IN13=0 AND IN12=0) IF IN15=1 THEN PULSADOR = MENU PAUSE 500 ENDIF IF IN14=1 THEN PULSADOR = ENTER PAUSE 500 ENDIF IF IN13=1 THEN PULSADOR = ARRI PAUSE 100 ENDIF IF IN12=1 THEN PULSADOR = ABAJ PAUSE 100 ENDIF RETURN ACTUALIZAR_MENU: IF PULSADOR=ARRI THEN POSICION=POSICION+1 IF POSICION=4 THEN POSICION=1 ENDIF ENDIF IF PULSADOR=ABAJ THEN POSICION=POSICION-1 IF POSICION=0 THEN POSICION=3 ENDIF ENDIF RETURN MENU_HORARIO POSICION=1 DO IF POSICION=1 THEN LCDWRITE P1\P3\P2,OUTB,[INITLCD1,INITLCD2,TWOLINE,CLEAR,HOME,SCR] LCDWRITE P1\P3\P2,OUTB,[CLEAR,HOME,SCR,"(1) SALIDA 1"] ENDIF IF POSICION=2 THEN LCDWRITE P1\P3\P2,OUTB,[INITLCD1,INITLCD2,TWOLINE,CLEAR,HOME,SCR] LCDWRITE P1\P3\P2,OUTB,[CLEAR,HOME,SCR,"(2) AUTOM/MANUAL"] ENDIF IF POSICION=3 THEN LCDWRITE P1\P3\P2,OUTB,[INITLCD1,INITLCD2,TWOLINE,CLEAR,HOME,SCR] LCDWRITE P1\P3\P2,OUTB,[CLEAR,HOME,SCR,"(3) CONFIG. RELOJ"] ENDIF GOSUB LEER_PULSADORES_MENU GOSUB ACTUALIZAR_MENU GOSUB SUB_MENU_HORARIO WHILE PULSADOR<>MENU RETURN SUB_MENU_HORARIO: IF PULSADOR=ENTER THEN IF POSICION = 1 THEN GOSUB CONTROL_SALIDA ENDIF IF POSICION = 2 THEN GOSUB AUTOMATICO_MANUAL ENDIF IF POSICION = 3 THEN GOSUB CAMBIAR_HORA ENDIF ENDIF RETURN ACTUALIZAR_CONTADOR: IF PULSADOR=ARRI THEN CONTADOR=CONTADOR+1 IF CONTADOR=SUPERIOR THEN CONTADOR=INFERIOR+1 ENDIF ENDIF IF PULSADOR=ABAJ THEN CONTADOR=CONTADOR-1 IF CONTADOR=INFERIOR THEN CONTADOR=SUPERIOR-1 ENDIF ENDIF RETURN PANTALLA_HORA: LCDWRITE P1\P3\P2,OUTB, [INITLCD1,INITLCD2,TWOLINE,CLEAR,HOME,SCR] LCDWRITE P1\P3\P2,OUTB, [HOME,SCR,STR CADENA_STRING\16] LCDWRITE P1\P3\P2, OUTB,[SCRRAM+$40," ",DEC HORAS\2,":",DEC MINUTOS\2," ",STR MER\1,"M"] RETURN MODIFICAR_HORA: IF PULSADOR=MENU THEN IF MER="A" THEN MER="P" ELSE MER="A" ENDIF ENDIF IF PULSADOR=ARRI THEN HORAS=HORAS+1 IF HORAS=13 THEN HORAS=1 ENDIF ENDIF IF PULSADOR=ABAJ THEN MINUTOS=MINUTOS+1 IF MINUTOS=60 THEN MINUTOS=0 ENDIF ENDIF RETURN CONTROL_SALIDA: LCDWRITE P1\P3\P2,OUTB, [INITLCD1,INITLCD2,TWOLINE,CLEAR,HOME,SCR] RELOJ(SEM)=1 SEMANA="DOM" SUPERIOR=8 INFERIOR=0 DO LCDWRITE P1\P3\P2,OUTB, [HOME,SCR," DIA DE SEMANA "] LCDWRITE P1\P3\P2, OUTB,[SCRRAM+$40," ",STR SEMANA\3] GOSUB LEER_PULSADORES_MENU CONTADOR=RELOJ(SEM) GOSUB ACTUALIZAR_CONTADOR RELOJ(SEM)=CONTADOR GOSUB COMPROBAR_DIA_DE_SEMANA WHILE PULSADOR <> ENTER INTERVALO=1 SUPERIOR=5 INFERIOR=0 LCDWRITE P1\P3\P2,OUTB, [INITLCD1,INITLCD2,TWOLINE,CLEAR,HOME,SCR] DO LCDWRITE P1\P3\P2,OUTB, [HOME,SCR," INTERVALO "] LCDWRITE P1\P3\P2, OUTB,[SCRRAM+$40," ",DEC INTERVALO\2] GOSUB LEER_PULSADORES_MENU CONTADOR=INTERVALO GOSUB ACTUALIZAR_CONTADOR INTERVALO=CONTADOR WHILE PULSADOR <> ENTER DIRECCION=(RELOJ(SEM)-1)*16+(INTERVALO-1)*4 I2CIN SDA,SCL,MemID,DIRECCION,[STR MEMORIA\2] DIRECCION=DIRECCION+2 I2CIN SDA,SCL,MemID,DIRECCION,[STR CADENA\2] IF MEMORIA(0).BIT5=1 THEN MER_INI="P" ELSE MER_INI="A" ENDIF IF CADENA(0).BIT5=1 THEN MER_FIN="P" ELSE MER_FIN="A" ENDIF MEMORIA(0)=MEMORIA(0) & $1F CADENA(0)=CADENA(0) & $1F CADENA_STRING=" HORA INICIAL " HORAS=MEMORIA(0) MINUTOS=MEMORIA(1) MER=MER_INI DO GOSUB PANTALLA_HORA GOSUB LEER_PULSADORES_MENU GOSUB MODIFICAR_HORA WHILE PULSADOR<> ENTER MEMORIA(0)=HORAS MEMORIA(1)=MINUTOS MER_INI=MER CADENA_STRING=" HORA FINAL " HORAS=CADENA(0) MINUTOS=CADENA(1) MER=MER_FIN DO GOSUB PANTALLA_HORA GOSUB LEER_PULSADORES_MENU GOSUB MODIFICAR_HORA WHILE PULSADOR<> ENTER CADENA(0)=HORAS CADENA(1)=MINUTOS MER_FIN=MER IF MER_INI="P" THEN MEMORIA(0).BIT5=1 ELSE MEMORIA(0).BIT5=0 ENDIF IF MER_FIN="P" THEN CADENA(0).BIT5=1 ELSE CADENA(0).BIT5=0 ENDIF I2COUT SDA,SCL,MemID,DIRECCION, [CADENA(0),CADENA(1)] PAUSE 500 DIRECCION=DIRECCION-2 I2COUT SDA,SCL,MemID,DIRECCION,[MEMORIA(0),MEMORIA(1)] PAUSE 500 RETURN CAMBIAR_HORA: GOSUB LEER_DS1307 CADENA(0)= BCD2BIN RELOJ(0) CADENA(1)= BCD2BIN RELOJ(1) CADENA(2)= BCD2BIN RELOJ(2) CADENA(3)= BCD2BIN RELOJ(3) CADENA(4)= BCD2BIN RELOJ(4) CADENA(5)= BCD2BIN RELOJ(5) CADENA(6)= BCD2BIN RELOJ(6) CADENA_STRING=" YEAR " SUPERIOR=100 INFERIOR=05 CONTADOR=CADENA(ANO) DO GOSUB PANTALLA_GENERAL GOSUB LEER_PULSADORES_MENU GOSUB ACTUALIZAR_CONTADOR WHILE PULSADOR<>ENTER CADENA(ANO)=CONTADOR CADENA_STRING=" MES " SUPERIOR=13 INFERIOR=0 CONTADOR=CADENA(MES) DO GOSUB PANTALLA_GENERAL GOSUB LEER_PULSADORES_MENU GOSUB ACTUALIZAR_CONTADOR WHILE PULSADOR<>ENTER CADENA(MES)=CONTADOR CADENA_STRING=" DIA DE MES " CONTADOR=CADENA(DIA) SUPERIOR=32 INFERIOR=0 DO GOSUB PANTALLA_GENERAL GOSUB LEER_PULSADORES_MENU GOSUB ACTUALIZAR_CONTADOR WHILE PULSADOR<>ENTER CADENA(DIA)=CONTADOR CADENA_STRING=" DIA DE SEMANA " CONTADOR=CADENA(SEM) SUPERIOR=8 INFERIOR=0 DO GOSUB PANTALLA_GENERAL GOSUB LEER_PULSADORES_MENU GOSUB ACTUALIZAR_CONTADOR WHILE PULSADOR<>ENTER CADENA(SEM)=CONTADOR HORAS=RELOJ(HORA) MINUTOS=CADENA(MINU) DO GOSUB PANTALLA_HORA GOSUB LEER_PULSADORES_MENU GOSUB MODIFICAR_HORA WHILE PULSADOR<>ENTER RELOJ(SEG)= 0 RELOJ(MINU)= BIN2BCD MINUTOS RELOJ(HORA)= BIN2BCD HORAS RELOJ(SEM)= BIN2BCD CADENA(SEM) RELOJ(DIA)= BIN2BCD CADENA(DIA) RELOJ(MES)= BIN2BCD CADENA(MES) RELOJ(ANO)= BIN2BCD CADENA(ANO) RELOJ(HORA)= RELOJ(HORA) | $40 IF MER="P" THEN RELOJ(HORA)= RELOJ(HORA) | $60 ENDIF FOR INDICE=0 TO 2 I2COUT SDA,SCL,RTC_ID,0,[STR RELOJ\7] PAUSE 200 NEXT RETURN PANTALLA_GENERAL: LCDWRITE P1\P3\P2,OUTB,[INITLCD1,INITLCD2,TWOLINE,CLEAR,HOME,SCR] LCDWRITE P1\P3\P2,OUTB,[HOME,SCR,STR CADENA_STRING\16] LCDWRITE P1\P3\P2, OUTB, [SCRRAM+$40," ",DEC CONTADOR\2] RETURN MANEJO_DE_RELE: INTERVALO=1 DO DIRECCION=(RELOJ(SEM)-1)*16+(INTERVALO-1)*4 I2CIN SDA,SCL,MEMID,DIRECCION,[STR MEMORIA\4] BIT_MERIDIANO=MEMORIA(0).BIT5 HORA_GEN=MEMORIA(0)&$1F MIN_GEN=MEMORIA(1) GOSUB CALCULAR_MINUTOS MINUTOS_INICIALES=MINUTOS_GEN BIT_MERIDIANO=MEMORIA(2).BIT5 HORA_GEN=MEMORIA(2)&$1F MIN_GEN=MEMORIA(3) GOSUB CALCULAR_MINUTOS MINUTOS_FINALES=MINUTOS_GEN BIT_MERIDIANO=0 IF MER="P" THEN BIT_MERIDIANO=1 ENDIF HORA_GEN= BCD2BIN RELOJ(HORA) MIN_GEN= BCD2BIN RELOJ(MINU) GOSUB CALCULAR_MINUTOS IF MINUTOS_ACTUALES<>MINUTOS_INICIALES THEN MINUTOS_ACTUALES=MINUTOS_GEN IF MINUTOS_ACTUALES>=MINUTOS_INICIALES AND MINUTOS_ACTUALES<=MINUTOS_FINALES THEN BIT_RELE=1 IF (MINUTOS_ACTUALES = MINUTOS_FINALES) THEN BIT_RELE=0 ENDIF ENDIF ENDIF INTERVALO=INTERVALO+1 WHILE BIT_RELE<>1 AND INTERVALO<5 IF BIT_RELE=1 THEN HIGH PIN_RELE ELSE LOW PIN_RELE ENDIF RETURN CALCULAR_MINUTOS: GOSUB CORRECTOR_HORA MINUTOS_GEN=MIN_GEN + HORA_GEN*60 IF (BIT_MERIDIANO) THEN GOSUB CORRECTOR_HORA MINUTOS_GEN=MIN_GEN + HORA_GEN*60 + 720 '720 SON LAS PRIMERAS 12 HORAS EN MINUTOS ENDIF RETURN CORRECTOR_HORA: IF HORA_GEN=12 THEN HORA_GEN=0 ENDIF RETURN AUTOMATICO_MANUAL: LCDWRITE P1\P3\P2,OUTB,[INITLCD1,INITLCD2,TWOLINE,CLEAR,HOME,SCR] DO IF MANUAL=0 THEN CADENA_STRING="AUTOMATICO" LCDWRITE P1\P3\P2, OUTB, [CLEAR,HOME,SCR,"MODO=", STR CADENA_STRING\10] ELSE CADENA_STRING="MANUAL" LCDWRITE P1\P3\P2, OUTB, [CLEAR,HOME,SCR,"MODO=", STR CADENA_STRING\6] ENDIF GOSUB LEER_PULSADORES_MENU IF PULSADOR = ARRI THEN MANUAL=1 ENDIF IF PULSADOR = ABAJ THEN MANUAL=0 ENDIF WHILE PULSADOR <> ENTER RETURN CHEQUEAR_CONSIGNA_MANUAL: IF MANUAL=0 AND IN11<>1 THEN GOSUB MANEJO_DE_RELE ENDIF IF MANUAL=1 OR IN11=1 THEN IF IN10=1 THEN HIGH PIN_RELE ELSE LOW PIN_RELE ENDIF ENDIF RETURN