;------------------------------------------------------------------------------------------------;
;------------------------------------------------------------------------------------------------;
;					Br. ALVES JOHANN PINTO	01-9310				 ;
;					Br. Mihosotys Espinoza 	03-xxxx		       		 ;		
;					Horno Microondas 2007 					 ;
;					USB-NUL WARE OVEN+			                 ;
;------------------------------------------------------------------------------------------------;
;------------------------------------------------------------------------------------------------;

	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC      ; Configuración para el grabador
					      ; CP en OFF: Protección de código inactiva
					      ; WDT en OFF: Watchdog inactivo
					      ; PWRTE en ON: Power-Up Timer activado
					      ; XT_OSC: Oscilador XT (Cristal de cuarzo)
	list 		P=16f877A		; Procesador utilizado, lista de la directiva para definir el procesador
	#include 	<p16F877A.inc>	; Definición de los operandos utilizados

;-----------------------------------------------------------------------------------------------;
; 			     DEFINICIÓN DE REGISTROS ESPECÍFICOS		        							;  
;-----------------------------------------------------------------------------------------------;

opcion		EQU	01h	; para configurar TMR0 y pull up
tmr0		EQU	01h 
pcl			EQU	02h 
estado		EQU	03h	; condiciones auxiliares de W
puertoa		EQU	05h
trisa		EQU	05h
teclado		EQU	06h
trisb		EQU	06h
puertoc		EQU	07h
trisc		EQU	07h
puertod		EQU	08h
trisd		EQU	08h
puertoe		EQU	09h 
trise		EQU	09h
intcon		EQU	0Bh	; Registro de control de Interrupciones
usart		EQU	18h
usarttxsta	EQU	18h
transmision	EQU	19h
spbrg		EQU	19h
adcon1		EQU	1Fh	; Analogo - digital

;-----------------------------------------------------------------------------------------------;
; 				   DEFINICIÓN DE BITS			        	  	;
;-----------------------------------------------------------------------------------------------;

w			EQU	0	; Indica que el resultado va al registro W
f			EQU	1	; Indica que el resultado se queda en el registro f
c			EQU	0	; Perteneciente al registro ESTADO
z			EQU	2	;        "      "     "       "
banco		EQU	5	;        "      "     "       "	
swpuerta	EQU	5	; Pertenece al puerto A
proximidad	EQU	6	;	"	"
magneton	EQU	2	; Pertenece al puerto C	
tx			EQU	6	; 	"	"     " ****
rx			EQU	7	; 	"	"     " ****
buzzer		EQU	7	; Pertenece al puerto D
motorac		EQU	0	; Pertenece al puerto E
bombillo	EQU	1	; 	"	"     E
extractor	EQU	2	; 	"	"     E
gie			EQU	7	; "	"      Registro de control de inte (INTCON)
toif		EQU	2	; "	"	"	"	"	"	" Senalizador desbordamiento en TMR0


;-----------------------------------------------------------------------------------------------;
; 			DEFINICIoN DE VARIABLES Y REGISTROS GENERALES		        	;
;-----------------------------------------------------------------------------------------------;

cont1		EQU	20h	; Contador utilizado en la subrutina "RETARDO"
cont2		EQU	21h	;     "	       "      "  "     "       " 
contbeeper	EQU	22h	; Contador utilizado en la subrutina "SONIDOF"
barrido0	EQU	23h	; Contador utilizado en la subrutina "MOSTRAR
barrido1	EQU	24h	; Contador utilizado en la subrutina " " " " 
tecla		EQU	25h	; "	"  de las teclas chequeadas
relojhora	EQU	30h	; "	"	"	"     unidad de mil y la centena de la hora del reloj
relojminuto	EQU	32h	;	"	"	"     decena y unidad del reloj
leido		EQU	34h	; "	"  utilizado en la busqueda de tecla pulsada en "inversión de línea"
retardar	EQU	35h	; Contador usado en subrutina NO_REBOTE
retardar1	EQU	36h	; "	" usado en subrutina MOSTRAR
ciclotrabajo1	EQU	37h	; Contador para controlar el nivel de potencia **magneton** 
ciclotrabajo2	EQU	38h	;	"	"	"	"	"	"
tecladefinitiva	EQU	50h	; Registro donde se encuentra el valor de la tecla pulsada detectada
nivelpotencia	EQU	51h	; "	"	"	"	"	" nivel de la potencia suministrada
auxiliar	EQU	5Fh	; Registro auxiliar para el desplazamiento de los numeros a mostrar
unidad		EQU	60h	; Direcciones donde se guarda el valor 7 segmentos a mostrar por display que
decena		EQU	61h	; que sale por el puerto D
centena		EQU	62h
mil			EQU	63h


