;
;					EJEMPLO 3.16
;
;				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 SAA1064. Controlador de displays 7 segmentos
;
;El programa explora el teclado de uPIC Trainer Plus y va visualizando sobre los cuatro
;displays gobernados por el dispositivo SAA1064, las pulsaciones según se van realizando.
;

		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 manejo del teclado
Digito_1	equ	0x18
Digito_2	equ	0x19
Digito_3	equ	0x1a		
Digito_4	equ	0x1b		;Buffer de salida al SAA1064 de los 4 dígitos		
Temp_1		equ	0x1c		;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

;**************************************************************************************
;VISUALIZA: Esta rutina recoge el valor de las cuatro variables "Dígito" y las transmi-
;te por el bus I2C para su visualización sobre los displays de uPIC Trainer Plus.

VISUALIZA:	call	Inicia_Bus	;Inicia líneas del bus I2C
		call	Txt_Start_Bit	;Envía condición de inicio
		movlw	b'01110110'
		movwf	DataByte
		call	Txt_Byte	;Transmite dirección del dispositivo (escritura)
		clrf	DataByte
		call	Txt_Byte	;Transmite byte de instrucción
		movlw	b'01000111'
		movwf	DataByte	
		call	Txt_Byte	;Transmite byte de control
		movf	Digito_1,W
		movwf	DataByte
		call	Txt_Byte	;Transmite Dígito 1
		movf	Digito_2,W
		movwf	DataByte
		call	Txt_Byte	;Transmite Dígito 2
		movf	Digito_3,W
		movwf	DataByte
		call	Txt_Byte	;Transmite Dígito 3
		movf	Digito_4,W
		movwf	DataByte
		call	Txt_Byte	;Transmite Dígito 4
		call	Txt_Stop_Bit	;Transmite secuencia de STOP
		return

;***************************************************************************************
;SCROLL: Esta rutina realiza un scroll del buffer de visualización. La variable Digito_4 
;pasa Digito_3 y se carga con la última tecla pulsada. Digito_3 pasa a Digito_2 y 
;Digito_2 a Digito_1.

SCROLL:		movf	Digito_2,W
		movwf	Digito_1
		movf	Digito_3,W
		movwf	Digito_2
		movf	Digito_4,W
		movwf	Digito_3
		movf	Temp_1,W
		movwf	Digito_4
		return

;*********************************************************************************
;Delay_20_ms: Esta rutina de temporización tiene por objeto eliminar el "efecto
;rebote" de los periféricos electromecánicos. Realiza un delay de 20 mS. Si el PIC
;trabaja a una frecuencia de 4MHz, el TMR0 evoluciona cada uS. Si queremos tempori-
;zar 20000 uS (20 mS) con un preescaler de 128, el TMR0 deberá contar 156 eventos
;(156 * 128). El valor 156 equivale a 9c hex. y como el TMR0 es ascedente habrá que
;cargar su complemento a 1 (63 hex.).

Delay_20_ms:	bcf	INTCON,T0IF	;Desconecta el flag de rebasamiento
		movlw	0x63		;Complemento hex. de 156
		movwf	TMR0		;carga el TMR0
Delay_20_ms_1	clrwdt			;Refrescar el WDT
		btfss	INTCON,T0IF	;Rebasamiento del TMR0 ??
		goto	Delay_20_ms_1	;Todavía no
		bcf	INTCON,T0IF	;Ahora si, reponer el flag
		return

Inicio:		clrf	PORTA
		clrf	PORTB
		bsf	STATUS,RP0	;Selecciona página 1 de datos
		movlw	b'00000011'
		movwf	TRISA		;RA0 y RA1 entradas
		clrf	TRISB		;Puerta A y B salidas
		movlw	b'10000110'	;Preescaler de 128 para el TMR0. Pull_Up Off
		movwf	OPTION_REG				
		bcf	STATUS,RP0	;Selecciona página 0 de datos	

		call	Inicia_Bus	;Inicia el bus I2C
		
		movlw	b'00111111'	;Código 7 segmentos del dígito 0
		movwf	Digito_1
		movwf	Digito_2
		movwf	Digito_3
		movwf	Digito_4	;Puesta a 0 de las variables de los dígitos
		call	VISUALIZA	;Visualiza sobre los displays
				
Loop:		clrwdt			;Refresca el WDT
		call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z	;Hay alguna pulsada ??
		goto	Loop		;No

		call	Key_BCD		;Convierte código de tecla a código BCD
		movf	Tecla,W		;Carga el código BCD de la tecla pulsada
		call	BCD_7seg	;Lo convierte a 7 segmentos
		movwf	Temp_1		;Lo guarda temporal
		call	SCROLL		;Realiza el SCROLL de visualización en el buffer
		call	VISUALIZA	;Visualiza el buffer

		call	Delay_20_ms	;Elimina rebotes
Loop_1		clrwdt			;Refresca el WDT
		call	Key_Scan
		movlw	0x80
		subwf	Tecla,W
		btfss	STATUS,Z	;Se mantiene todavía pulsada la tecla ??
		goto	Loop_1		;Si
	
		goto	Loop		;No, ya está liberada
		
		end			;Fin del programa fuente

