;Для задержки будем использовать 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                  ДАЛЬШЕ