                                                       

;************************************************************
;* Carlos Alberto Henao                                     *
;* Interrupcin por desborde del timer0 con el pic 16f877   *
;* Para multiplizacin de display de doble segmento	    *
;* Foro tcnico de microcontroladores "todopic"		    *
;* 16 de julio del 2009 Pereira - Colombia                  *
;************************************************************


;******************** Declaracin de registros especiales *********************************

tmr0		equ		01h
status		equ		03h
porta		equ		05h
portb		equ		06h
portc		equ		07h
portd		equ		08h
porte		equ		09h
intcon		equ		0bh

option_reg	equ		81h
trisa		equ		85h
trisb		equ		86h
trisc		equ		87h
trisd		equ		88h
trise		equ		89h
adcon1		equ		9fh

;******************* registros de usuario *************************************************

conta		equ		20h		; contador
loop		equ		21h
loop1		equ		22h		; registro de para la rutina de tiempo
digito1		equ		23h
digito2		equ		24h		; son los digitos del display


list p = 16f877

;***************** va a empezar el programa ***********************************************

	org	00
	goto	inicio
	
	org	04
	goto	inter


;**************** Rutina de manejo de interrupcin ****************************************

inter	btfsc	intcon,2	; pregunto si hubo interrupcin por timer0
	goto	timer0
	retfie

timer0	movf	conta,0		; paso lo de conta a w
	xorlw	d'0'
	btfss	status,2	; pregunto si conta es cero para saber que display activar
	goto	display2
	goto	display1

display1
	bsf	portc,1
	bcf	portc,2		; activo el display 1 por 11.008ms
	movf	digito1,0	; paso digito1 a w
	movwf	portb		; paso el valor a visualizar
	bsf	portc,1
	bcf	portc,2		; activo el display 1 por 11.008ms	
	movlw	d'1'
	movwf	conta
	movlw	d'84'
	movwf	tmr0		; vuelvo cargar el valor 84d para que el timer se 
				; desborde de nuevo en 11.008ms
			 
	bcf	intcon,2	; borro el flag 
	retfie			; retorno al pcl+1

display2
	bsf	portc,2
	bcf	portc,1		; activo el display 2 por 11.008ms
	movf	digito2,0	; paso digito1 a w
	movwf	portb		; paso el valor a visualizar
	bsf	portc,2
	bcf	portc,1		; activo el display 2 por 11.008ms
	
	clrf	conta		; limpio a conta para que en el otro ciclo refresque al
				; display1
	movlw	d'84'
	movwf	tmr0		; vuelvo cargar el valor 84d para que el timer se 
				; desborde de nuevo en 11.008ms
	bcf	intcon,2	; borro el flag 
	retfie			; retorno al pcl+1


;*************** Rutina de tiempo antirebote **********************************************

retar	movlw	d'100'
	movwf	loop
	movlw	d'100'
	movwf	loop1
	decfsz	loop1,1
	goto	$-1
	decfsz	loop,1
	goto	$-5
	return

;*************** rutina de principal (main) ***********************************************

inicio	bcf	status,6
	bsf	status,5	; banco 1
	movlw	b'11111111'
	movwf	trisa
	movwf	trisd
	movwf	trise		; puerto  C,D,E como entradas digitales
	movlw	b'11111001'
	movwf	trisc		; configuro el pueto A los primeros 2 terminales como salidas
				; digitales las otras 4 como entradas digitales 
	movlw	b'11110000'
	movwf	trisb		; puerto B como salidas digitales
	movlw	b'11010101'
	movwf	option_reg	; configuro el timer a un predivisor de frecuancia de 1:64
	movlw	b'00000110'
	movwf	adcon1		; configuro puerto A Y E como entradas digitales	
	bcf	status,5	; banco 0
	clrf	porta
	clrf	portb
	clrf	portc
	clrf	portd
	clrf	porte		; limpio todo los puertos
	movlw	b'10100000'
	movwf	intcon		; habilito la interrupcion global y por desborde del timer0
				; ya estamos listos solo falta cargar el valor correspondiente
				; en el registro tmro
	
	clrf	conta		; limpio el contador
	clrf	digito1		; pongo el display en ceros
	clrf	digito2
	movlw	d'84'
	movwf	tmr0 		; pongo 84 en el timer para que cuente 11.008 ms y se
				; desborde
	clrf	portb
pulsa	btfsc	portc,0
	goto	$-1
	call	retar
	btfss	portc,0		; ha pulsado el botom
	goto	$-1
	incf 	digito1,1	; incremento digito1
	movf	digito1,0
	xorlw	d'10'		
	btfss	status,2	
	goto	pulsa		
	clrf	digito1		; si llego a 10 pongo el digito2 en 1 y el otro en 0 para escribir 20
				; 30.....99
	incf	digito2,1
	movf	digito2,0	; paso digito2 a w
	xorlw	d'10'
	btfss	status,2	
	goto	pulsa		; si no a llegado a 99 sigo incrementado
	clrf	digito2		; vuelvo a inicializar el ciclo desde 00 hasta 99
	goto	pulsa
				
nada	goto	nada		; bucle infinito esperando a que ocurra la interrupcin
	end
	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
                                                                                   	             	                                                                                                                                                                                                                                                                                                                                                                                                   
     
         
                                                                                                                                                                                                                                                                                   	               q                         sd      d                                                                                                                                                                   
		
	 