Вот чего неожиданно получилось:
Подпрограмма задержки (паузы).
=============================================
pauz1 movlw .3 ;(1)записать в W-.3
movwf pau1 ;(1)переслать W-регистр pau1
pa1 decfsz pau1 ;(1-2)регистр pau1 минус 1,пропуск если pau1=0
goto pauz2 ;(1)
return ;(1)
pauz2 movlw .4 ;(1)записать в W-.3
movwf pau2 ;(1)переслать W-регистр pau2
pa2 decfsz pau2 ;(1-2)регистр pau2 минус 1,пропуск если pau2=0
goto pa2 ;(1)
goto pa1 ;(1)
Подпрограмма,разложенная по циклам (тактам).
==============================================
1 pauz1 movlw .3 ;(1)записать в W-.3
2 movwf pau1 ;(1) pau1=3
3 pa1 decfsz pau1 ;(1) pau1=pau1-1=2,пропуск если pau1=0
4 goto pauz2 ;(1)
5 pauz2 movlw .4 ;(1)записать в W-.4
6 movwf pau2 ;(1) pau2=4
7 pa2 decfsz pau2 ;(1) pau2=pau2-1=3,пропуск если pau1=0
8 goto pa2 ;(1)
9 pa2 decfsz pau2 ;(1) pau2=pau2-1=2,пропуск если pau1=0
10 goto pa2 ;(1)
11 pa2 decfsz pau2 ;(1) pau2=pau2-1=1,пропуск если pau1=0
12 goto pa2 ;(1)
13 pa2 decfsz pau2 ;(1) pau2=pau2-1=0,пропуск если pau1=0
14 nop ;(1)
15 goto pa1 ;(1)
16 pa1 decfsz pau1 ;(1) pau1=pau1-1=1,пропуск если pau1=0
17 goto pauz2 ;(1)
18 pauz2 movlw .4 ;(1)записать в W-.4
19 movwf pau2 ;(1) pau2=4
20 pa2 decfsz pau2 ;(1) pau2=pau2-1=3,пропуск если pau1=0
21 goto pa2 ;(1)
22 pa2 decfsz pau2 ;(1) pau2=pau2-1=2,пропуск если pau1=0
23 goto pa2 ;(1)
24 pa2 decfsz pau2 ;(1) pau2=pau2-1=1,пропуск если pau1=0
25 goto pa2 ;(1)
26 pa2 decfsz pau2 ;(1) pau2=pau2-1=0,пропуск если pau1=0
27 nop ;(1)
28 goto pa1 ;(1)
29 pa1 decfsz pau1 ;(1) pau1=pau1-1=0,пропуск если pau1=0
30 nop ;(1)
31 return ;(1)
формула расчёта задержки.
=========================================
A=число изначально записанное в регистр pau1,
B=число изначально записанное в регистр pau2,
((A-1)*((B*2)+5))+5=колличество тактов,
если обращение к этой подпрограмме выполняется командой call,
то необходимо прибавить ещё 2-такта,
которые съедает эта команда.
((3-1)*((4*2)+5))+5=31 и +2=33 такта,для PIC16F84 с тактовой частотой 4Мгц,
задержка составит 33 микросекунды.
Максимальная задержка,реализованная с помощью этой подпрограммы: 130815 микросекунд или 130,815 милисекунд.
Программа на QBASIC для ручного расчёта задержки
==========================================
10 CLS
15 PRINT "PIC16F84 Clock 4Mz": PRINT
20 INPUT "A=", a
30 INPUT "B=", b
40 PRINT "pauze="; ((a - 1) * ((b * 2) + 5)) + 5; "miksek,or "; (((a - 1) * ((b * 2) + 5)) + 5) / 1000; "milisek"
50 PRINT "pauze+call="; ((a - 1) * ((b * 2) + 5)) + 7; "miksek,or "; (((a - 1) * ((b * 2) + 5)) + 7) / 1000; "milisek"
60 PRINT : GOTO 20
Программа на QBASIC для автоматического расчёта задержки
==========================================
10 CLS
15 PRINT "PIC16F84 Clock 4Mz": PRINT
16 PRINT "*********************************************************"
17 PRINT
20 INPUT "pauze (miksek)=", p
21 PRINT "pauze+call (miksek)="; p + 2
30 FOR a = 0 TO 255
35 FOR b = 0 TO 255
40 l = ((a - 1) * ((b * 2) + 5)) + 5
45 IF l = p THEN GOTO 200
50 NEXT b
55 NEXT a
60 GOTO 1000
200 PRINT : PRINT "pauze:"
210 PRINT "A="; a
215 PRINT "B="; b
330 FOR c = 0 TO 255
335 FOR d = 0 TO 255
340 k = ((c - 1) * ((d * 2) + 5)) + 5
345 IF k = p + 2 THEN GOTO 400
350 NEXT d
355 NEXT c
360 GOTO 1000
400 PRINT : PRINT "pauze+call:"
410 PRINT "A="; c
415 PRINT "B="; d
500 GOTO 2000
1000 PRINT : PRINT "No variant!!!": GOTO 3000
2000 PRINT : PRINT "Ok!!!"
3000 PRINT : PRINT "*********************************************************"
3010 GOTO 17
Программы расчёта+программа+пояснения,можно скачать здесь: