Код: Выделить всё
.include "m8535def.inc"
;Назначим новые имена для регистров
.def D0=r20 ;присвоение новых имен разрядам задержки
.def D1=r21 ;
.def D2=r22 ;
.cseg ;начало сегмента кодов
.org 0 ;установка адреса начала программы
reset: ;Устанавливаем указатель стека на конец RAM
ldi r16,low(RAMEND)
ldi r17,high(RAMEND) ;выыделение регистров 16 и 17
out spl,r16 ;под начало и конец стека
out sph,r17 ;соответственно
;Предустановка портов 1/0
clr r16 ;настраиваем порт B на ввод данных
out DDRB,r16
;Основной цикл
loop: in 16,PINB ;считываем из порта В
mov r17,r16 ;копируем результат в r17
lsr r17 ;сдвигаем копию вправо,чтобы последующей командой
eor r16,r17 ;исключающее ИЛИ проверить , не равны ли PINB,0 и OINB,1
rjmp _1
rjmp _2
clr r16
rjmp loop
_1:
;Конфигурация входов/выходов
ldi r16,0xFF ;запишем в регистр 16 значение 255 (любое кроме 0)
out DDRA,r16 ;Устанавливаем порт А на вывод информации
;Зажжём первый светодиод на всех портах
ldi r16, 0x01 ; запишем единицу в регистр 16
out PORTA,r16
;Основной цикл (бесконечный)
main: rol r16 ;Циклически сдвинем единичку влево
in r19,SREG ;Сохраним флаги
out PORTA,r16 ;Выведем сдвинутый r16 в порт А
ldi D2,$18 ;*загрузим параметры выдержки времени
ldi D1,$6A ;*изменяя значения этих регистров
ldi D0,$00 ;*меняем выдержку времени
rcall delay
out SREG,r19 ;Восстановим флаги
rjmp main ;Вернёмся к началу цикла
;Подпрограмма задержки
delay: subi D0,1 ;вычитаем 1 из D0
sbci D1,0 ;вычитаем с учетом знака переноса
sbci D2,0 ;вычитаем с учетом знака переноса
brcc delay ;на метку delay если флаг переноса очищен
ret ;выход из подпрограммы задержки
_2:
;Конфигурация входов/выходов
ldi r16,0xFF ;запишем в регистр 16 значение 255 (любое кроме 0)
out DDRA,r16 ;Устанавливаем порт А на вывод информации
;Зажжём первый светодиод на всех портах
ldi r16, 0x01 ; запишем единицу в регистр 16
out PORTA,r16
;Основной цикл (бесконечный)
main1: rol r16 ;Циклически сдвинем единичку влево
in r19,SREG ;Сохраним флаги
out PORTA,r16 ;Выведем сдвинутый r16 в порт А
ldi D2,$18 ;*загрузим параметры выдержки времени
ldi D1,$6A ;*изменяя значения этих регистров
ldi D0,$00 ;*меняем выдержку времени
rcall delay1
out SREG,r19 ;Восстановим флаги
rjmp main1 ;Вернёмся к началу цикла
;Подпрограмма задержки
delay1: subi D0,1 ;вычитаем 1 из D0
sbci D1,0 ;вычитаем с учетом знака переноса
sbci D2,0 ;вычитаем с учетом знака переноса
brcc delay1 ;на метку delay если флаг переноса очищен
ret ;выход из подпрограммы задержки

