;Если нажать и отпустить кнопку, светодиод светится, если повторно нажать и отпустить кнопку, светодиод гаснет.
.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 ДАЛЬШЕ