

#include "p12F675.inc"

;===============================================
; 
;===============================================

__CONFIG _HS_OSC& _WDT_OFF& _PWRTE_OFF& _MCLRE_OFF& _BODEN_OFF& _CP_OFF& _CPD_OFF

P1				EQU			030h					; Времменный 1 регистр для расчета паузы 4,8 мс
P2				EQU			031h					; Времменный 2 регистр для расчета паузы 4,8 мс
P3				EQU			032h					; Времменный 2 регистр для расчета паузы 4,8 мс


;===============================================
; Пины контроллера
;===============================================

#define			BUTTON_01	GPIO,2



				ORG			00h
				GOTO		BEGIN	
;===============================================
; Точка прерывания
;===============================================
				ORG			04h

;===============================================
; Иницилизация выходов
;===============================================

BEGIN			BCF			STATUS,RP0 			; банк 0
				CLRF		GPIO
;				MOVLW		B'00000111'			; Каналы GPIO цифровый вх/выход
;				MOVWF		CMCON


				BSF			STATUS,RP0 			; банк 1
				MOVLW		B'00000000'			; Цифровые вх/выход
				MOVWF		ANSEL

				MOVLW		B'00001100'			; 0 - Выход
				MOVWF		TRISIO 				; 1 - Вход

				BCF			OPTION_REG, 7		; Подтягивающие резисторы включенны индивидуально
				MOVLW		B'00000100'							
				MOVWF		WPU					; Подтягивающие резисторы там где 1				
				BCF			STATUS,RP0 			; банк 0




;===============================================
; Иницилизация TMR1
;===============================================

				MOVLW		B'00100001'			; Запрет управленияе по TIG1, кооф. предделителя, включить TMR1
				MOVWF		T1CON



;===============================================
; Запуск ШИМ 20 кГц, 30%
;===============================================

Pdm_20			BSF			GPIO,0 	 			; зажигаем светодиод
				CALL		ON_PDM20			; выдержка времени
				BCF			GPIO,0  			; гасим светодиод
				CALL		OFF_PDM20 			; выдержка времени

;				BTFSC		BUTTON_01			; Нажатие кнопки
;				GOTO		Pdm_20				

;				CALL		D_0.5s
;				BTFSC		BUTTON_01			; все еще нажата?
;				GOTO		Pdm_20				; успел отпустить за время антидребезга. Нажатия не было

;				BTFSS		BUTTON_01			; тригер, пока не отпушю не уйду
;				GOTO		$-1
				GOTO		Pdm_20
;===============================================
; подпрограмма выдержки времени
;===============================================

ON_PDM20		BCF			T1CON, 0			; выкл TMR1
				MOVLW		.255-.11				; задаем начальное значение TMR

				MOVWF		TMR1L				; 
				MOVLW		0xFF				; задаем начальное значение TMR
				MOVWF		TMR1H				; 
				BSF			T1CON, 0			; вкл TMR1

				BTFSS		PIR1,TMR1IF			; ждем переполнения TMR
				GOTO		$-1
				BCF			PIR1,TMR1IF			; сбрасываем флаг переполнения TMR
				return
				
OFF_PDM20		BCF			T1CON, 0			; выкл TMR1		
				MOVLW		.255-.43			; задаем начальное значение TMR
				MOVWF		TMR1L				; 
				MOVLW		0xFF				; задаем начальное значение TMR
				MOVWF		TMR1H				; 
				BSF			T1CON, 0			; вкл TMR1

				BTFSS		PIR1,TMR1IF			; ждем переполнения TMR
				GOTO		$-1
				BCF			PIR1,TMR1IF			; сбрасываем флаг переполнения TMR
				return




;===============================================
; Задержка 0.5 с пауза между активностью кнопок
;===============================================
D_0.5s			MOVLW		.20
				MOVWF		P3		
				MOVLW		.50
				MOVWF		P2					; 
				MOVLW		.50				; 
				MOVWF		P1	
				DECFSZ		P1, 1				; Отнимать пока не станет равно 0
				GOTO		$-1					; Если равно 0, пропускаем строчку
				DECFSZ		P2, 1				; Отнимать пока не станет равно 0
				GOTO		$-5					; Если равно 0, выполнять первый цикл
				DECFSZ		P3, 1				; Отнимать пока не станет равно 0
				GOTO		$-9					; Если равно 0, выполнять первый цикл
				return


END