Reloj digital, es correcto?

#1
Estaba con la idea de simular en proteus un reloj digital con un display lcd y programado desde pic basic pro. Buscando en la web encontre el que les adjunto, el tema es que el codigo ejecuta un monton de IF/ENDIF y luego de todo esto hace una pausa de 1000 milisegundos (1 segundo) antes de volver a ejecutar el bucle principal nuevamente.

Mi duda es: es esta la forma correcta de hacerlo? No se produce retraso por la demora que se tiene en ejecutar todo el bucle principal? Porque me imagino que ademas del segundo de espera se debe ir sumando el tiempo que tarda en recorrer todo el bucle y se debe juntar mucho error.

En caso de que no sea la forma correcta necesitaria que me orienten sobre como manejar el tiempo minimizando el error.

PHP:
'%%%%%%%%%%%%%%%%%%%%%%%%%%%% MICROCONTROLADORES PIC %%%%%%%%%%%%%%%%%%%%%%%%%%%%%

'AUTOR : BRYAM HUAMANCHUMO BACA
'LABORATORIO # 08d : RELOJ DIGITAL PROGRAMABLE

DEFINE LCD_DREG  PORTD
DEFINE LCD_DBIT  0
DEFINE LCD_RSREG PORTE
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG  PORTE
DEFINE LCD_EBIT 1

ADCON1 = %0000010

TRISD = 0

X VAR BYTE
Y VAR BYTE
Z VAR BYTE
D VAR BYTE
F VAR BYTE
M VAR BYTE
A VAR WORD

Minutos VAR PORTB.0
Hora VAR PORTB.1
Dia VAR PORTB.2
Fecha VAR PORTB.3
Mes VAR PORTB.4
Anio VAR PORTB.5

TRISB.0 = 1
TRISB.1 = 1
TRISB.2 = 1

X = 0
Y = 0
Z = 0
D = 0

Inicio:

For A = 2000 TO 2050         'Año

For M = 0 TO 11              'Mes         

For F = 1 TO 31              'Numero de dias de Mes               
  