segundo1	EQU	2Bh	; Registros que llevan la cuenta de los segundos transcurridos
segundo2	EQU	2Ch
minuto1		EQU	2Dh	; Registros que llevan la cuenta de los minutos transcurridos
minuto2		EQU	2Eh
hora1		EQU	2Fh	; Registros que llevan la cuenta de las horas transcurridas		
hora2		EQU	30h

;-------------------------------------------------------------------------------------------------------;
;-------------------------------------------------------------------------------------------------------;
; 				   				**PROGRAMA PRINCIPAL**			        								;
;-------------------------------------------------------------------------------------------------------;
;-------------------------------------------------------------------------------------------------------;
; Configura los puertos, verifica el estado de la puerta del horno y realiza un bucle constante 	;
; de "buscapulsada" y "detección de tecla pulsada", Solo responde si RELOJ (F1 c4) o 			;
; POTENCIA (F2 C4) son presionados  									;
;-------------------------------------------------------------------------------------------------------;
	ORG 00h
		GOTO 	inicio		; Salto a "inicio" para brincar vector de interrupcion
	ORG 05h

;-------------------------------------------------------------------------------------------------------;
;		CONFIGURACIoN DE PUERTOS, ACTIVACION DE PULL-UP, HORA PREDETERMINADA,SONAR BEEP		; 
;				Lineas digitales exclusivamente, deshabilita INTR			;
;-------------------------------------------------------------------------------------------------------;

inicio	BSF 	estado,	banco	; Cambio de banco 0 al 1
		MOVLW 	30h		; Puerto A es salida en PA0-PA3 y entrada en PA4 a PA5
		MOVWF 	trisa		; A0-A3: habilitadores display	A4-A5: sensores
		MOVLW	b'00000111'
		MOVWF	adcon1		; Las líneas del puerto A son todas E-S digitales
		MOVLW 	h'F0'		; Puerto B es salida en PB0-PB3 y entrada en PB4 a PB7
		MOVWF 	trisb		; B0-B3: filas		B4-B7: columnas
		MOVLW 	h'F0'		; Puerto C es salida en PC0-PC5 y entrada en PC6 a PC7
		MOVWF 	trisc		; C2: magneton 		C6-c7: Tx y Rx (**C4 y C5: SDA SCL**)
		MOVLW 	00h			; Puerto D es salida en PD0-PD7
		MOVWF 	trisd		; D0-D6: 7 segmentos	D7: buzzer	
		MOVLW 	00h			; Puerto E es salida en PE0-PE2
		MOVWF 	trise		; E0-E2: motor AC, bombillo de 25w y extractor
		MOVLW	b'00010111'	; TMR0 como temporizador con pre escaler de 256, TOSE incrm con
		MOVWF	opcion		; flanco descendente y activa cargas Pull-Up en Puerto B		
		BCF 	estado,	banco	; Cambia a banco 0
		BCF		intcon,	gie	; Deshabilita TODAS las interrupciones		
		BCF		intcon,	toif	; Borra el banderin de desbordamiento del TMR0
		CALL 	sonido		; suena un beep de encendido,con RETARDO que chequea si la puerta estA abierta

;-------------------------------------------------------------------------------------------------------;
;				MOSTRAR LA HORA DEL RELOJ A TIEMPO REAL					;
;-------------------------------------------------------------------------------------------------------;
	; AQUI VA LA SUBRUTINA PARA MOSTRAR LA HORA QUE PRODUCE EL DS1307
	; ...
	; CALL MOSTRAR ...
;-------------------------------------------------------------------------------------------------------;
;				CHEQUEO DEL ESTADO DE LA PUERTA DEL HORNO MICROONDAS			;
;-------------------------------------------------------------------------------------------------------;

chequeopuerta	BTFSC 	puertoa,swpuerta ;Si la puerta esta abierta, el bit 5=0
				GOTO	buscapulsada
chequeopuerta2	CALL	NO_REBOTE
				CALL	PABIERTA

