It keeps running in the background. The interrupts will not wait for PBP statements to finish.
Ok fine, ... for many years I've resisted making a count down elapsed timer for humanitarian reasons. But if you guys are going to do it anyhow, I might as well make a new version of the Elapsed Timer. I can only hope that if somebody uses it for nefarious purposes, they end up blowing themselves up.
Here's the test circuit.
Here's the test program ...
' Define LCD connections DEFINE LCD_DREG PORTC ' Set LCD Data port DEFINE LCD_DBIT 4 ' Set starting Data bit (0 or 4) if 4-bit bus DEFINE LCD_RSREG PORTC ' Set LCD Register Select port DEFINE LCD_RSBIT 2 ' Set LCD Register Select bit DEFINE LCD_EREG PORTC ' Set LCD Enable port DEFINE LCD_EBIT 3 ' Set LCD Enable bit DEFINE LCD_BITS 4 ' Set LCD bus size (4 or 8 bits) DEFINE LCD_LINES 2 ' Set number of lines on LCD DEFINE LCD_COMMANDUS 2000 'Command delay time in us DEFINE LCD_DATAUS 50 'Data delay time in us DEFINE OSC 4 INCLUDE "Elapsed_DN.bas" ; Elapsed Timer Routines ZERO_LED VAR PORTB.3 ANSEL = 0 ' All Digital ANSELH = 0 LOW ZERO_LED ' start with LED OFF OPTION_REG.7 = 0 ' enable PORTB pull-ups PAUSE 250 LCDOUT $FE,1 ' Initialize LCD PAUSE 250 Days = 1 ' set initial time Hours = 1 Minutes = 3 Seconds = 10 GOSUB StartTimer ' Start the Elapsed Timer Main: CountDown = !PORTB.0 IF SecondsChanged = 1 THEN SecondsChanged = 0 LCDOUT $FE,2, DEC Days,"d-",DEC2 Hours,":",DEC2 Minutes,":",DEC2 Seconds ENDIF IF ZERO_LED != ZERO THEN ZERO_LED = ZERO GOTO Main
If the button on PORTB.0 is pressed it counts down. If it is not pressed, it counts up. The LED comes on when it reaches 0.
If you are using the countdown for a movie set, it has to stop at 1 second. Put this in the main loop.
IF (CountDown=1) AND (Days=0) AND (Hours=0) AND (Minutes=0) and (Seconds=1) _ THEN GOSUB StopTimer
You'll need the ASM_INTS include from the original Elapsed Demo.