Вторник, Май 26, 2020

Программа переключения светодиода AVR ASM

 

 

;Если нажать и отпустить кнопку, светодиод светится, если повторно нажать и отпустить кнопку, светодиод гаснет.
.include "tn2313def.inc"
.list
.def     temp=r16
         .cseg
         ldi    temp,ramend   ;Загружаем в temp адрес конца памяти
         out    SPL,temp      ;Загружаем в указатель стека адрес начала стека
         ldi    temp,0        ;Загружаем в temp ноль все биты
         out    DDRD,temp     ;Включаем PD на вход
         ldi    temp,0xFF     ;Загружаем в temp 1111 1111
         out    DDRB,temp     ;Включаем PB на выход
         out    PORTB,temp    ;Выключаем светодиод(1 на светодиод=5В)
         out    PORTD,temp    ;Включаем подтягивающие резисторы
         ldi    temp,0x80     ;Загружаем в temp 1000 0000
         out    ACSR,temp     ;Отключаем компаратот
start:   in     temp,PIND     ;Читаем содержимое порта PD
         sbrc   temp,0        ;Проверка младшего разряда
         rjmp   start         ;Если не ноль, переходим в начало
         in     temp,PINB     ;Читаем содержимое порта PB
         sbrc   temp,0        ;Проверка младшего разряда
         rjmp   s1            ;Если 1 то идём на сброс бита
         sbi    PORTB,0       ;Установка PB0 в единицу
         rjmp   s2            ;Идём на проверку состаяния кнопки
s1:      cbi    PORTB,0       ;Сброс PB в ноль
s2:      in     temp,PIND     ;Читаем содержимое порта PD
         sbrs   temp,0        ;Проверка младшего разряда в PD
         rjmp   s2            ;Продолжить ожидание отпускания кнопки
         rjmp   start         ;К началу цикла

 

;Вообще каждый пример нужно пробовать переписать самому другим способом. Например:
.include  "tn2313def.inc"
.list
.def      temp=r16
          .cseg
          .org    0
          cbi     ddrd,0
          sbi     portd,0
          sbi     ddrb,0
          sbi     portb,0
          sbi     acsr,acd
start:    in      temp,pind
          sbrc    temp,0
          rjmp    start
          in      temp,pinb
          sbrs    temp,0
          rjmp    setbit
          cbi     portb,0
          rjmp    exit
setbit:   sbi     portb,0
exit:     in      temp,pind
          sbrs    temp,0
          rjmp    exit
          rjmp    start


 

НАЗАД                  Assembler PIC                  Си AVR                  ДАЛЬШЕ


 

 

Back to Top