;-------------------------------------------------------------------------------------------------------;
;			MUESTREO PERIODICO DE LOS BOTONES **POTENCIA** Y **RELOJ** 			;
;					Se pulso alguno de los 2 botones?				;
;-------------------------------------------------------------------------------------------------------;

buscapulsada	CLRF 	tecla		; Borra registro "tecla" actual
				MOVLW 	0Eh			; Saca 0 a la fila 1 para testearla
				MOVWF 	teclado
chequearcol4	BTFSS 	teclado,7	; Chequea 4ta columna o RB7. Brinca si 7 = 1
				GOTO 	fin_buscapul	; Si 7 = 0 entonces hay una tecla presionada (RELOJ o POTENCIA)
				INCF 	tecla,f
				BTFSS 	puertoa,swpuerta 	; Si la puerta esta abierta, el bit 5=0
				GOTO	chequeopuerta2	 	; Interrumpe el muestreo pues se abrio la puerta	
				MOVLW 	02h		; Verifica si tecla = 02h (02d), es decir, si se acabaron las teclas
				SUBWF 	tecla,w		; resta f - W = (W)
				BTFSC 	estado,z	; Si z = 0 se salta una instrucción, es decir, si "tecla" no es 02h
				GOTO 	buscapulsada	; va a "buscapulsada" a seguir leyendo el teclado
				BSF 	estado,c	; Como no se han acabado las teclas, coloca el carry = 1
				RLF 	teclado,f	; y rota registro "teclado" (para chequear la segunda fila)
				GOTO 	chequearcol4	; Va a "chequearcol4" a chequear la segunda fila de la 4ta columna
						; a ver si POTENCIA fue apretado	
fin_buscapul	BTFSC 	estado,z	; Verifica como salio de la subrutina "BUSCAPULSADA"
;;;;;;;;;;;		GOTO 	chequeopuerta 	; Si Z=1, no se encontro ninguna tecla presionada y vuelve a chequear
						; la puerta
				CALL 	NO_REBOTE	; Si Z=0, se pulso una tecla.Se salta a Subrutina de espera para
						; evitar el efecto muelle del pulsador
				CALL	SONIDOTECLA	; suena 1 beep de 0,125 sg
				CALL	CUALTECLAES	; Subrutina que identifica la tecla pulsada
				MOVF	tecladefinitiva,w	; Verifica si la tecla pulsada fue RELOJ
				SUBLW	0Bh			; De la tabla de BOTON
				BTFSC 	estado,z 		; Si Z=1 el boton presionado fue POTENCIA, sino se pulso RELOJ
				GOTO	botonpotencia
				GOTO	botonreloj
botonpotencia	CALL	POTENCIA
				GOTO	chequeopuerta
botonreloj		CALL 	RELOJ			; El micro se dedica a configurar la hora
				GOTO	chequeopuerta
		END

;-----------------------------------------------------------------------------------------------;
;		SUBRUTINA	SONIDO: Permite encender el beeper por aproximadamente 0.5 seg 	;
;					INCLUYE CHEQUEO DE PUERTA				;
;-----------------------------------------------------------------------------------------------;
sonido 	BSF 	puertod,buzzer	; Enciende el beeper
		CALL 	RETARDO		; Llama a la subrutina de temporizacion RETARDO
		CALL	RETARDO		; La vuelve a llamar por otros 125 ms mas
		CALL 	RETARDO		; Llama a la subrutina de temporizacion RETARDO
		CALL	RETARDO		; La vuelve a llamar por otros 125 ms mas
		BCF 	puertod,buzzer	; Apaga el beeper
		RETURN			; Retorna
;-----------------------------------------------------------------------------------------------;
;		SUBRUTINA	POTENCIA: Subrutina principal que maneja el nivel de potencia,	;
;						la cuenta regresiva y lo muestra, Chequea la 	;
;						condicion de la puerta y si se apreto CANCEL. 	;
;						  **Enciende magneton, bombillo, extractor**	;
;-----------------------------------------------------------------------------------------------;

 POTENCIA	BCF		intcon,	toif	; borro banderin de desbordamiento TMR0
			MOVLW	0Ah
			MOVWF	ciclotrabajo1	; Contadores que regula cuanto tiempo estara encendido 
			MOVLW	00h		; el magneton en cada ciclo de trabajo de 30sg
			MOVWF	ciclotrabajo2
			MOVLW 	03h		; Cargo de forma inmediata los valores de los 7 segmentos para
			MOVWF 	unidad		; luego llamar MOSTRAR y saca por display el mensaje **P-HI**
			MOVLW 	76h		; **H**
			MOVWF 	decena
			MOVLW 	40h		; **GUION**
			MOVWF 	centena
			MOVLW 	73h		; **P**
			MOVWF 	mil
