Práce s podprogramy

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.

 

Zdroje
  • VESELÁ, Zuzana. Mikroprocesorová technika. Interní skriptum, VOŠ a SPŠE Olomouc. 2013
Doplňující učivo

Jako podprogram doporučujeme vytvořit svůj vlastní s různými prodlevami.