hoe tijd laten doorlopen met een wachtlus voor ander deel?

Ik heb het volgende probleem:
op regel 1 heb ik de temperatuur staan (DS1820) deze wordt via een subroutine aangeroepen.
Op regel 2 heb ik de tijd staan die van een externe RTC bordje af komt. (ik heb een Easypic 5 bord van Microe met een externe RTC bord)
Ook dit gaat redelijk goed (mis nog de correcte uitlezing van de dag maand weekdag en jaar maar dat komt later nog wel)

Op regel 4 wil ik een tekst weergeven.
Alleen is de tekst te lang voor de regel. Ik wil geen scroll tekst maar de tekst moet om en om weergegeven worden.
dus eerst tekst 1 dan 1 sec wachten, dan 1 sec wachten tekst 2, dan weer 1 sec wachten tekst 3, dan weer 1 sec wachten en dan weer tekst 1, enzv.

Echter als ik dat doe met een delay dan loopt/stopt mn sec tijd steeds een paar sec. en dat is niet nou juist niet de bedoeling.

Hoe kan ik dat oplossen??

Code die ik nu heb:


DEVICE 18F452  
XTAL = 8            
CONFIG_START
   OSC = HS ; HS
   OSCS = OFF ; Disabled
   PWRT = ON ; Enabled
   BOR = ON ; Enabled
   BORV = 25 ; 2.5V
   WDT = OFF ; Disabled
   WDTPS = 128 ; 1:128
   CCP2MUX = ON ; Enable (RC1)
   STVR = ON ; Enabled
   LVP = OFF ; Disabled
   DEBUG = OFF ; Disabled
CONFIG_END

INCLUDE "GLCD_declare.inc"    ; hierin staan de pin configuratie van de GLCD 

ALL_DIGITAL = TRUE

;Variabele declareren
DIM Minuten         AS BYTE   ; Bevat de minuten
DIM Seconden        AS BYTE   ; Bevat de seconden 
DIM Uren            AS BYTE   ; Bevat de uren 
DIM dag             AS BYTE   ; bevat de dag
DIM maand           AS BYTE   ; bevat de maand
DIM jaar            AS BYTE   ; bevat de jaar
DIM weekdag         AS BYTE   ; bevat de weekdag 1 = maandag

;Logische constanten
SYMBOL AAN  = 0               ; Geinverteerd AAN
SYMBOL OFF_  = 0              ; UIT
SYMBOL ON_   = 1              ; AAN
SYMBOL UIT  = 1               ; Geinverteerd UIT

;Algemene constante
SYMBOL AntiDender   = 5       ;(mSec): Tijd voor ontdendering van toetsen

;EEPROM adresnamen 

;poortnamen
SYMBOL Toets1       = PORTA.0 ; Pulstoets zit op PORTC.7 aangesloten
SYMBOL Toets2       = PORTA.1 ; Pulstoets zit op PORTC.6 aangesloten
SYMBOL Led          = PORTE.0 ; Led zit op PORTE.0 aangesloten
SYMBOL Led2         = PORTE.1 ; Led zit op PORTE.0 aangesloten
SYMBOL Led3         = PORTE.2 ; Led zit op PORTE.0 aangesloten
DECLARE SCL_PIN     = PORTC.3 ; Serial Clock pin met PORTC.3 verbinden
DECLARE SDA_PIN     = PORTC.4 ; Serial Data  pin met PORTC.4 verbinden

;        76543210
PORTA = %00000000             ; Alle niveaus van PORTA eerst laag maken
;PORTC = %00000000            ; Alle niveaus van PORTC eerst laag maken
PORTE = %00000000             ; Alle niveaus van PORTE eerst laag maken
TRISA = %11111111             ; Alle PORTA poorten omschakelen als ingang
;TRISC = %11111111            ; Alle PORTC poorten omschakelen als ingang
TRISE = %00000000             ; Alle PORTE poorten omschakelen als uitgang

CLEAR                         ; Wis alle RAM geheugen
DELAYMS 500                   ; LCD stabilisering 

GOTO HoofdProgramma           ; Spring over de subroutine(s)

;Subroutine(s)
; nu subroutine's aanwezig
INCLUDE "DS1820.inc"          ; hierin staan de configuratie van de DS1820
HoofdProgramma:

CLS

