	LIST	p=16F876 , R=DEC		;indica al compilador que micro se usa
	include "P16F876.inc"		;incluye valores del pic
	ERRORLEVEL	0,	-302	;Suprime los mensajes de selección de bancos
	__CONFIG   _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON

dato		equ	0x28
var1		equ	0x29		
VALOR		equ	0x2A
MSB			equ	0x2B
LSB			equ	0x2C		
	
	org		0x0000
	
Inicial	clrf	PORTA		;Inicializa puertos
	clrf	PORTB	
	clrf	PORTC
	clrf	dato
	clrf	var1		;Limpio variable
	bsf 	STATUS,RP0      ;Selecciono Bank 1
        movlw	b'00000001'
	movwf	TRISA
	movlw	b'00000000'
	movwf	TRISB
	movlw 	b'10000000'	
        movwf 	TRISC		;Configuro puerto B para las diversas salidas y Rx como entrada
	call	SER_INIC	;inicia puerto serial
	bcf	STATUS,RP0
Compara	call	RX_RS232
	call	REAL
	xorlw	'L' 		;De aquí en adelante compara los caracteres recibidos para
	btfsc 	STATUS,Z 	;realizar el salto a la subrutina respetiva
	goto 	estado
	call	REAL 
	xorlw	'O'
	btfsc	STATUS,Z
	goto	fijo2
	call	REAL
	xorlw	'g'
	btfsc	STATUS,Z
	goto	inten1
	call	REAL
	xorlw	'h'
	btfsc	STATUS,Z
	goto	inten2
	call	REAL
	xorlw	'i'
	btfsc	STATUS,Z
	goto	inten3
	call	REAL
	xorlw	'j'
	btfsc	STATUS,Z
	goto	inten4
	call	REAL
	xorlw	'k'
	btfsc	STATUS,Z
	goto	inten5
	call	REAL
	xorlw	'l'
	btfsc	STATUS,Z
	goto	menos
	call	REAL
	xorlw	'R'
	btfsc	STATUS,Z
	goto	rele1
	call	REAL
	xorlw	'C'
	btfsc	STATUS,Z
	goto	rele2
	call	REAL
	xorlw	'T'
	btfsc	STATUS,Z
	goto	tempe
	goto	Compara		;Regresa a esperar un  dato valido
estado	call	RX_RS232
	call	REAL
	xorlw	'O'
	btfsc	STATUS,Z
	goto	fijo
	movf	var1,0		;realiza la comparación de lo recibido para saltar
	xorlw	b'00000000'	;a las subrutinas PWM o de intensidad de luz
	btfsc	STATUS,Z
	goto	inten1
	xorlw	b'00000001'	
	btfsc	STATUS,Z
	goto	inten2
	xorlw	b'00000010'	
	btfsc	STATUS,Z
	goto	inten3
	xorlw	b'00000011'	
	btfsc	STATUS,Z
	goto	inten4
	xorlw	b'00000100'	
	btfsc	STATUS,Z
	goto	inten5
	goto	Compara
fijo	btfsc	PORTB,5
	btfss	PORTB,5
	goto	enviab
	goto	enviac
enviab	movlw	'b'
	call	TX_RS232
	goto	Compara
enviac	movlw	'c'
	call	TX_RS232
	goto	Compara	

fijo2	btfsc	PORTB,5		;subrutina para prender o apagar la luz fija a traves del seteo del
	btfss	PORTB,5		;puerto correspondiente
	goto	poner1
	goto	poner0
poner0	bcf	PORTB,5
	movlw	'b'
	call	TX_RS232
	goto	Compara
poner1	bsf	PORTB,5
	movlw	'c'
	call	TX_RS232
	goto	Compara

rele1	btfsc	PORTB,4		;subrutina para chequear el estod del puerto del relé cuando se aplasta
	btfss	PORTB,4		;el botón de lina AC
	goto	enviad
	goto	enviae
enviad	movlw	'd'
	call	TX_RS232
	goto	Compara
enviae	movlw	'e'
	call	TX_RS232
	goto	Compara

rele2	btfsc	PORTB,4		;subrutina para cerrar o abrir la línea AC
	btfss	PORTB,4
	goto	pone1
	goto	pone0
pone0	bcf	PORTB,4
	movlw	'd'
	call	TX_RS232
	goto	Compara
pone1	bsf	PORTB,4
	movlw	'e'
	call	TX_RS232
	goto	Compara

inten1	movlw	b'00000000'
	movwf	var1
	movlw 	0xFF
	bsf	STATUS,RP0
	movwf 	PR2		; Configura maxima frecuencia PWM 
    	bcf	STATUS,RP0
	movlw 	b'00000100'
	movwf 	T2CON
   	 movlw 	b'00001100'	; Configura CCP1 como PWM 
	movwf 	CCP1CON
	movlw 	.00		; 0% modulación 
	movwf 	CCPR1L
  	movlw	'n'		;envia comprobación a PC
	call	TX_RS232
	goto 	Compara	
	
