Využití podprogramů
Program se stejnou funkcí teď bude vypadat takto (možné jsou dvě základní varianty,
výsledný efekt bude totožný a je na programátorovi, kterou variantu a kdy použije).
1. varianta - podprogram je "nainkludován" - vložen z jiného místa
ZAC: CALL SEG ; volání - realizace výpisu textu
JMP ZAC ; opakování dokola
INCLUDE (AHOJP.ASM); vložení procedury - podprogram ; realizující dané zadání
INCLUDE(DELAY.INC); načtení podprogramu časových prodlev
END; ukončení překladu
2. varianta - podprogram je vypsán pod hlavním programem
ZAC: CALL SEG ; volání - realizace výpisu textu
JMP ZAC ; opakování dokola
SEG: MOV P3,#10001000B ; rozsvícení písmena A
CALL DEL100 ; časová smyčka 100 ms
MOV P3,#10001001B ; rozsvícení písmena H
CALL DEL100
MOV P3,#11000000B ; rozsvícení písmena O
CALL DEL100
MOV P3,#11100000B; rozsvícení písmena J
CALL DEL100
RET ; návrat z podprogramu
INCLUDE(DELAY.INC); načtení podprogramu časových prodlev
END; ukončení překladu
V obou příkladech je z hlavního programu odskočeno do podprogramu návěstím SEG (instrukcí CALL) a po dosažení instrukce RET se program vrací do hlavního programu na další instrukci (v našem případě JMP ZAC).
Pokud chceme realizaci programu pouze jednou, bude v tomto případě program vypadat takto:
CALL SEG; volání - realizace výpisu textu
ZAC : JMP ZAC; opakování dokola
INCLUDE(AHOJP.ASM); vložení procedury - podprogramu
INCLUDE(DELAY.INC); vložení podprogramu časových smyček
END; ukončení překladu
Stejný program - výpis textu AHOJ - zopakujeme třeba 4x, počet opakování uložíme do registru R3
MOV R3, #4; počet opakování podprogramu
ZAC: CALL SEG; volání - realizace výpisu textu
DJNZ R3,ZAC; opakování dokud není registr R3 nula
SEM: JMP SEM ; zacyklení na místě - program se tedy zrealizuje jen 4x
INCLUDE(AHOJP.ASM)
INCLUDE(DELAY.INC)
END
Z tohoto programu můžeme dále vytvořit podprogram, který bude v sobě skrývat celé zadání - tedy 4x opakovat výpis textu a potom jej kombinovat s dalším podprogramem, viz dále. Název tohoto podprogramu bude třeba AH4.asm.
Hlavní program tedy vypadá takto:
CALL HOT
TU: JMP TU
HOT: MOV R3, #4 ; počet opakování podprogramu
ZAC: CALL SEG ; volání - realizace výpisu textu
DJNZ R3,ZAC ; opakování dokud není registr R3 nula
RET
INCLUDE(AH4.ASM)
INCLUDE(DELAY.INC)
END
Kombinace PODPROGRAMŮ – opakování
Vyzkoušejme si nyní nabyté vědomosti v praxi. Zrealizujme program, který na portu P1 3x rozsvítí a zhasne sudé LED a na portu P3 se 5 x rozsvítí číslo 1v intervalu třeba 200 ms. Vše realizujme pomocí 2 podprogramů a opakujme stále dokola. Ukážeme si obě dvě varianty:
Podprogram, realizující LED nazveme LED3. ASM a bude začínat návěstím TRIK.
Podprogram, realizující SEG nazveme SEG5. ASM a bude začínat návěstím PET.
Hlavní program
ZAC: CALL TRIK
CALLPET
JMP ZAC
Include(LED3.asm)
Include(SEG5.asm)
Include(DELAY.inc)
END
Tato varianta předpokládá, že podprogramy jsou uloženy pod předem určenými názvy.
Pozor na návěstí bloku opakování - nesmí být stejná (TU-TAM)
Celé zadání zopakovat třeba 2x a všechny LED a SEGMENTY rozsviť.
MOV R7, #2 ; počet opakování celého programu
TADY:CALL TRIK ; realizace 3 x LED
CALLPET ; realizace 5 x číslo 1
DJNZ R7,TADY ; opakuj, dokud není R7 nulový
ZAC: MOV P1,#000000000B; rozsviť všechny LED
MOV P3,#00000000B; rozsviť všechny SEGMENTY
JMP ZAC ; zajisti jejich rozsvícení
Include(LED3.asm)
Include(SEG5.asm)
Include(DELAY.inc)
END
Počet opakování celého programu nemůže mít stejný registr (R7) jako jednotlivé podprogramy (R1). Došlo by k přepisu. Registr by se vynuloval a při dalším odečtení 1 se nastaví na maximum, což je 255. Chybu poznáme podle toho, že se program opakuje dokola a neprovede se jen 2x.
Rozsvícení portů převedeme do dalšího podprogramu ROZSV.ASM s návěstím ROZ.
Bude to vypadat takto:
MOV R7, #2; počet opakování celého programu
TADY:CALL TRIK; realizace 3 x LED
CALLPET; realizace 5 x číslo 1
DJNZ R7,TADY; opakuj, dokud není R7 nulový
ZAC: CALL ROZ
JMP ZAC; zajisti jejich rozsvícení
; podprogram můžeme vepsat přímo
ROZ:MOV P1,#000000000B; rozsviť všechny LED
MOV P3,#00000000B; rozsviť všechny SEGMENTY
RET
Include(LED3.asm)
Include(SEG5.asm)
Include(DELAY.inc)
END
Úplně jednoduše by mohl tento program vypadat tak, že bychom z programu OPAK2 udělali podprogram .
A hlavní program realizující stejné zadání by vypadal takto:
CALL HLAV
START:JMP START
HLAV :MOV R7, #2; počet opakování celého programu
TADY: CALL TRIK; realizace 3x LED
CALLPET; realizace 5x číslo 1
DJNZ R7,TADY; opakuj, dokud není R7 nulový
ZAC : MOV P1,#000000000B; rozsviť všechny LED
MOV P3,#00000000B; rozsviť všechny SEGMENTY
RET; ukončení podprogramu
Include(LED3.asm)
Include(SEG5.asm)
Include(DELAY.inc)
END.