BUSOUT %10100000, $00, [$00]  ; control/status 1, no test modes or POR override
BUSOUT %10100000, $01, [$00]  ; control/status 2, no alarm/timer flags or interrupts
;Schrijf (write) seconden, minuten, uren naar de PCF8583
BUSOUT %10100000, $02, [$30, $38, $14]
;Schrijf (write) dag, weekdag (maandag  = 1), maand, jaar naar de PCF8583
BUSOUT %10100000, $05, [$19, $04, $03, $09]
BUSOUT %10100000, $09, [$80]  ; disable minute alarm and reset to 00
BUSOUT %10100000, $0A, [$80]  ; disable hour alarm and reset to 00
BUSOUT %10100000, $0B, [$80]  ; disable day alarm and reset to 00
BUSOUT %10100000, $0C, [$80]  ; disable weekday alarm and reset to 00
BUSOUT %10100000, $0D, [$80]  ; set frequency out to 32768 Hz e.g. for tuning
BUSOUT %10100000, $0E, [$00]  ; timer switched off

WHILE 1 = 1
  BUSIN %10100000, $02, [Seconden, Minuten, Uren] ;Lees (read) tijd in vanuit de PCF8583
  BUSIN %10100000, $05, [dag, weekdag, maand, jaar] ;Lees (read) tijd in vanuit de PCF8583

  ;Zet de BCD waarden van de seconden, minuten en uren om in decimale waarden
  Seconden = ((Seconden >> 4) * 10) + (Seconden & 15)
  Minuten  = ((Minuten  >> 4) * 10) + (Minuten  & 15)
  Uren     = ((Uren     >> 4) * 10) + (Uren     & 15)
  dag      = ((dag      >> 4) * 10) + (dag      & 15)
  maand    = ((maand    >> 4) * 10) + (maand    & 15)
  jaar     = (jaar     >> 6) 
  weekdag  = (weekdag  >> 5)
  ;Plaats nu de decimale waarden (de tijd dus) op het display
  PRINT AT 1, 1, "Tijd: ", @Uren, ":", DEC2 Minuten, ":", DEC2 Seconden, " "
  ;PRINT AT 2, 1,  DEC2 weekdag, "  ", DEC2 dag,"  ", DEC2 maand,"  ", DEC2 jaar 
  
  GOSUB MeetTemperatuur       ; deze subroutine leest de temperatuur in
  ;Plaats nu de gemeten temperatuur op het display
  PRINT AT 0, 15, REP "-"\NegTemp, DEC Temp / 100, ".", DEC1 Temp / 10, 31, "C "
    
    PRINT AT 4,0, "dit is een test      "
    DELAYMS 1000
    PRINT AT 4,0, "om een RTC met tekst "
    DELAYMS 1000
    PRINT AT 4,0, "op het dispay te     "
    DELAYMS 1000
    PRINT AT 4,0, "zetten               "
    DELAYMS 1000
WEND                          ;Terug naar WHILE

INCLUDE "font2.inc"            ; hierin staat het fonttabel voor het display (aangepast tabel)

Probeer wat informatie te zoeken over 'PIC + timer' en 'timer interrupt' of iets dergelijks.

ik zou je wachtloop onderbrengen in het steeds
weer uitlezen van de klok
je kan tussendoor delays van ...zegmaar 200Ms
toepassen, en en teller meelaten lopen die je steeds verhoogd
tot de juiste wachttijd is bereikt.
dan teller op nul, regel vervangen, en weer dezelfde loop opvragen

Voor een LCD (en voor enorm veel andere zaken ook) is het erg handig om een timer interrupt te voorzien in je µC, waarin je een aantal vlaggen kunt zetten om de rest van je programma getimed te laten lopen.
Zo is het niet handig om je LCD constant te verversen, voorzie je in je interrupt dat er bijvoorbeeld 6 keer per seconde het vlagje "LCD_update" hoog wordt dan kan je dat gebruiken in je mainloop om het LCD van nieuwe (of dezelfde) tekst te voorzien. Op vergelijkbare manier kan je gaan timen, zet het vlagje "timer_1s" hoog in je mainloop en in de interrupt kan je netjes 1 seconde later dat weer laag maken (of andere vlag hoog, net wat jij handig vind), hiermee kan je mainloop op volle snelheid blijven lopen terwijl je toch dingen getimed kan doen lopen.
Voor heel tijdskritische dingen moet je uiteraard alle (of een deel van) de afhandeling in de interrupt doen, maar meestal is de interrupt als doorgeefluik voldoende.