;Для задержки будем использовать TIMER_COUNTER_1 - Таймер счётчик 1.Схема таже что и в предыдущем листинге.
.include "tn2313def.inc"
.list
.def temp=r16
.def rab=r17
.equ kdel=50 ;Константа
.cseg
.org 0
ldi temp,ramend
out spl,temp
ldi temp,0x80
out acsr,temp
ldi temp,0b00000101 ;Включаем Таймер 1
out tccr1b,temp ;устанавливаем предделитель 1/1024.
ldi temp,0
out ddrd,temp
ldi temp,255
out ddrb,temp
out portb,temp
out portd,temp ;Out Port
start: in temp,pind ;In Port
sbrc temp,0
rjmp right ;Relative Jump
ldi rab,1
left: ldi temp,255
eor temp,rab ;Exclusive OR Registers
out portb,temp
rcall delay ;Relative Subroutine Call
lsl rab ;Logical Shift Left
brcc left
rjmp start
right: ldi rab,0x80
rloop: ldi temp,255
eor temp,rab
out portb,temp
rcall delay
lsr rab ;Logical Shift Right
brcc rloop ;Branch if Carry Cleared
rjmp start
delay: push temp
ldi temp,0
out tcnt1h,temp ;Обнуляем счётные регистры
out tcnt1l,temp
dloop: in temp,tcnt1l ;Получаем значение младшего байта
cpi temp,low(kdel) ;Сравниваем с младшим байтом kdel(Compare Register with Immediate)
brlo dloop ;Branch if Lower
in temp,tcnt1h ;Получаем значение старшего байта
cpi temp,high(kdel) ;Сравниваем со старшим байтом kdel
brlo dloop
pop temp
ret
НАЗАД Assembler PIC Си AVR ДАЛЬШЕ