;Программа показывает как работать с регистрами, показывает правильный ;ввод и вывод данных, настройка портов для ввода и вывода .include "2313def.inc" ;подключаем файл описаний контроллера AT90S2313 .CSEG ;сегмент кода .org 0 ;самый первый его адрес rjmp reset ;идём на метку reset. Можно было бы просто начать программу с этого места ;но в дальнейшем мы будем тут ещё описывать вектора прерываний. reset: ldi r16,low(RAMEND) ;Обязательно инициализируем стек! Это будет очень необходимо out SPL,r16 ;для последующих программ. Но привыкать надо сразу. ldi r16, 0xFF ;загружаем в регистр r16 шестнадцатиричное число FF out DDRB, r16 ;копируем это значение из r16 в регистр настройки PortB ;задавая этим настройку PortB на вывод информации ldi r16, 0b00000000 ;загружаем в регистр r16 ноль out DDRD, r16 ;копируем это значение из r16 в регистр настройки PortD ;задавая этим настройку PortD на ввод информации ldi r16, 1 ;загружаем в регистр r16 десятичное число 1 out PORTB, r16 ;копируем это значение из r16 в PortB label1: sbic PIND, 0 ;если нулевой бит в порту D очищен, то переходим через инструкцию ;ВНИМАНИЕ! Проверять биты надо именнно в PIND, а не PORTD! PortD - регистр вывода данных! rjmp label1 ;а если не очищен, то выполняем эту инструкцию (переход на метку label1) ldi r16, 2 ;загружаем в регистр 16 число 2 out PORTB, r16 ;выводим его в PORTB loop: rjmp loop ;зацикливаем программу. Это необходимо по такой причине: программный ;счётчик после выполнения последней нами заданной команды попытается дать процессору ;адрес следующей ячейки программной памяти, думая что там находится следующая команда. ;А поскольку мы туда ничего не записывали, там может оказаться "мусор", вследствие чего ;микроконтроллер начнёт выполнять случайный код.