Листинг программ.
Code.asm
$mod52
ORG 0h ; Начальный адрес программы (если нет прерываний)
JMP MAIN
ORG 0003h
JMP INTRO
ORG 000Bh
JMP DIVIDER
MAIN:
MOV P1, #0
MOV IE, #10000011b ; T/C0 по TF0 (переполнение) + INT0
MOV TL0, #0h ; обнуляем счетчик
MOV TH0, #0FFh ; то, что будет загружаться в TL0 при перезаполнении
MOV TMOD, #00000001b ; здесь происходит установка режима таймера
MOV TCON, #00010001b ; запуск таймера (4-й бит слева TCON.4 за это отвечает) + прерывание INT0 (последний бит TCON.0 за это отвечает)
; записываем в порт значения единицы в крайнем левом положении
; это будет эквивалетнтно четырём подряд идущим галочкам
MOV P1, #0F0h ; #11110000b = #0F0h
MOV 31h, #0F0h ; #11110000b = #0F0h
MOV A, #7 ; Имитация, что в аккумуляторе записано что-то (раздел "Acc" в окне "SFR")
LOOP:
JMP LOOP
Intro: ; обработка прерывания int0, происходящая по сигналу 0003h
MOV P1, #055h ; здесь происходит вывод решётки в порт
RETI
DIVIDER: ; обработка прерывания TF0, происходящая по сигналу 000Bh
PUSH ACC ; сохраняем значение аккумулятора
CLR TR0 ; остановка таймера
MOV A, 31h ; сдвиг вправо 4-х галочек
RR A ; сдвиг вправо 4-х галочек: здесь происходит битовый сдвиг вправо (RR -- операция битового сдвига)
MOV 31h, A ; сдвиг вправо 4-х галочек
MOV P1, A ; сдвиг вправо 4-х галочек: здесь происходит вывод решётки в порт
MOV TL0, #0h ; обнуляем счётчик
MOV TH0, #0FFh ; то, что будет загружаться в TL0 при перезаполнении
SETB TR0 ; восстанавливаем работу таймера
POP ACC ; восстанавливаем значение аккумулятора до обработки прерывания
RETI
END
Результат работы.
Рисунок 16. Инициализация 01
Рисунок 17. 02 - 0fh
Рисунок 18. 03 - 0fh
Рисунок 19. 04 - 0fh
Рисунок 20. 05 - 0fh
Рисунок 21. 06 - 055h grid dle
Рисунок 21. 07 - 0fh
Вывод
В ходе выполнения лабораторной работы были изучены режимы обработки запросов прерываний с различными приоритетами. Изначально сигналу INT0 присваивался высший приоритет, а сигналу прерывания TF0 от T/C0 – низший, что позволяло прерывать обработчик прерывания от сигнала TF0. Затем мы убедились, что программа, запускаемая от таймера/счетчика 0, не прерывается, если назначить сигналу INT0 приоритет, равный или меньше приоритета сигнала прерывания TF0 от T/C0.