 TITLE  "ir1.asm"   	        	; working with TV IR remote  
 List P=PIC16F684, R=DEC
 INCLUDE "p16f684.inc"

; data segment
 CBLOCK 0x20                   
 del  					; variable used for delay
 pulse, pulses2Send, pulsesReceived	
 ENDC

; code segment
 PAGE
 __CONFIG _FCMEN_OFF & _IESO_OFF & _BOD_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT

  org 0                      		; start program at the beginning of mem
	bcf	STATUS, RP0		; activate BANK 0
	clrf	PORTC			; initialize PORT C
	movlw	0x07
	movwf	CMCON0			; comparators OFF
	bsf    	STATUS, RP0      	; change to BANK 1

	clrf	ANSEL ^ 0x80		; make all inputs digital
	bcf	TRISC ^ 0x80, 5		; enable RC5 for output
	bcf	TRISC ^ 0x80, 0		; enable RC0 for output
	bcf    	STATUS, RP0        	; back to BANK 0

	clrf	pulse			; start with IR pulse value 0
loop
	movlw	10
	movwf	del
	call	delay			; 50 msec delay

	clrf	pulsesReceived	
	movlw	20
	movwf	pulses2Send

send_pulses
	goto	$+1
	goto 	$+1
	btfss	PORTC, 4		; is there IR reflected waveform?
	incf	pulsesReceived, f

	movlw	b'100000'
	xorwf	pulse, w		; compose a new pulse value
	movwf	pulse
	movwf	PORTC			; output the new pulse value
	decfsz	pulses2Send, f
	goto	send_pulses		; end of a 26 cycle (38KHz=26.3mksec)

	movlw	4
	subwf	pulsesReceived, w	; C=1 if more than 2 pulses received
	movf	PORTC, w
	andlw	0xFE	
	btfsc	STATUS, C
	iorlw	1			; turn on LED
	movwf	PORTC

  	goto 	loop			; endless loop


; procedures
delay					; a delay for del milliseconds
	movlw 	200
	
	sublw	1			; this loop takes 5us*200 = 1ms
	sublw	0			; for PIC16F684 @ 4 Mhz
	btfss	STATUS, Z
	goto 	$-3

	decfsz	del, f
	goto 	delay
	return

 end
