Brociek Adrian
Zemsta Paweł
Grupa 21A
Sprawozdanie nr 6
8051 - przerwania, liczniki i timery
Kod programu:
PROG SEGMENT CODE ;definiuje segment nazwie PROG w klasie pamięci CODE
CSEG AT 0 ;kod programu będzie umieszczony w jego pamięci począwszy od adresu „0”
JMP reset ;skok do miejsca oznaczonego etykietą reset
CSEG AT 03h ;kod procedury będzie umieszczony w pamięci począwszy od adresu „03h”
LJMP INT0service;skok do procedury obsługi przerwania zewnętrznego INT0
CSEG AT 50h ;kod procedury będzie umieszczony w pamięci począwszy od adresu „50h”
LJMP INT1service;skok do procedury obsługi przerwania zewnętrznego INT1
CSEG AT 30h ;kod programu będzie umieszczony w jego pamięci począwszy od adresu „30h”
RSEG PROG ;rozpoczyna segment, od którego, znajdujący się poniżej kod zostanie umieszczony w pamięci programu
reset:
SETB EX0 ;włączenie przerwania INT0
SETB EA ;globalne odblokowanie przerwań
SETB EX1 ;włączenie przerwania INT0
SETB EA ;globalne odblokowanie przerwań
MOV P3, #0FFh ;odblokowanie wszystkich przerwań - przypisanie pod port P3 wartości FFh.
loop:
ACALL delay
CPL P2.7 ;następuje negacja 7 bitu w porcie 2
MOV P0,#00000110b ;przypisanie pod port P0 wartości 00000110b
ACALL delay ;bezwzględne wywołanie procedury przerwania delay
MOV P0,#1011011b ;przypisanie pod port P0 wartości 1011011b
ACALL delay ;bezwzględne wywołanie procedury przerwania delay
MOV P0,#1001111b ;przypisanie pod port P0 wartości 1001111b
ACALL delay ;bezwzględne wywołanie procedury przerwania delay
MOV P0,#1100110b ;przypisanie pod port P0 wartości 1100110b
ACALL delay ;bezwzględne wywołanie procedury przerwania delay
MOV P0,#1101101b ;przypisanie pod port P0 wartości 1101101b
ACALL delay ;bezwzględne wywołanie procedury przerwania delay
MOV P0,#1111101b ;przypisanie pod port P0 wartości 1111101b
ACALL delay ;bezwzględne wywołanie procedury przerwania delay
MOV P0,#01111111b ;przypisanie pod port P0 wartości 01111111b
ACALL delay ;bezwzględne wywołanie procedury przerwania delay
MOV P0,#01101111b ;przypisanie pod port P0 wartości 01101111b
ACALL delay ;bezwzględne wywołanie procedury przerwania delay
MOV P0,#00111111b ;przypisanie pod port P0 wartości 00111111b
SJMP loop ;bezwarunkowy skok pod adres etykiety loop
INT0service: ;procedura obsługi przerwania INT0
;PUSH ACC ;odłożenie zawartości akumulatora A na stos . Rejestr wskaźnika stosu SP zwiększył się o jeden.
;PUSH PSW ;i rejestru stanu
CPL P2.0 ;następuje negacja 0 bitu w porcie 2
MOV P0,#1110110b;przypisanie pod port P0 wartości 1110110b
;POP PSW ;odtwarzamy rejestry
;POP ACC ;pobieranie wartości ze stosu do akumulatora A . Nastąpiło zmniejszenie rejestru wskaźnika stosu SP o jeden.
RETI ;powrót z przerwania
INT1service: ;procedura obsługi przerwania INT1
;PUSH ACC ;odłożenie zawartości akumulatora A na stos . Rejestr wskaźnika stosu SP zwiększył się o jeden.
;PUSH PSW ;i rejestru stanu
CPL P2.0 ;następuje negacja 0 bitu w porcie 2
MOV P0,#0111000b;przypisanie pod port P0 wartości 0111000b
;POP PSW ;odtwarzamy rejestry
;POP ACC ;pobieranie wartości ze stosu do akumulatora A . Nastąpiło zmniejszenie rejestru wskaźnika stosu SP o jeden.
RETI ;powrót z przerwania
delay:
MOV R0,#255;przypisanie do rejestru R0 wartości 255
del2:
MOV R1,#255;przypisanie do rejestru R1 wartości 255
del1:
NOP ;wykonanie operacji pustej (wytracanie czasu)
NOP ;Wykonanie operacji pustej (wytracanie czasu)
DJNZ R1,del1 ;dekrementacja rejestru R1 i skok do del1, jeśli po dekrementacji wartość niezerowa.
DJNZ R0,del2 ;dekrementacja rejestru R0 i skok do del2, jeśli po dekrementacji wartość niezerowa.
RET ;powrót z procedury
END ;zakończenie wykonywania programu