QB64.com

QB64 is a modern extended BASIC programming language that retains QBasic/QuickBASIC 4.5 compatibility and compiles native binaries for Windows, Linux, and macOS.

The TIMER function returns the number of seconds past the previous midnite down to an accuracy of 1/18th of a second.

QB Syntax

seconds! = TIMER

QB64 Syntax

seconds# = TIMER[(accuracy!)]

Example(s)

Delay SUB with a midnight correction for when TIMER returns to 0. QB64 can use _DELAY for delays down to .001.


DO
  PRINT "Hello";
  Delay .5  'accuracy down to .05 seconds or 1/18th of a second in QBasic
  PRINT "World!";
LOOP UNTIL INKEY$ = CHR$(27) 'escape key exit

END

SUB Delay (dlay!)
start! = TIMER
DO WHILE start! + dlay! >= TIMER
  IF start! > TIMER THEN start! = start! - 86400
LOOP
END SUB 

Explanation: When the delay time is added to the present TIMER value, it could be over the maximum number of 86399 seconds. So when TIMER becomes less than start it has reached midnight. The delay value then must be corrected by subtracting 86400.

Looping one TIMER tick of 1/18th of a second (ticks per second can be changed)


DEF SEG = 0 ' set to PEEK and POKE TIMER Ticks
DO ' main program loop
  ' program code
  POKE 1132, 0 ' zero Timer ticks
  DO ' delay loop
    x% = PEEK(1132)
    IF x% <> px% THEN PRINT x%;
    px% = x%
  LOOP UNTIL x% >= 18 '18 ticks in one second
  PRINT "code " ' program code
LOOP UNTIL INKEY$ = CHR$(27)
DEF SEG ' reset segment to default

END 


 0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18 code
 0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18 code
 0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18 code

Explanation: The POKE before the delay loop sets the tick count to 0. The PEEK count increases until the tick count returns 18 ticks and ends the loop. The same thing could be approximated by using a delay loop with: second! = TIMER + 1

Using a DOUBLE variable for TIMER(.001) millisecond accuracy in QB64 throughout the day.


 ts! = TIMER(.001)     'single variable
 td# = TIMER(.001)     'double variable

 PRINT "Single ="; ts!
 PRINT "Double ="; td# 


 Single = 77073.09
 Double = 77073.094 

Explanation: SINGLE variables will cut off the millisecond accuracy returned so DOUBLE variables should be used. TIMER values will also exceed INTEGER limits. When displaying TIMER values, use LONG for seconds and DOUBLE for milliseconds.

See Also