  .include "D:\avr\avrasm\APPNOTES\2313DEF.INC" 

               .def          Temp=R16
               .def          Temp1=R17
               .def          Temp2=R18
             
.org0 
rjmp RESET

.org001
rjmp INT_0

.org006
rjmp Timer0_OVF0

RESET:    
                  ldi Temp,RamEnd
                  out SPL,Temp

                  ldi Temp,0                        ;настройка портов
                  out ddrd,Temp
                  ldi Temp,$ff
                   out DDRB,Temp
                  out Portd,Temp

                  ldi Temp,$40
                 out gimsk,Temp                  ;включаем вход INT_0

                 ldi Temp,$3
                  out mcucr,Temp                ;работа  входа по фронту сигнала

                 ldi Temp,$3
                 out tccr1b,Temp                   ; частота c  делением на 64
                  
                  ldi Temp,$cf                      ; настройка длительности  импульсов шим
                  out ocr1ah,Temp                 
                  ldi Temp,$cf
                  out ocr1al,Temp

                  ldi r29,$00                             ;Задаем начальную длительность задержки шим
stop:
                  cbi portb,4         ;Сбрасываем вывод PB4 в ноль чем включаем светодиод
                          
              
scan1:
                             
                  sbis pind,1        ;Если нажата кнопка (PD1)
                  rjmp start           ;то идем на старт
                  rjmp scan1        ;Если ничего не нажато то повторяем  сканирование  заново
start:
                  sbi portb,4             ;Устанавливаем лог.1 на выводе PB4 чем гасим светодиод
                   sei                           ;Разрешаем прерывания
                  rcall pause_scan   ;Вызываем подпрогаму устранения дребезга 
                  rjmp scan2              ;Переходим на сканирование 
scan2:
                                   
                  sbis pind,1              ;Если нажата кнопка (PD1)
                  rjmp plus                  ;то переходим на часть програмы увеличения длительности задержки шим
                  rjmp scan2               ;Если нечего не нажато то повторяем сканирование  заново
off:            
                  cli                                ;Запрещаем все прерывания 
                   ldi Temp1,0            
                   out tccr1a,Temp1      ;запрещаем работу шим
                   rcall pause_scan      ;Вызываем подпрограмму устранения дребезга  
                   ldi r29,0                    ;Задаем начальную длительность задержки шим
                  rjmp stop                    ;Идем в начало программы  на метку stop
plus:
                   ldi r20,$ff                     ;Задаем максимальное значение длительности задержки шим           
                  cpse r20,r29               ;Проверяем не максимальное ли значение
                   rjmp plus1                ; если нет то идем на увеличение длительности задержки шим
                   rjmp off                     ;если максимальное значение то идем назад на сканирование кнопок 
plus1:
                  ldi r26,$55                    ;Задаем дискретность
                  add r29,r26                  ;Увеличиваем  длительность задержки шим
                  rcall pause_scan         ;Вызываем подпрограму устранения дребезга 
                  rjmp scan2                  ;Возвращаемся назад на сканирование
  
INT_0:                                           ;обработчик прерывания по входу
                ldi Temp2,$4                 ;частота таймера0=ск/256
                out tccr0,Temp2          
                out tcnt0,r29                  ; задаем начальное значение таймера0
                ldi Temp2,$2
                out timsk,Temp2            ;включаем таймер0
                 reti

Timer0_OVF0:                                   ;обработчик прерывания таймера0
                             ldi Temp2,0                              
                             out tccr0,Temp2                    ;запрещаем работу таймера0
                             ldi Temp1,0
                             out tccr1a,Temp1                  ;запрещаем работу шим
                             ldi Temp1,$83
                             out tccr1a,Temp1                   ; включаем  неинверт. 10 разрядный ШИМ
                             reti

pause_scan:
                   ldi	r25,10
D100_3:	clr	r24          ;Обнуляем регистр
D100_2:	clr	r23          ;Обнуляем регистр
D100_1:	dec	r23          ;Отнимаем единицу от значения даного регистра
	brne	D100_1  ;Проверяем условие перехода
	dec            r24          ;Отнимаем единицу от значения даного регистра
	brne	D100_2   ;Проверяем условие перехода
	dec	R25          ;Отнимаем единицу от значения даного регистра
	brne	D100_3   ;Проверяем условие перехода
	ret                               ;выходим из подпрограмы