;				**ACTUALIZAR EL DISPLAY***

 muestro	CALL 	MOSTRAR		; Muestra display por 20ms

;				**POLLIN DEL TECLADO**
	
 pbuscapulsada	CLRF 	tecla			; Borra registro "tecla" actual
				MOVLW 	0Eh				; Saca 0 a la fila 1 para testearla
				MOVWF 	teclado
 pchequearcol1	BTFSS 	teclado,4		; Chequea columna 1 en busca de un cero (0 = tecla pulsada)
				GOTO 	pfin_buscapul	;* Si lo encuentra busca cual tecla fue pulsada
				INCF 	tecla,f			; Si no, incrementa "tecla"
				BTFSS 	teclado,5		; Chequea columna 2
				GOTO 	pfin_buscapul	;*
				INCF 	tecla,f
				BTFSS 	teclado,6		; Chequea columna 3
				GOTO 	pfin_buscapul	;*
				INCF 	tecla,f
pchequearcol4	BTFSS 	teclado,7		; Chequea 4ta columna o RB7. Brinca si 7 = 1
				GOTO 	pfin_buscapul	; Si 7 = 0 entonces hay una tecla presionada (RELOJ o POTENCIA)
				INCF 	tecla,f
	;;;;	BTFSS 	puertoa,swpuerta 	; Si la puerta esta abierta, el bit 5=0
	;;;;	GOTO	chequeopuerta2	 ; Interrumpe el muestreo pues se abrio la puerta	
				MOVLW 	10h		; Verifica si tecla = 10h (16d), es decir, si se acabaron las teclas
		SUBWF 	tecla,w		; resta f - W = (W)
		BTFSC 	estado,z	; Si z = 0 se salta una instruccion,No ha terminado de revisar todos los botones
		GOTO 	muestro		; va a "muestro" a actualizar display y seguir leyendo el teclado
		BSF 	estado,c	; Como no se han acabado las teclas, coloca el carry = 1
		RLF 	teclado,f	; y rota registro "teclado" (para chequear la segunda fila)
		GOTO 	pchequearcol1	; Va a "pchequearcol4" a chequear la siguiente fila de la 1era columna
					; a ver si otra tecla fue apretada
 pfin_buscapul	BTFSC 	estado,z	; Verifica como salio de la subrutina "pBUSCAPULSADA"
	;;;;	GOTO 	chequeopuerta 	; Si Z=1, no se encontro ninguna tecla presionada y vuelve a chequear
					; la puerta
		CALL 	NO_REBOTE	; Si Z=0, se pulso una tecla.Se salta a Subrutina de espera para
					; evitar el efecto muelle del pulsador
		CALL	SONIDOTECLA	; suena 1 beep de 0,125 sg
		CALL	CUALTECLAES	; Subrutina que identifica la tecla pulsada
		MOVF	tecladefinitiva,w	; Verifica si la tecla pulsada fue RELOJ
		


		RETURN
	;;;;	SUBLW	0Bh		; De la tabla de BOTON
	;;;;	BTFSC 	estado,z 	; Si Z=1 el boton presionado fue POTENCIA, sino se pulso RELOJ
	;;;;	GOTO	botonpotencia
	;;;;	GOTO	botonreloj

		


;NOTA: se carga TMR0 20 veces y se borrar banderin por software cada vez que pasa,es decir, pasado 1 sg 
;se pone de nuevo el valor 61d, luego se borra el banderín y se decrementa el tiempo




;-----------------------------------------------------------------------------------------------;
;		SUBRUTINA	NO_REBOTE: Evita el efecto muelle del pulsador			;
;-----------------------------------------------------------------------------------------------; 

;		***PREGUNTAR A MAURICIO POR EVITAR EFECTO MUELLE POR HARDWARE***
NO_REBOTE	MOVLW	0XFF
			MOVWF	retardar	; 2+(255d x 3 ciclo instruccion)= 0,765 msg
rebote		DECFSZ	retardar,f	; No retorna hasta q "retardar" no llegue a cero
			GOTO	rebote
			RETURN

