Využití logické instrukce rotace
Než začneme s dalším modulem, vrátíme se na chvíli k LED a ukážeme si využití logických instrukcí RR A, RL A a SWAP A. Zatím jsme program rotace (posun) LED vytvořili pouhým vypsáním dat na port. Program je možno velmi elegantně vyřešit pomocí instrukce rotace. Jedinou nevýhodou je, že nelze rotovat přímo portem, ale jen akumulátorem - hlavním registrem A. Pro stejný efekt použijeme rotaci doprava RR A.
MOV P1,#01111111B ; načtení prvních dat - rozsvícení 7. LED
CALL DEL100 ; zobrazení dat
MOV A,P1 ; přesun portu do akumulátoru
HUP: RR A ; rotace akumulátoru doprava
MOV P1,A ; výsledek rotace přesuň do portu P1
CALL DEL100 ; zobraz výsledek
JMP HUP ; opakuj stále dokola
Include (DELAY.inc)
END
Tento program rotuje stále dokola. My však již umíme počet rotací omezit.
MOV R1,#7 ; počet opakování rotací
MOV P1,#01111111B ; načtení prvních dat -rozsvícení 7.LED
CALL DEL100 ; zobrazení dat
MOV A,P1 ; přesun portu do akumulátoru
HUP: RR A ; rotace akumulátoru doprava
MOV P1,A ; výsledek rotace přesuň do portu P1
CALL DEL100 ; zobraz výsledek
DJNZ R1,HUP ; opakuj, dokud není R1 nulový
MOV P1,#11111111B ; zhasnutí všech LED
HAP: JMP HAP ; zacykli na místě
Include(DELAY.inc)
END
Pomocí podprogramů zrealizujme rotaci LED zleva doprava (od pozice 7. do pozice 0.) a následovně zprava doleva (od 0. pozice do 7. pozice).
Hlavní program:
CALL ROTR ; rotace zleva doprava
CALL ROTL ; rotace zprava doleva
S: JMP S
ROTR: MOV R1,#7 ; počet opakování rotací
MOV P1,#01111111B ; načtení prvních dat - rozsvícení 7.LED
CALL DEL100 ; zobrazení dat
MOV A,P1 ; přesun portu do akumulátoru
HUP: RR A ; rotace akumulátoru doprava
MOV P1,A ; výsledek rotace přesuň do portu P1
CALL DEL100 ; zobraz výsledek
DJNZ R1,HUP ; opakuj, dokud není R1 nulový
RET
ROTL: MOV R1,#7 ; počet opakování rotací
MOV A,P1 ; přesun portu do akumulátoru
HUP: RL A ; rotace akumulátoru doprava
MOV P1,A ; výsledek rotace přesuň do portu P1
CALL DEL100 ; zobraz výsledek
DJNZ R1,HUP ; opakuj, dokud není R1 nulový
RET
Include(DELAY.inc)
END
Pokud bychom chtěli rotaci opakovat stále dokola, přemístíme jen návěstí hlavního programu na první řádek.
S:CALL ROTR ; rotace zleva doprava
CALL ROTL ; rotace zprava doleva
JMP S
Umíme také omezit počet opakování celého hlavního programu.
Zajímavostí je instrukce SWAP A, která provede najednou 4 rotace.
Ve skutečnosti tato instrukce přehodí dolní polovinu bytu s horní polovinou bytu akumulátoru.
S touto instrukcí se dají naprogramovat pěkné efekty s LED.