Код: Выделить всё
.device AT90S2313
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\2313def.inc"
.def temp=r16 ;рабочая переменная
.def Count_time=r17 ;счетчик задержки
.def Counter=r18 ;счетчик нажатий
.def Flag=r19 ;регистр флагов: если бит 0 установлен
;то обнаружили нажатие и переходим к отпусканию
;=====прерывания=====
rjmp RESET
rjmp INT0_1
reti
reti
reti
reti
rjmp TIM0
reti
reti
reti
reti
;=====программа=====
INT0_1: ;внешнее прерывание по кнопке
;запрещаем прерывание
clr temp
out GIMSK,temp
ldi temp,$FF
out GIFR,temp
sbrs Flag,0
rjmp Push_pin
cbr Flag,1
inc Counter
out PortB,Counter
ldi Count_time,50
rjmp ent_int
Push_pin:
sbr Flag,1
ldi Count_time,128
ent_int:
ldi temp,0b00000011
out TCCR0,temp
reti
TIM0:
dec Count_time
breq end_timer
reti
end_timer:
clr temp
out TCCR0,temp
sbrc Flag,0
rjmp Push_tim
ldi temp,(1<<ISC01)
out MCUCR,temp
rjmp end_tim
Push_tim:
ldi temp,(1<<ISC01|1<<ISC11)
out MCUCR,temp
end_tim:
ldi temp,(1<INT0)
out GIMSK,temp
reti
RESET:
ldi temp,low(RAMEND)
out SPL,temp
ldi temp,0b00000100
out portd,temp
ldi temp,0b11111111
out DDRB,temp
clr Counter
clr Flag
ldi temp,(1<<TOIE0)
out TIMSK,temp
ldi temp,(1<<ISC01)
out MCUCR,temp
ldi temp,(1<<INT0)
out GIMSK,temp
sei
Gcykle:
rjmp Gcykle