;-----------------------------------------------------------------------------------------------;
;		SUBRUTINA	PABIERTA: Se cancela todo, muestro mensaje **door** y espero	;
;					  	al cierre de puerta				;
;-----------------------------------------------------------------------------------------------; 

 ;PABIERTA	CALL 	CANCEL			; Apago todo
		
		; **FALTA PROGRAMA**
		; ...
		; ...

 ;esperocierre	BTFSS 	puertoa,swpuerta 	; Si la puerta se cierra, el bit 5 =1
;		GOTO	esperocierre		; Sino se mantiene a la espera del cierre
;		RETURN

;-----------------------------------------------------------------------------------------------;
;		SUBRUTINA	SONIDOTECLA: Permite encender el beeper por aproximadamente 	;
;						0.125 seg, Para que el usuario sepa que se 	;
;						apretó un boton valido				;
;-----------------------------------------------------------------------------------------------;

;		***CORREGIR EL TIEMPO A 125mS ****;

SONIDOTECLA		BSF 	puertod,buzzer	; Enciende el beeper
				CALL 	RETARDO		; Llama a la subrutina de temporizacion RETARDO
				BCF 	puertod,buzzer	; Apaga el beeper
				RETURN			; Retorna
		

		
;-----------------------------------------------------------------------------------------------;
; 		SUBRUTINA	SONIDOF: Permite encender y apagar el buzzer por 		;	
;					 aproximadamente 0.5 seg, tres veces seguidas       	;
;			    		 (para el final de la cuenta regresiva) 		;
;					 INCLUYE CHEQUEO DE PUERTA			        ;
;-----------------------------------------------------------------------------------------------;

 SONIDOF	MOVLW 	03h		; Carga contador
			MOVWF 	contbeeper	
 otravez	BSF 	puertod,buzzer	; Enciende el beeper
			CALL 	RETARDO		; Llama a la subrutina de temporizacion
			CALL	RETARDO		; La vuelve a llamar por otros 125 ms mas
			CALL 	RETARDO		; Llama a la subrutina de temporizacion RETARDO
			CALL	RETARDO		; La vuelve a llamar por otros 125 ms mas
			BCF 	puertod,buzzer	; Apaga el beeper
			CALL 	RETARDO		; Llama a la subrutina de temporizacion
			CALL	RETARDO		; La vuelve a llamar por otros 125 ms mas
			DECF 	contbeeper,f	; Decrementa contador
			MOVLW 	00h		; Verifica si es contador = 0
			SUBWF 	contbeeper,w
			BTFSC 	estado,z	; Si Z=0, contador no es 0 y se salta una instruccion
			RETURN			; Retorna
			GOTO 	otravez		; Va a "otravez" y vuelve a empezar

;-----------------------------------------------------------------------------------------------;
; 		SUBRUTINA 	QUETECLAES: IDENTIFICACION DE LA TECLA PULSADA MEDIANTE EL	; 
;					    MECANISMO DE "INVERSION DE LÍNEA" 			;
;-----------------------------------------------------------------------------------------------;

					
CUALTECLAES	MOVF 	teclado,w 	;Almacenamos el PORTB=teclado, que se ha leido para sacarlo después
			MOVWF 	leido 		;y se lo pasamos a LEIDO
			BSF 	estado,	banco 	;Pasamos al banco 1
			MOVLW 	b'00001111' 	;y ponemos RB4 a RB7 como salidas, RB3 a RB0 entradas
			MOVWF 	trisb 		;en el registro de dirección de datos
			BCF 	estado,	banco 	;volvemos al banco 0
						;Sacamos al PORTB la lectura anterior
			MOVF 	leido,	w 	;Cargamos el valor leido en W
			MOVWF 	teclado		;y ahora va al PORTB
			nop 			;Esperamos un par de ciclos para asegurar estabilización de
			nop 			;las salidas del PORTB
					
					; IDENTIFICACION DE FILA PULSADA
					
					;Cada tecla la vamos a codificar en los 4 bits de menos 
					;peso de W (16 combinaciones)
					;2 bits para la columna (bits 3 y 2) y 2 bits para la fila (bits 1 y 0),
					;posteriormente acudiremos a una tabla que nos proporcione la tecla asociada
		BTFSS	teclado,0 	;Ahora vamos a buscar el '0' en filas
		GOTO 	FILA1 		;si RB0=0 es que pertenece a la fila 1
		btfss 	PORTB,1 	;si no, seguimos buscando el '0'
		goto 	FILA2 		;si RB1=0 es que correspondía a la fila 2
		btfss 	PORTB,2 	;si hay un'0' en RB2, se trata de una tecla en la fila 3
		goto 	FILA3		;y vamos a esa etiqueta
					;Si llegamos aquí es que hay un '0' en RB3 y se trataba de la fila 4
		goto 	FILA4 		;y vamos a la parte de esa codificación
					;Vamos a codificar en los 2 últimos bits de W la fila -> W: BIT 3c-2c-1f-0f
