Вы находитесь на странице: 1из 2

.include "m16def.

inc" // Подключаем заголовочный файл с адресами


.def temp = r16 // Присваиваем символические имена регистрам общего назначения
.def razr1 = r17 // r0-r15 использовать не рекомендую, их юзает процессор
.def razr2 = r18 // а вот r16 - r31 в нашем распоряжении
.def razr3 = r19

.dseg // Сегмент ОЗУ, в данном уроке он нам не нужен, но все равно оставим
// на случай вдруг если в голову взбредет использовать его
.cseg // Программный сегмент, все что тут есть, записывается в память программ
.org 0 // Вектор прерывания Reset, раздел Interrupt в технической документации
rjmp Reset // "rjmp" команда перехода на метку, в данном случае на метку Reset

Reset: // Метка Reset, метки указываются с двоеточием


ldi temp, 0xff // "ldi" команда присваивания константы регистру общего назначения, запись
0xff в temp
out DDRC, temp // Выводим в конфиг. регистр порта (порт B на выход)
ldi temp, 0xff // "ldi" команда присваивания константы регистру общего назначения, запись
0xff в temp
out DDRD, temp
ldi temp, 0xff // "ldi" команда присваивания константы регистру общего назначения, запись
0xff в temp
out DDRB, temp
ldi temp, 0x00 // Записываем в temp - 0x00
out DDRA, temp // Выводим в конфиг. регистр порта (порт A на выход)
ldi temp, 0xff // Записываем в temp - 0xff
out PORTA, temp // Выводим в конфиг. регистр порта (порт A подтяжка внутреннего резистора)
// Каждую ногу порта можно конфигурировать отдельно само собой, у порта
есть 4 состояния:
// DDRx = 1, PORTx = 0 Это порт на выход и притянут к минусу(земле)
// DDRx = 1, PORTx = 1 Это порт на выход и притянут к +5
// DDRx = 0, PORTx = 0 Это порт на вход
// DDRx = 0, PORTx = 1 Это порт на вход и притянут к +5 через внутренний
резистор 10кОм
// Последний конфиг полезен для навешивания кнопки

Proga: // Основная программа


sbic PINA, 0 // "sbic" команда пропустить следующую строку, если бит порта очищен(тут ножка
PA0)
rjmp Proga // Если кнопка не нажата, переходим на Proga, если нажата эта строка пропустится

ldi temp, 0b10000001 // Пихаем в temp значение


out PORTB, temp // Отправляем в порт B
rcall Delay // "rcall" команда вызова подрограммы, в данном случае Delay подпрограмма
задержки

ldi temp, 0b01000010 // Пихаем в temp значение


out PORTB, temp // Отправляем в порт B
rcall Delay // Вызываем задержку

ldi temp, 0b00100100 // Пихаем в temp значение


out PORTB, temp // Отправляем в порт B
rcall Delay

ldi temp, 0b00100100 // Пихаем в temp значение


out PORTC, temp // Отправляем в порт B
rcall Delay

ldi temp, 0b00001000 // Пихаем в temp значение


out PORTC, temp // Отправляем в порт B
rcall Delay

ldi temp, 0b00010000 // Пихаем в temp значение


out PORTC, temp // Отправляем в порт B
rcall Delay

ldi temp, 0b10000001 // Пихаем в temp значение


out PORTD, temp // Отправляем в порт B
rcall Delay // "rcall" команда вызова подрограммы, в данном случае Delay подпрограмма
задержки

ldi temp, 0b01000010 // Пихаем в temp значение


out PORTD, temp // Отправляем в порт B
rcall Delay// Вызываем задержку

ldi temp, 0b00100100 // Пихаем в temp значение


out PORTD, temp // Отправляем в порт B
rcall Delay

ldi temp, 0b00001000 // Пихаем в temp значение


out PORTD, temp // Отправляем в порт B
rcall Delay

ldi temp, 0b00010000 // Пихаем в temp значение


out PORTD, temp // Отправляем в порт B
rcall Delay

rjmp Proga // Перейти на метку Proga

Delay:
ldi razr3, 1
// Пихаем в razr3 - 10
PDelay: // Метка PDelay
dec razr1 // "dec" команда понижает регистр на 1 (декремент) в данном случае razr1
brne PDelay // перейти на PDelay, если razr1 не = 0
dec razr2 // тут по аналогии
brne PDelay // тут по аналогии
dec razr3 // тут по аналогии
brne PDelay // тут по аналогии
ret