Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

Шаг 5. Переходим непосредственно к разработке устройств и программ 223 3 .def 4 .def 5 def 6 def 7 .def temp = R16 loopl = R17 loop2 = R18 ІоорЗ = R19 rab = R20 ; Определение главного рабочего регистра , Определение первого регистра организации цикла , Определение второго регистра организации цикла , Определение третьего регистра организации цикла ; Определение рабочего регистра для команд сдвига Начало программного кода 8 cseg 9 . огд О Выбор сегмента программного кода Установка текущего адреса генерации кода ------------------------------------------------- Инициализация стека 10 ldi temp, RAMEND ; Выбор адреса вершины стека 11 out SPL, temp ; Запись его в регистр стека Инициализация портов ВВ 12 13 14 15 16 17 ldi out ldi out out out temp, 0 DDRD, temp temp, OxFF DDRB, temp PORTB, temp PORTD, temp Записываем ноль в регистр temp Записываем этот ноль в DDRD (порт PD на ввод) Записываем число $FF в регистр temp Записываем temp в DDRB (порт РВ на вывод) Записываем temp в PORTB (потушить светодиод) Записываем temp в PORTD (включаем внутр резист ) Инициализация компаратора 18 19 ldi out а , 0x80 , temp Выключение компаратора ------------------------------------------------- Начало основного цикла 20 main in temp, PIND , Читаем содержимое порта PD 21 sbrc temp, 0 , Проверка младшего разряда 22 rjmp m3 , Если не ноль, переходим к метке m3 Сдвиг вправо 23 ml ldi rab, 0Ы0000000 24 m2 ldi temp, OxFF 25 еог temp, rab 26 out PORTB, temp 27 rcall waitl 28 lsr rab 29 brcc m2 30 rjmp main Запись начального значения Инверсия содержимого регистра rab Вывод текущего значения в порт РВ Задержка Сдвиг содержимого рабочего регистра Если не дошло до конца регистра продолжить На начало Сдвиг влево 31 m3 ldi rab, ObOOOOOOOl 32 m4: ldi temp, OxFF 33 34 eor out temp, rab PORTB, temp 35 rcall waitl 36 lsl rab 37 brcc m4 38 rjmp main Запись начального значения Инверсия содержимого регистра rab Вывод текущего значения в порт РВ Задержка Сдвиг содержимого рабочего регистра Если не дошло до конца регистра продолжить На начало — --- Подпрограмма задержки 39 waitl . push loopl , Сохраняем содержимое регистра loopl 40 push loop2 ; Сохраняем содержимое регистра 1оор2 41 push ІоорЗ ; Сохраняем содержимое регистра ІоорЗ 42 ldi ІоорЗ, 15 , Помещаем в ІоорЗ константу задержки 43 wt1 dec ІоорЗ , Уменьшаем значение регистра ІоорЗ 44 breq wt4 45 ldi 1оор2, 100 ; Помещаем в 1оор2 константу задержки 46 wt2 dec loop2 ; Уменьшаем значение регистра 1оор2 47 breq Wt1 48 ldi loopl, 255 ; Помещаем в loopl константу задержки 49 wt3: dec loopl ; Уменьшаем значение регистра loopl 50 brne wt3 ; Если не ноль, продолжаем цикл 51 rjmp wt2 52 wt4: pop ІоорЗ , Восстанавливаем значение регистра ІоорЗ 53 pop loop2 , Восстанавливаем значение регистра 1оор2 54 pop loopl ; Восстанавливаем значение регистра loopl 55 ret ; Выход из подпрограммы

RkJQdWJsaXNoZXIy MTExODQxMg==