fila1 	clrw 			;Si era la fila 1 cargo dos ceros en los bits bajos de W
		goto 	columna 	;y voy a codificar la columna
fila2 	movlw 	0x01 		;si era la fila 2, se carga 01
		goto 	columna 	;y vamos a por la columna
fila3	movlw 	0x02 		;si era la fila 3
 		goto 	columna 	;y buscamos la columna
fila4	MOVLW 	0x03 		;finalmente si se trataba de la fila 4
					
					; IDENTIFICACION DE LA COLUMNA PULSADA

					;Buscamos ahora la codificación de la columna en los bits 3 y 2
columna	btfss 	teclado,6 	;Si RB6 es '0' es que era la columna 3
		goto 	col_3 		;y añadimos esa parte de código
		btfss 	teclado,5 	;Si RB5 es '0' se trataba de la columna 2
		goto 	col_2 		;y vamos a por ese código 		
		btfss 	teclado,4 	;Si RB4 a '0' es que era la columna 1
		goto 	col_1 		;y vamos a completar el código
					;Si llegamos aquí es que estaba RB7 a '0' y por tanto se trataba de la columna 4
col_1 	goto 	codigo 		;Ya tenemos los bits de columna a 1, nos vamos a por el código
col_2	iorlw 	b'00000100' 	;si se trataba de la columna 2, cargamos 01
		goto 	codigo 		;y vamos a por el código
col_3	iorlw 	b'00001000' 	;si era la columna 3, se incuye 10
		goto 	codigo 		;y vamos a por el código
col_4	iorlw 	b'00001100' 	;finalmente si era la columna 4, se sitúa 11
codigo	call 	BOTON 		;Llamamos a BUSCA llevando en W EL CODIGO **COLUMNA Y FILA**	
 					;y volvemos trayendo en W la tecla asignada a esa fila y esa columna
		MOVWF	tecladefinitiva	; y la guardamos en "tecladefinitiva"
		
		BSF 	estado,banco	;Cambio a banco 1 y regreso la configuracion del puerto B
		MOVLW 	h'F0'		; Puerto B es salida en PB0-PB3 y entrada en PB4 a PB7
		MOVWF 	trisb		; B0-B3: filas		B4-B7: columnas
		BCF 	estado,banco	; al banco 0
RETURN

;	nota: HACER RUTINA QUE IDENTIFIQUE QUE LA TECLA FUE SOLTADA



;-----------------------------------------------------------------------------------------------;
; 		SUBRUTINA	RETARDO: Crea un tiempo de retardo de 0,125 sg			;
;-----------------------------------------------------------------------------------------------;

 RETARDO	MOVLW 	40h		; Carga contador 1 con 64d
			MOVWF 	cont1		; (LAZO 1 = Lazo 2 x 40h = 1,98 x 64 = 126.72 ms, aprox= 0,125 sg)
 lazo1		MOVLW 	h'DC'		; Carga contador 2 con 220d
			MOVWF 	cont2		; (LAZO 2 = 9 usg x 220d = 1,98 ms, aprox= 2 ms a 4 MHz)
 lazo2		BTFSS 	puertoa,swpuerta; Chequea condicion de la puerta
;			CALL	CANCEL		; Si la puerta esta abierta, el bit 5=0
			GOTO	chequeopuerta2
			DECFSZ 	cont2,f		; Decrementa cont2 y si es cero se salta la siguiente instruccion
			GOTO 	lazo2		;
			DECFSZ 	cont1,f		; Se decrementa cont1 cada vez que cont2 llegue a cero
			GOTO 	lazo1		; Mientras lazo1 no llegue a cero recarga lazo2 y repite el proceso
			RETURN			; Retorno a la subrutina SONIDO o SONIDOF


