;***********************************************************************
;*              Curso de PIC 2006             PIC16F877                *
;*                                                                     *
;*                       CASTELL, Esteteban F.                         *
;*                                                         06/10/2006  *
;***********************************************************************


	#include	"p16f877.inc"

	CBLOCK	0x20    ;Bloque de registros generales, a aprtir de las dir 0x20
	VARDSP0
	VARDSP1
	VARDSP2
	PUNTDSP
	ADVALIDOL
	ADVALIDOH
	BCD0
	BCD1
	BCD2
	BCD3
	BINL
	BINH
	CONT
	VAR500
	ENDC		
	
	CBLOCK	0x70    ;Boque de registros duplicados en todos los bancos
	saveW
	saveSTATUS
	saveFSR
	ENDC
	
	org 	0x00    ;Pos 0x00 de programa, donde comiena el pic, luedo de un reset.
	goto	INICIO
	
	org	0x04	;Pos 0x04 de programa, donde se pociciona el pic al producirse una interupcion.
	
	;Al Producirse una interupcion, lo primero que hago es salvar los registros W, STATUS y FSR.
	movwf 	saveW
	swapf	STATUS,W
	movwf	saveSTATUS
	movf	FSR,W
	movwf	saveFSR
	bcf 	STATUS,RP0
	bcf 	STATUS,RP1
	bcf 	STATUS,IRP
	

	btfsc	INTCON,T0IF  ; Testeo que interupcion se produjo, y la atiendo.
	goto	TIMER0
	btfsc	PIR1,ADIF
	goto	CONVERSOR

FININT		;Luego de atender una interupcion, colocon el los registros W, STATUS y FSR, los 
			;valores que tenian antes de producirse la interupcion.	
	movf	saveFSR,W
	movwf	FSR
	swapf	saveSTATUS,W
	movwf	STATUS
	swapf	saveW,1
	swapf	saveW,w
	retfie

BCD7SEG		;Tabla que retorna el balor a representar en un display de 7 seg
	andlw 	0x0f	;con esto recorto los 4 bit mas sig, por si biene un valor incorrecto.
	addwf	PCL,1
	retlw	b'00111111'	; 0
	retlw	b'00000110'	; 1
	retlw	b'01011011'	; 2
	retlw	b'01001111'	; 3
	retlw	b'01100110'	; 4
	retlw	b'01101101'	; 5
	retlw	b'01111101'	; 6
	retlw	b'00000111'	; 7
	retlw	b'01111111' ; 8
	retlw	b'01101111'	; 9 
	retlw	b'01110111'	; A
	retlw	b'01111100'	; B
	retlw	b'00111001'	; C
	retlw	b'01011110'	; D
	retlw	b'01111001'	; E
	retlw	b'01110001'	; F

DECODSP	    ;Tabla que me retorna el valor a escribir en el puerto, para encender cada display
	andlw	0x03
	addwf	PCL,1
	retlw	0x01
	retlw	0x02
	retlw	0x04
	retlw	0x00

TIMER0 	    ;Subrutina de atencion a la interupcion del TIMER0
	bcf 	INTCON, T0IF
	movlw 	(.256 - .250)
	addwf 	(TMR0),1
	clrf	PORTD
	movlw	VARDSP0
	addwf 	PUNTDSP,W
	movwf	FSR
	movf 	INDF,W
	call	BCD7SEG
	movwf 	PORTB
	movf 	PUNTDSP,W
	call 	DECODSP
	movwf 	 PORTD
	incf 	PUNTDSP,1
	movlw	(.256 - .3)
	addwf	PUNTDSP,W
	btfsc	STATUS, C
	clrf	PUNTDSP
	bsf		ADCON0,GO

	movf	VAR500,1
	btfss	STATUS,Z
	decf	VAR500,1
	goto	FININT

CONVERSOR	;Subrutina de atencion a la interupcion del CONVERSOR AD
	bcf		PIR1,ADIF
	movf 	ADRESH,W
	andlw	0x03
	movwf 	ADVALIDOH
	bsf		STATUS,RP0  ;voy al banco 1
	movf 	ADRESL,W
	bcf		STATUS,RP0	;voy al banco 0
	movwf	ADVALIDOL
	goto	FININT

BINBCD		;Subrutina para pasar un numero binario a un num BCD de 4 cifras
	clrf	BCD0
	clrf	BCD1
	clrf	BCD2
	clrf	BCD3
	movlw	.16
	movwf	CONT
LABEL1
	rlf		BINL,1
	rlf		BINH,1
	
	rlf		BCD0,w
	call	DAA
	movwf	BCD0
	
	rlf		BCD1,w
	call	DAA
	movwf	BCD1

	rlf		BCD2,w
	call	DAA
	movwf	BCD2

	rlf		BCD3,w
	call	DAA
	movwf	BCD3

	decfsz	CONT,1
	goto	LABEL1
	return

DAA	addlw	(.256-.10)	
	btfsc	STATUS,C
	return
	addlw	.10
	bcf		STATUS,C
	return

SEND232     ;subrutina para mansar los datos por el puerto serie
	bsf		STATUS,RP0
	btfss	TXSTA,TRMT
	goto 	SEND232
	bcf		STATUS,RP0
	movwf	TXREG
	return



INICIO	
	bsf 	STATUS,RP0		;voy al banco 1
	bcf 	STATUS,RP1
	movlw	b'00000000'
	movwf	TRISB
	movlw	b'11111000'
	movwf	TRISD
	movlw	0x80
	movwf	TRISC
	movlw	0x01
	movwf	TRISA
	movlw	b'10000010'
	movwf	OPTION_REG
	movlw	b'10001110'
	movwf	ADCON1
	movlw	b'01000000'
	movwf	PIE1
	movlw	b'00100110'
	movwf	TXSTA
	movlw	.25
	movwf	SPBRG
	bcf 	STATUS,RP0		;VOY AL BANCO 0
	movlw	b'01100000'
	movwf	INTCON
	movlw	b'01000001'
	movwf	ADCON0
	movlw	b'10010000'
	movwf	RCSTA
	clrf	PIR1
	
	                     
	movlw	0x20		;Borrado de memoria
	movwf	FSR
DelRAM	
	clrf	INDF
	incf	FSR,1		;FSR ++
	btfss	FSR,7
	goto	DelRAM


	movlw	.250
	movwf	VAR500

	bsf	INTCON,GIE


MAIN
	clrwdt
	movf	ADVALIDOH,W
	movwf	BINH
	movf	ADVALIDOL,W
	movwf	BINL
	call	BINBCD
	movf	BCD0,W
	movwf	VARDSP2
	movf	BCD1,W
	movwf	VARDSP1
	movf	BCD2,W
	movwf	VARDSP0
	
	movf	VAR500,1
	btfss	STATUS,Z
	goto	MAIN
	movlw	.250
	movwf  	VAR500

	movf	BCD3,W
	iorlw	0x30
	call	SEND232	
	movf	BCD2,W
	iorlw	0x30
	call	SEND232	
	movf	BCD1,W
	iorlw	0x30
	call	SEND232	
	movf	BCD0,W
	iorlw	0x30
	call	SEND232	
	movlw	'\r'
	call	SEND232
	movlw	'\n'
	call	SEND232
	goto	MAIN

	end

	
	
	
