list 	p=16f84
	#include p16f84.inc

portb	equ 06h ;el puerto b esta en la posicion 06h de la ram
porta	equ 05h ;el puerto a esta en la posicion 05h de la ram
trisb	equ 86h	;regis de config de puerto b esta en la direcc 86h de la ram
trisa	equ 85h ;regis de config de puerto a esta en la direcc 85h de la ram
status	equ 03h ;registro de estado esta en la direcc 03h de la ram

		;se definen3 registros personales.
tempo1	equ 0ch ;registro tempo1 esta  en la direcc 0ch de la ram
tempo2	equ 0dh ;registro tempo2 esta  en la direcc 0dh de la ram
tempo3	equ 0eh ;registro tempo3 esta  en la direcc 0eh de la ram

;-------------------------------------------------------------------------------
;registros de subrutina tono1

tf1	equ 19h
tf2	equ 1ah
ts1	equ 1bh
ts2	equ 1ch
ts3	equ 1dh
ctperi	equ 1eh
frecu	equ 1fh
durac	equ 20h
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;definicion de la funcion de los puertos

	bsf	status,5 ;se posiciona en banco1
	clrf	trisb ;define el portb como salida
	movlw	b'00001111'
	movwf	trisa ;define RA0 RA1 RA2 RA3 como entradas RA4 se define como salida
	bcf	status,5; se posiciona en banco 0
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;parte principal del programa que rastrea el estado de 4 entradas del porta

rastreo
	movlw	b'01111111'
	movwf	portb ; apaga todo el display de anodo comun
	btfss 	porta,0 ; prueba si es 1 el bit 0 del porta. Si lo es salta
	call	tarea0
	movlw	b'01111111'
	movwf	portb ; apaga todo el display de anodo comun
	btfss 	porta,1 ; prueba si es 1 el bit 1 del porta. Si lo es salta
	call	tarea1
	movlw	b'00000110'
	movwf	portb ; coloca E en  el display de anodo comun
	movlw	b'01111111'
	movwf	portb ; apaga todo el display de anodo comun
	btfss 	porta,2 ; prueba si es 1 el bit 2 del porta. Si lo es salta
	call	tarea2
	movlw	b'01111111'
	movwf	portb ; apaga todo el display de anodo comun
	btfss 	porta,3 ; prueba si es 1 el bit 3 del porta. Si lo es salta
	call	tarea3
	movlw	b'01111111'
	movwf	portb ; apaga todo el display de anodo comun
	goto	rastreo
;-----------------------------------------------------------------------------
;Comienzan las tareas de encender display anodo comun con el nro de tarea
;Son 4 subrutinas

tarea0
	movlw	b'01000000'; decimal 0
	movwf	portb
	call	dingdong
	call 	retardo1
	call	dingdong1
	return


tarea1
	movlw	b'01111001'; decimal 1
	movwf	portb
	call	dingdong
	call retardo1
	call	dingdong1
	return

tarea2
	movlw	b'00100100'; decimal 2
	movwf	portb
	call	dingdong
	call retardo1
	call	dingdong1
	return	

tarea3
	movlw	b'00110000'; decimal 3
	movwf	portb
	call	dingdong
	call retardo1
	call	dingdong1	
	return
;-----------------------------------------------------------------------------
;Subrutina retardo
	
retardo1
	incf	tempo1,1
retardo2
	incf	tempo2,1
retardo3
	incf	tempo3,1
	btfss 	tempo3,6
	goto	retardo3
	clrf	tempo3
	btfss	tempo2,7
	goto	retardo2
	clrf	tempo2
	btfss	tempo1,6
	goto	retardo1
	clrf	tempo1
	return
;-----------------------------------------------------------------------------

;----------------------------------------------------------------------------
;subrutina ding dong

dingdong
	movlw	d'10' 
	movwf	frecu 
	movlw	d'6' 
	movwf	durac 
	call	tono1 
	movlw	d'6' 
	movwf	frecu 
	movlw	d'6' 
	movwf	durac 
	call	tono1 	
	return
;---------------------------------------------------------------------
;---------------------------------------------------------------------
;subrutina ding dong1

dingdong1
	movlw	d'6' 
	movwf	frecu 
	movlw	d'6' 
	movwf	durac 
	call	tono1 
	movlw	d'10' 
	movwf	frecu 
	movlw	d'6' 
	movwf	durac 
	call	tono1 	
	return
;---------------------------------------------------------------------
;---------------------------------------------------------------------
;subrutina tono1 -antes de llamarla se debe cargar el regist frecu (1 a 80)  y el registro durac (de 0 a 255)-
;el valor de frecu  1 (agudos) a 80 (graves) determina la frecuencia.
; el valor de durac (hasta 255) determina la duración. NO es igual para todas las frecuencias


tono1
	clrf	ts1  
	clrf	ts2
	clrf	ts3
rt1
	incf	ts1,1
rt2
	incf	ts2,1
rt3
	call	periodo
	incf	ts3,1
	movf	durac,0
	xorwf	ts3,0 ;lo guardo en w porque no me interesa guardarlo en otro lado
	btfss	status,2 ;junto con la intruccion anterior ve si ts2 es igual a durac-
	goto	rt3
	clrf	ts3
	movf	durac,0
	xorwf	ts2,0 ;lo guardo en w porque no me interesa guardarlo en otro lado
	btfss	status,2 ;junto con la intruccion anterior ve si ts2 es igual a durac-
	goto	rt2
	clrf	ts2
	movf	durac,0
	xorwf	ts1,0 ;lo guardo en w porque no me interesa guardarlo en otro lado
	btfss	status,2 ;junto con la intruccion anterior ve si ts1 es igual a durac-
	goto	rt1
	return


;--------------------------------------------
periodo
	

	clrf	ctperi
bajo	bcf	portb,7  ;semiciclo bajo (cero) de la onda cuadrada.Esta intrucc selec salida sonora.
	call	semiciclo ;determina la duracion de este semiciclo
	incf	ctperi,1
	movf	frecu,0
	xorwf	ctperi,0 ;lo guardo en w porque no me interesa guardarlo en ctperi
	btfss	status,2
	goto	bajo
	clrf	ctperi
alto	bsf	portb,7   ;semiciclo alto (uno) de la onda cuadrada.Esta intrucc selec salida sonora.
	call	semiciclo
	incf	ctperi,1
	movf	frecu,0
	xorwf	ctperi,0 ;lo guardo en w porque no me interesa guardarlo en ctperi
	btfss	status,2
	goto	alto
	return

;---------------------------------------------

;---------------------------------------------
semiciclo
	clrf	tf1
	clrf	tf2
retf1
	incf	tf1,1
retf2
	incf	tf2,1
	btfss	tf2,1 ;determina la duracion del semiciclo T/2 (controla la frec)
	goto	retf2 	
	clrf	tf2
	btfss	tf1,1 ;determina la duracion del semiciclo T/2 (controla la frec)
	goto	retf1
	return

;-------------------------------------------------------------------------------

	end