;-----------------------------------------------------------------------------------------------;
; 		SUBRUTINA	CANCEL: Lo apaga todo y regresa al programa principal		;
;-----------------------------------------------------------------------------------------------;

; CANCEL	
;		**falta programa***

;-----------------------------------------------------------------------------------------------;
;		SUBRUTINA 	BOTON: Tabla del codigo para identificar la tecla pulsada	;
;-----------------------------------------------------------------------------------------------;

 BOTON ADDWF	pcl,f
	retlw 	0x01 	;columna 1 fila 1	BOTON	1 
	retlw 	0x06 	;columna 1 fila 2	BOTON	6
	retlw 	0x07 	;columna 1 fila 3	BOTON	7
	retlw 	0x0E 	;columna 1 fila 4	BOTON	AJUSTEhora	
	retlw 	0x02 	;columna 2 fila 1	BOTON	2
	retlw 	0x05 	;columna 2 fila 2	BOTON	5
	retlw 	0x08 	;columna 2 fila 3	BOTON	8
	retlw 	0x00 	;columna 2 fila 4	BOTON	0
	retlw 	0x03 	;columna 3 fila 1	BOTON	3
	retlw 	0x04 	;columna 3 fila 2	BOTON	4
	retlw 	0x09 	;columna 3 fila 3	BOTON	9
	retlw 	0x0F 	;columna 3 fila 4	BOTON	AJUSTEminuto
	retlw 	0x0A 	;columna 4 fila 1	BOTON	RELOJ
	retlw 	0x0B 	;columna 4 fila 2	BOTON	POTENCIA
	retlw 	0x0C 	;columna 4 fila 3	BOTON	CANCEL	
	retlw 	0x0D 	;columna 4 fila 4	BOTON	INICIO

;-----------------------------------------------------------------------------------------------;
;		SUBRUTINA 	7SEGMENTOS: Tabla de 7 SEGMENTOS a ENCENDER			;
;-----------------------------------------------------------------------------------------------;

 SEGMENTOS	ADDWF	pcl,f
			retlw 	0x3F 	; mostrar 0 
			retlw 	0x06 	; mostrar 1
			retlw 	0x5B 	; mostrar 2
			retlw 	0x4F 	; mostrar 3	
			retlw 	0x66 	; mostrar 4
			retlw 	0x6D 	; mostrar 5
			retlw 	0x7D 	; mostrar 6
			retlw 	0x07 	; mostrar 7
			retlw 	0x7F 	; mostrar 8
			retlw 	0x67 	; mostrar 9
			retlw 	0x3E 	; mostrar d
			retlw 	0x5C 	; mostrar o
			retlw 	0x50 	; mostrar r
			retlw 	0x73 	; mostrar P
			retlw 	0x76 	; mostrar H
			retlw	0x40	; mostrar el **guion**
			retlw 	0x00 	;no mostrar nada, todos los displays apagados

;		*TIENE QUE ESTAR EN UNA DIRECCION DE MEMORIA DE PROGRAMA QUE empiece EN XX00h retlw XXh**;


;-----------------------------------------------------------------------------------------------;
; 		SUBRUTINA	RELOJ: CONFIGURA LA HORA chequea la puerta			;
;-----------------------------------------------------------------------------------------------;

;	**FALTA PROGRAMA

;-----------------------------------------------------------------------------------------------;
; 		SUBRUTINA	MOSTRAR: Muestra 1 Barrido secuencial de los 4 displays		;
;						de 5ms aproximadamente				;
;						**CHEQUEO PUERTA***				;
;-----------------------------------------------------------------------------------------------;
 
 MOSTRAR MOVLW	b'00000001'	; RA3= 0 RA2= 0 RA1= 0 RA0= 1 
		MOVWF	puertoa		; Enciendo el transistor de UNIDAD
		MOVF	unidad,	w	; toma el valor numerico del registro "unidad"