inten2	movlw	b'00000001'
	movwf	var1
	movlw 	0xFF
	bsf	STATUS,RP0
	movwf 	PR2		; Configura maxima frecuencia PWM 
    	bcf	STATUS,RP0
	movlw 	b'00000100'
	movwf 	T2CON
   	 movlw 	b'00001100'	; Configura CCP1 como PWM 
	movwf 	CCP1CON
	movlw 	.64		; 25% modulación 
	movwf 	CCPR1L
  	movlw	'o'		;envia comprobación a PC
	call	TX_RS232
	goto 	Compara	

inten3	movlw	b'00000010'
	movwf	var1
	movlw 	0xFF
	bsf	STATUS,RP0
	movwf 	PR2		; Configura maxima frecuencia PWM 
   	bcf	STATUS,RP0
	movlw 	b'00000100'
	movwf 	T2CON
    	movlw 	b'00001100'	; Configura CCP1 como PWM 
	movwf 	CCP1CON
	movlw 	.128		; 50% modulación 
	movwf 	CCPR1L
	movlw	'p'		;envia comprobación a PC
	call	TX_RS232
	goto	Compara	

inten4	movlw	b'00000011'
	movwf	var1
	movlw 	0xFF
	bsf	STATUS,RP0
	movwf 	PR2		; Configura maxima frecuencia PWM 
   	bcf	STATUS,RP0
	movlw 	b'00000100'
	movwf 	T2CON
  	movlw 	b'00001100'	; Configura CCP1 como PWM 
	movwf 	CCP1CON
	movlw 	.192		; 75% modulación 
	movwf 	CCPR1L
	movlw	'q'		;envia comprobación a PC
	call	TX_RS232
	goto	Compara	

inten5	movlw	b'00000100'
	movwf	var1
	movlw 	0xFF
	bsf	STATUS,RP0
	movwf 	PR2		; Configura maxima frecuencia PWM 
   	bcf	STATUS,RP0	
	movlw 	b'00000100'
	movwf 	T2CON
    	movlw 	b'00001100'	; Configura CCP1 como PWM 
	movwf 	CCP1CON
	movlw 	.255		; 100% modulación
	movwf 	CCPR1L
	movlw	'r'		;envia comprobación a PC
	call	TX_RS232
	goto	Compara

menos	movf	var1,0
	xorlw	b'00000100'	;aqui empieza la subrutina para disminuir intensidad de luz
	btfsc	STATUS,Z
	goto	inten4
	xorlw	b'00000011'	
	btfsc	STATUS,Z
	goto	inten3
	xorlw	b'00000010'	
	btfsc	STATUS,Z
	goto	inten2
	xorlw	b'00000001'	
	btfsc	STATUS,Z
	goto	inten1
	xorlw	b'00000000'	
	btfsc	STATUS,Z
	goto	inten1
	goto	Compara

tempe	CLRF	VALOR
  	CLRF	MSB
  	CLRF	LSB
  	banksel	ADCON1
	movlw	b'10000000'
	movwf	ADCON1
	banksel	ADCON0
	movlw	b'10000101'
	movwf	ADCON0
	BTFSC	ADCON0,GO
  	GOTO	$-1
   	BANKSEL	ADRESL
   	MOVF    ADRESL,W
  	BANKSEL ADRESH
  	MOVWF   VALOR         
  	BCF     STATUS,C
  	RRF     VALOR,F
  	MOVF    VALOR,W
	call	TX_RS232
  	CALL    BINBCD
  	GOTO    Compara

BINBCD
   	CLRF      MSB
 	MOVWF     LSB
L1  MOVLW     0xA
   	SUBWF     LSB,W
  	BTFSS     STATUS,C
  	GOTO      FIN   
 	MOVWF     LSB
   	INCF      MSB,F
   	GOTO      L1
FIN RETLW     00    
		
;========Subrutinas para comunicación serial USART=========

SER_INIC   	BSF     STATUS, RP0           ;Selecciono bank 1
     		MOVLW   0x33                  ;Selecciono BD= 1200 con Osc= 4MHz
     		MOVWF   SPBRG
     		MOVLW   b'00100000'           ;Brgh = 0 (para velocidades bajas)
     		MOVWF   TXSTA                 ;Habilito transmisión Asíncrona
          	BCF     STATUS, RP0           ;Selecciono bank 0
     		MOVLW   b'10010000'
     		MOVWF   RCSTA                 ;Habilito recepción asíncrona
           	RETURN

TX_RS232  	MOVWF   TXREG		      ;Envia el dato al buffer de Tx
           	RETURN

RX_RS232   	BTFSS   PIR1,RCIF 	      ;Revisa por datos recibidos
     		GOTO    RX_RS232
           	MOVF    RCREG,	W
		MOVWF	dato
     	   	RETURN
REAL		movf	dato,0
		return
			end
