;Схема и задача остаётся прежняя.В этом листенге будем использовать прерывание.Процессор в такой программе практически не чего не делает,а счёт осуществляет встроенный Таймер1 и сравнивает значение со специальным регистром сравнения.При совпадении значений осуществляется переход в подпрограмму обслуживания прерывания.Где прцессор производит нужные переключения битов,затем выходит из этой подпрограммы и опять не чего не делает.
.include "tn2313def.inc"
.list
.def temp=r16
.def rab=r17
.equ kdel=50
.dseg ;Выбираем сегмент SRAM
.org 0x60 ;Устанавливаем текущий адрес сегмента
buf: .byte 1 ;Один байт для хранения рабочего значения
.cseg ;Выбор сегмента программного кода
.org 0 ;Установка текущего адреса на ноль
;---------------Переопределение векторов прерывания 19шт.-----------------
start: rjmp init ;Переход на начало программы.Прерывание по сбросу
reti ;Внешнее прерывание 0
reti ;Внешнее прерывание 1
reti ;Таймер/счётчик 1,захват
rjmp prtim1 ;Таймер/счётчик 1,совпадение,канал А
reti ;Таймер/счётчик 1,прерывание по переполнению
reti ;Таймер/счётчик 0,прерывание по переполнению
reti ;Переполнение UART пирём завершён
reti ;Переполнение UART регистр данных пуст
reti ;Переполнение UART передача завершена
reti ;Прерывание по изменению на любом контакте
reti ;Переполнение по компаратору
reti ;Таймер/счётчик 1,совпадение,канал В
reti ;Таймер/счётчик 0,совпадение,канал В
reti ;Таймер/счётчик 0,совпадение,канал А
reti ;USI готовность к старту
reti ;USI Переполнение
reti ;EEPROM Готовность
reti ;Переполнение охранного таймера
init: ldi temp,ramend
out spl,temp
ldi temp,0x80
out acsr,temp
ldi temp,0
out ddrd,temp
ldi temp,0xff
out ddrb,temp
out portb,temp
out portd,temp
;--------------------Инициализация таймера1-------------------------
ldi temp,0x0d ;Выбор режима таймера
out tccr1b,temp
ldi temp,high(kdel) ;Старший полубайт кода совпадения
out ocr1ah,temp ;Запись в регистр совпадения
ldi temp,low(kdel) ;Младший полубайт кода совпадения
out ocr1al,temp ;Запись в регистр совпадения
;-------------------Определение маски прерываний--------------------
ldi temp,0b01000000 ;Байт маски.Разрешено одно прерывание №4
out timsk,temp ;Записываем маску
main: ldi rab,0b00010000 ;Запись начального значения
sts buf,rab ;Запись содержимого регистра rab в SRAM
sei ;Разрешаем прервание
loop: rjmp loop ;Сдесь можем записать любой код
;-----------------Программа обработки прерывания--------------------
prtim1: push temp
push rab
lds rab,buf ;Читаем содержимое rab из SRAM
in temp,pind ;Проверяем кнопку
sbrs temp,0
rjmp left
right: lsr rab
brcc exit
ldi rab,0b10000000
rjmp exit
left: lsl rab
brcc exit
ldi rab,0b00000001
exit: ldi temp,0xff
eor temp,rab
out portb,temp
sts buf,rab
pop rab
pop temp
reti
НАЗАД Assembler PIC Си AVR ДАЛЬШЕ