;
;					EJEMPLO 3.13
;
;				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 lee el estado lógico de las bornas D0-D7 que, en el Trainer PLUS, están conec-
;tadas a las líneas de E/S del PCF8574. Dicho estado se visualiza en la pantalla LCD de la
;uPIC Trainer.

		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
Lcd_var		equ	0x12		;Inicio de las variables del LCD
Temporal_1	equ	0x14		;Variable temporal
Temporal_2	equ	0x15		;Variable temporal
Temporal_3	equ	0x16		;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	"LCD_CXX.INC"	;Incluye rutinas de manejo del LCD

;******************************************************************************************
;Según el valor contenido en el registro W, se devuelve el carácter a visualizar

Tabla_Mensajes	movwf	PCL		;Calcula el desplazamiento sobre la tabla

Mens_0		equ	$
		dt	"7 6 5 4 3 2 1 0",0x00
		
;*************************************************************************************
;Mensaje: Esta rutina visualiza en el LCD el mensaje cuyo inicio está  indicado en
;el acumulador. El fin de un mensaje se determina mediante el código 0x00

Mensaje         movwf   Temporal_1      ;Salva posición de la tabla
Mensaje_1       movf    Temporal_1,W    ;Recupera posición de la tabla
                call    Tabla_Mensajes  ;Busca caracter de salida
                movwf   Temporal_2      ;Guarda el caracter
                movf    Temporal_2,F
                btfss   STATUS,Z        ;Mira si es el último
                goto    No_es_ultimo
                return
No_es_ultimo    call    LCD_DATO        ;Visualiza en el LCD
                incf    Temporal_1,F    ;Siguiente caracter
                goto    Mensaje_1 

Inicio:		clrf	PORTA	
		clrf	PORTB
		bsf	STATUS,RP0	;Selecciona página 1 de datos
		clrf	TRISA
		clrf	TRISB		;Puerta A y B salidas
		movlw	b'10001111'	;Preescaler de 128 para el WDT. Pull_Up Off
		movwf	OPTION_REG				
		bcf	STATUS,RP0	;Selecciona página 0 de datos	
		
		call	UP_LCD		;Configura el LCD
		call	LCD_INI		;Inicia el LCD
		movlw	b'00001100'
		call	LCD_REG		;LDC On, Cursor y Blink Off
		
		movlw	Mens_0
		call	Mensaje		;Visuliza mensaje de cabecera

Loop		clrwdt
		call	Inicia_Bus	;Inicia líneas del bus I2C
		caLL	Txt_Start_Bit	;Envía secuencia de inicio
		movlw	b'01110001'
		movwf	DataByte
		call	Txt_Byte	;Envía dirección del PCF8574 (modo lectura)
		bsf	_Ultimo_Byte	;Recibe un único byte cada vez
		call	RcvByte		;Espera recibir el último byte
		call	Txt_Stop_Bit	;Envía secuencia de stop
		
		movlw	.8
		movwf	Temporal_3	;Nº de bits a visualizar	
		call	UP_LCD		;Reconfigura E/S para el LCD
		movlw	0xc0
		call	LCD_REG		;Coloca el cursor en 2ª fila
Visual_Loop	rlf	DataByte,F
		btfsc	STATUS,C	;Testea el bit a visualizar
		goto	Bit_1		;Está a "1"
		movlw	'0'		;Está a "0"
		goto	Visual
Bit_1		movlw	'1'
Visual		call	LCD_DATO	;Visualiza código ASCII del bit
		movlw	' '
		call	LCD_DATO	;Visualiza espacio en blanco
		decfsz	Temporal_3,F	;Siguiente bit
		goto	Visual_Loop
		
		goto	Loop
		
		end			;Fin del programa fuente

