Ktoś tu zaraz wstawi pewnie gotowy kod ale.
Napisałęś około wiec dokładność chyba nie gra roli. Zrobić tak aby tajmer przepełniał sie sam (config timerx timer, start timerx, enable timerx, enable interrupts). W procedurze obsługi tajmera (on timerx przerwanie_tajmerx, przerwanie_tajmerx:) zrób zwiększanie (if jakas_zmienna>0 then decr jakas_zmienna). Coś takiego samo będzie sobie odliczało jak tylko wartość bedzie wieksza od zera. Do tego potrzebujesz dwie pętle (jedna stan oczekiwania druga odliczanie). W momencie zależnym od ciebie wysyłasz program do drugiej pętli z wcześniejszym wpisaniem wartości do jakaś_zmienna. Druga petla ma sprawdzać czy jakaś_zmienna juz sie do zera odliczyła i do tego warunek cancel.
dim jakas_zmienna as word
config timer0 timer
on timer0 przerwanie_tajmer0
enable timer0
enable interrupts
petla_oczekiwanie:
if [warunek do startu odliczania] then goto petla_odliczanie_pc
goto petla_oczekiwanie
petla_odliczanie_pc:
jakas_zmienna=25313 'tyle mi wyszlo dla 1800 sekund i 11059200 i przy 65536 impulsach przepelnienia timer0
petla_odliczanie:
if jakas_zmienna=0 then goto petla_oczekiwanie
if [warunek do cancel'owania] then goto petla_oczekiwanie
goto petla_odliczanie
przerwanie_tajmer0:
if jakas_zmienna>0 then decr jakas_zmienna
return
Oczywiście to jest tylko jedna z możliwości zrobienia czegoś takiego. Nie ma optymalizacji prędkosci ani obliczeń.
W ASM schemat podobny ale trzeba będzie samemu sobie przygotowac odejmowanie 16 bitowe i warunki.