;		BTFSC	estado,	z	; Si **unidad** es 0d le sumo 10d para buscar valor en tabla
;		ADDLW	0Ah		; el valor correcto del **cero**
		CALL	SEGMENTOS	; Busco en tabla su equivalente en 7 segmentos	
		MOVWF	puertod
		CALL	BARRIDO		; Temporizacion de 5ms
		CLRF	puertoa		; apago transistores y establezco un tiempo muerto
		MOVLW	0X80
		MOVWF	retardar	; 2+(128d x 3 ciclo instruccion)= 0,384 msg
 tiempomuertou	DECFSZ	retardar,f	; No retorna hasta q "retardar" no llegue a cero
		GOTO	tiempomuertou
		MOVLW	b'00000010'	; RA3= 0 RA2= 0 RA1= 1 RA0= 0 
		MOVWF	puertoa		; Enciendo el transistor de DECENA
		MOVF	decena,	w	; toma el valor numerico del registro "decena"
;		BTFSC	estado,	z	; Si **unidad** es 0d le sumo 10d para buscar valor en tabla
;		ADDLW	0Ah		; el valor correcto del **cero**
		CALL	SEGMENTOS	; Busco en tabla su equivalente en 7 segmentos	
		MOVWF	puertod
		CALL	BARRIDO		; Temporizacion de 5ms
		CLRF	puertoa		; apago transistores y establezco un tiempo muerto
		MOVLW	0X80
		MOVWF	retardar	; 2+(128d x 3 ciclo instruccion)= 0,384 msg
tiempomuertod	DECFSZ	retardar,f	; No retorna hasta q "retardar" no llegue a cero
		GOTO	tiempomuertod
		MOVLW	b'00000100'	; RA3= 0 RA2= 1 RA1= 0 RA0= 0 
		MOVWF	puertoa		; Enciendo el transistor de CENTENA
		MOVF	centena,w	; toma el valor numerico del registro "centena"
;		BTFSC	estado,	z	; Si **unidad** es 0d le sumo 10d para buscar valor en tabla
;		ADDLW	0Ah		; el valor correcto del **cero**
		CALL	SEGMENTOS	; Busco en tabla su equivalente en 7 segmentos	
		MOVWF	puertod
		CALL	BARRIDO		; Temporizacion de 5ms
		CLRF	puertoa		; apago transistores y establezco un tiempo muerto
		MOVLW	0X80
		MOVWF	retardar	; 2+(128d x 3 ciclo instruccion)= 0,384 msg
 tiempomuertoc	DECFSZ	retardar,f	; No retorna hasta q "retardar" no llegue a cero
		GOTO	tiempomuertoc
		MOVLW	b'00001000'	; RA3= 1 RA2= 0 RA1= 0 RA0= 0 
		MOVWF	puertoa		; Enciendo el transistor de unidad de MIL
		MOVF	mil,w		; toma el valor numerico del registro "mil"
		CALL	SEGMENTOS	; Busco en tabla su equivalente en 7 segmentos	
		MOVWF	puertod
		CALL	BARRIDO		; Temporizacion de 5ms
		CLRF	puertoa		; apago transistores y establezco un tiempo muerto
		MOVLW	0X80		; de 384us
		MOVWF	retardar	; 2+(128d x 3 ciclo instruccion)= 0,384 msg
 tiempomuertom	DECFSZ	retardar,f	; No retorna hasta q "retardar" no llegue a cero
		GOTO	tiempomuertom
		RETURN

;-----------------------------------------------------------------------------------------------;
; 		SUBRUTINA	BARRIDO: Temporizacion de 5ms para el barrido de displays	;
;						**chequea la puerta**				;
;-----------------------------------------------------------------------------------------------;

 BARRIDO	movlw	6h        	; 1 set numero de repeticion  (B)
        	movwf   barrido0    	; 1 
 PLoop1  	movlw   207h      	; 1 set numero de repeticion  (A)
        	movwf   barrido1     	; 1 
 PLoop2     BTFSS 	puertoa,swpuerta	; Chequea condicion de la puerta
;		GOTO	CANCEL		; Si la puerta esta abierta, el bit 5=0
			decfsz  barrido1,f	; 1 + (1) es el tiempo 0  ? (A)
        	goto    PLoop2    	; 2 no, loop
        	decfsz  barrido0,f 	; 1 + (1) es el tiempo 0  ? (B)
        	goto    PLoop1    	; 2 no, loop
 PDelL1  	goto 	PDelL2         	; 2 ciclos delay
 PDelL2  	return			; 2+2 Fin.

;_______________________________________________________________________________________________________;
;_______________________________________________________________________________________________________;


;Dudas: Numero de la direccion donde va la tabla
;	Estoy en una subrutina y hago un GOTO al programa principal, Q pasa con el PC?