For X = 0 TO 23              'Hora

 D = D + 1                   'Día 
 
 IF D = 7 Then
             
    D = 0
             
 EndIF 
 
   For Y = 0 TO 59           'Minutos
        
      For Z = 0 TO 59        'Segundos
         
         IF Minutos = 1 Then
         
             Y = Y + 1 
             
             IF Y = 60 Then
             
             Y = 0
             
             EndIF  
         
         EndIF
         
         IF Hora = 1 Then
         
            X = X + 1
            
            IF X = 24 Then
             
             X = 0
             
            EndIF 
          
         EndIF
         
         IF Dia = 1 Then
         
            D = D + 1
            
            IF D = 7 Then
             
             D = 0
             
            EndIF 
          
         EndIF
         
         IF D = 0 Then
      
           IF X >= 0 AND X <= 11 Then 
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," AM/LUN "
  
           EndIF
            
           IF X > 11 AND X <= 23 Then
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," PM/LUN "
               
           EndIF
         
         EndIF
         
         IF D = 1 Then
      
           IF X >= 0 AND X <= 11 Then 
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," AM/MAR "
  
           EndIF
            
           IF X > 11 AND X <= 23 Then
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," PM/MAR "
               
           EndIF
         
         EndIF
       
         IF D = 2 Then
      
           IF X >= 0 AND X <= 11 Then 
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," AM/MIE "
  
           EndIF
            
           IF X > 11 AND X <= 23 Then
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," PM/MIE "
               
           EndIF
         
         EndIF
       
         IF D = 3 Then
      
           IF X >= 0 AND X <= 11 Then 
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," AM/JUE "
  
           EndIF
            
           IF X > 11 AND X <= 23 Then
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," PM/JUE "
               
           EndIF
         
         EndIF
         
         IF D = 4 Then
      
           IF X >= 0 AND X <= 11 Then 
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," AM/VIE "
  
           EndIF
            
           IF X > 11 AND X <= 23 Then
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," PM/VIE "
               
           EndIF
         
         EndIF
         
         IF D = 5 Then
      
           IF X >= 0 AND X <= 11 Then 
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," AM/SAB "
  
           EndIF
            
           IF X > 11 AND X <= 23 Then
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," PM/SAB "
               
           EndIF
         
         EndIF
         
         IF D = 6 Then
      
           IF X >= 0 AND X <= 11 Then 
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," AM/DOM "
  
           EndIF
            
           IF X > 11 AND X <= 23 Then
            
              LCDOut $FE,1," ",DEC2 X,":",DEC2 Y,":",DEC2 Z," PM/DOM "
               
           EndIF
         
         EndIF
         
         IF Fecha = 1 Then

              F = F + 1 
             
              IF F = 32 Then
             
              F = 1
             
              EndIF
   
         EndIF   
            
         IF Mes = 1 Then

              M = M + 1 
             
              IF M = 12 Then
             
              M = 0
             
              EndIF
   
         EndIF
        
         IF M = 0 AND F > 0 AND F <= 32 Then
         
            IF F = 32 Then
         
            F = 1
            
            EndIF
         
            LCDOut $FE,$C0," ",DEC2 F," ENE DEL ",DEC4 A
         
         EndIF 
         
         IF M = 1 AND F > 0 AND F <= 29 Then
         
            LCDOut $FE,$C0," ",DEC2 F," FEB DEL ",DEC4 A
         
            IF F = 29 Then
         
            F = 1
            
            M = 2 
              
            EndIF
           
         EndIF 
         
         IF M = 2 AND F > 0 AND F <= 32 Then
         
            IF F = 32 Then
         
            F = 1
            
            EndIF
         
            LCDOut $FE,$C0," ",DEC2 F," MAR DEL ",DEC4 A
   
         EndIF 
         
         IF M = 3 AND F > 0 AND F <= 31 Then
         
            IF F = 31 Then
         
            F = 1
            
            M = 4
            
            EndIF
         
            LCDOut $FE,$C0," ",DEC2 F," ABR DEL ",DEC4 A
         
         EndIF 
         
         IF M = 4 AND F > 0 AND F <= 32 Then
         
            IF F = 32 Then
         
            F = 1
            
            EndIF
         
            LCDOut $FE,$C0," ",DEC2 F," MAY DEL ",DEC4 A
      
         EndIF 
         
         IF M = 5 AND F > 0 AND F <= 31 Then
         
            IF F = 31 Then
         
            F = 1
            
            M = 6
            
            EndIF
         
            LCDOut $FE,$C0," ",DEC2 F," JUN DEL ",DEC4 A
         
         EndIF 
         
         IF M = 6 AND F > 0 AND F <= 32 Then
         
            IF F = 32 Then
         
            F = 1
            
            EndIF
         
            LCDOut $FE,$C0," ",DEC2 F," JUL DEL ",DEC4 A
        
         EndIF 
         
         IF M = 7 AND F > 0 AND F <= 32 Then
         
            IF F = 32 Then
         
            F = 1
            
            EndIF
         
            LCDOut $FE,$C0," ",DEC2 F," AGO DEL ",DEC4 A
        
         EndIF 
         
         IF M = 8 AND F > 0 AND F <= 31 Then
         
            IF F = 31 Then
         
            F = 1
            
            M = 9
            
            EndIF
         
            LCDOut $FE,$C0," ",DEC2 F," SET DEL ",DEC4 A
         
         EndIF 
         
         IF M = 9 AND F > 0 AND F <= 32 Then
         
            IF F = 32 Then
         
            F = 1
            
            EndIF
         
            LCDOut $FE,$C0," ",DEC2 F," OCT DEL ",DEC4 A
    
         EndIF
         
         IF M = 10 AND F > 0 AND F <= 31 Then
         
            IF F = 31 Then
         
            F = 1
            
            M = 11
            
            EndIF
         
            LCDOut $FE,$C0," ",DEC2 F," NOV DEL ",DEC4 A
         
         EndIF 
          
         IF M = 11 AND F > 0 AND F <= 32 Then
         
            IF F = 32 Then
         
            F = 1
            
            EndIF
         
            LCDOut $FE,$C0," ",DEC2 F," DIC DEL ",DEC4 A
     
         EndIF 
         
         IF Anio = 1 Then

              A = A + 1 
             
              IF A = 2051 Then
             
              A = 2000
             
              EndIF
   
         EndIF
                                 
         Pause 1000
 
      Next Z
          
   Next Y 
 
Next X

Next F

Next M

Next A
     
GoTo Inicio
 

Adjuntos

Última edición:

Temas similares

Arriba