;
;					EJEMPLO 3.12
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para MicroPIC Trainer y Trainer PLUS. Interface I2C gestionado por software.
;
;Haciendo uso de las rutinas incluidas en el fichero I2CLOW.INC, se trata de controlar
;el funcionamiento de los distintos dispositivos I2C, existentes en la tarjeta 
;Trainer PLUS. Estos dispositivos están conectados entre sí al bus I2C común. Se recomienda
;leer las especificaciones técnicas de los mismos, para tener un mayor conocimiento de las
;posibilidades de los mismos. Igualmente es importante desconectar los leds de la uPIC Trainer
;mediante el jumper J7 pues de lo contrario actuarían como carga adicional en las líneas RB6
;y RB7 que, en estos ejemplos, forman el bus I2C.
;
;El dispositivo I2C PCF8574. Puerto de E/S de 8 bits.
;
;Los leds de la Triner PLUS que pilotan el estado de las líneas de E/S del PCF8574 están 
;complementados. Es decir, se activan cuando la línea correspondiente está a "0".
;
;El programa explora el teclado de la Trainer PLUS y saca por la puerta de salida el valor
;binario del octeto tecleado. Este valor se verá reflejado en los leds que pilotan los 
;niveles lógicos presentes en las líneas de salidas.

		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos

CLKIN		equ	.4000000	;Frecuencia de trabajo
                 
I2c_var		equ	0x0c		;Inicio de las variables para rutinas I2C_LOW
Key_var		equ	0x12		;Inicio de las variables de Teclado
Temp_1		equ	0x18		;Variable temporal

		org	0x00		;Vector de reset
		goto	Inicio
		org	0x05		;Salvar el vector de interrupción	

		include	"I2CLOW.INC"	;Incluye las rutinas de manejo del bus I2C
		include	"TECLADO.INC"	;Incluye rutinas de manejo del teclado

;**************************************************************************************
;SALIDA: Esta rutina recoge el valor del octeto a sacar y vía I2C lo transmite al PCF
;8574  de la Trainer PLUS para que lo represente en los leds conectados a sus líneas de E/S.

SALIDA:		call	Inicia_Bus	;Inicia líneas del bus I2C
		call	Txt_Start_Bit	;Envía condición de inicio
		movlw	b'01110000'
		movwf	DataByte
		call	Txt_Byte	;Transmite dirección del dispositivo (escritura)
		movf	Temp_1,W
		movwf	DataByte
		call	Txt_Byte	;Transmite el octeto a sacar.		
		call	Txt_Stop_Bit	;Transmite secuencia de STOP
		return
 
Inicio:		clrf	PORTA	
		bsf	STATUS,RP0	;Selecciona página 1 de datos
		clrf	TRISA
		movlw	b'10001111'	;Preescaler de 128 para el WDT. Pull_Up Off
		movwf	OPTION_REG				
		bcf	STATUS,RP0	;Selecciona página 0 de datos	
			
Loop		clrwdt			;Refresca el WDT
		clrf	Temp_1
		call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z	;Hay alguna pulsada ??
		goto	Loop		;No
		call	Key_BCD		;Si.Convierte código de tecla a BCD
		swapf	Tecla,w
		movwf	Temp_1          ;Nible de más peso del octeto a sacar				

Loop_0_1	clrwdt			;Refresca el WDT
		call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,W		
		btfss	STATUS,Z	;Hay alguna pulsada ??
		goto	Loop_0_1	;Si, esperar
		
Loop_1:		clrwdt
		call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z	;Hay alguna pulsada ??
		goto	Loop_1		;No
		call    Key_BCD		;Si. Convierte código de tecla a BCD
		movf	Temp_1,W
		iorwf	Tecla,W		;Fusiona el 2º nible del octeto a sacar				
		movwf	Temp_1
		comf	Temp_1,F	;Complementa el octeto a sacar puesto que
					;los leds pilotos conectados a las líneas
					;son activos por nivel "0"
										
		call	SALIDA		;Salida del octeto

Loop_1_1	clrwdt			;Refresca el WDT
		call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,W		
		btfss	STATUS,Z	;Hay alguna pulsada ??
		goto	Loop_1_1	;Si, esperar
		goto	Loop
		
		end			;Fin del programa fuente

