Hola:
Espero que estén bien configuradas las entradas o salidas en digitales en vez de analógico.
Librería LCD_4BIT.INC por aquí configuro los puertos y espero que no estén en analógicos.
El bus I2C también lo he modificado para el 16F886, espero que esté bien.
La EEPROM 24LC256.
Si lo deseas, te paso los archivos completos con esquema Proteus por e-mail. No encuentro la manera de que me funcione, a lo mejor es eso del puerto que lo tengo enanalógico y no lo se.
Saludo.
			Espero que estén bien configuradas las entradas o salidas en digitales en vez de analógico.
Código (asm) [Seleccionar] 
; ZONA DE DATOS **********************************************************************
	TITLE		"LCD Sensor PS2"
	SUBTITLE	"Revisión 1.00"
	LIST		P=16F886
	INCLUDE		<P16F886.INC>
	__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
	CBLOCK	0x20
	Contador
	Apuntador
	ENDC
PAGINA	EQU	0x00
ULTIMO_MENSAJE	EQU	.10				; Señala el número del último mensaje.
#DEFINE		RESET_RC0	PORTC,0
#DEFINE		EJECT_RC1	PORTC,1
#DEFINE		OPEN_RC2	PORTC,2
#DEFINE		CLOSE_RC3	PORTC,3
#DEFINE		GREEN_RC4	PORTC,4
#DEFINE		RED_RC5		PORTC,5
#DEFINE		Auxiliar_6	PORTC,6
#DEFINE		Auxiliar_7	PORTC,7
; ZONA DE CÓDIGOS ********************************************************************
	ORG 	0						; El programa comienza en la dirección 0.
Inicio
	call	LCD_Inicializa
	BANKSEL	TRISC					; Banco 1.
	bsf		RESET_RC0					; Se configura como entradas.
	bsf		EJECT_RC1
	bsf		OPEN_RC2
	bsf		CLOSE_RC3					
	bsf		GREEN_RC4
	bsf		RED_RC5
	bsf		Auxiliar_6
	bsf		Auxiliar_7
	BANKSEL	PORTC					; Banco 0.
	clrw
	clrf	Apuntador				; Inicializa el contador
Principal
	movf	Apuntador,W				; Apunta al inicio de cada mensaje ya que esta
	call	M24LC256_Mensaje_a_LCD	; subrutina lo carga en (M24LC256_AddressHigh).
	call	Retardo_2s				; Visualiza el mensaje durante este tiempo.
	incf	Apuntador,F				; Apunta al siguiente mensaje.
	movf	Apuntador,W				; Comprueba si ha llegado al último mensaje.
	sublw	ULTIMO_MENSAJE			; (W)=ULTIMO_MENSAJE-(Apuntador).
	btfss	STATUS,C				; ¿C=1?, ¿(W) positivo?
	clrf	Apuntador				; Ha resultado ULTIMO_MENSAJE<(Apuntador).
	goto	Principal
	movf	PORTC,W				; Lee los sensores.
	andlw	b'00111111'			; Máscara para quedarse con el valor de los sensores.
	addwf	PCL,F				; Salta a la configuración adecuada.
	goto	Configuracion0		; 0 0 0 0 0 0
	goto	Configuracion1		; 0 0 0 0 0 1
	goto	Configuracion2		; 0 0 0 0 1 0
	goto	Configuracion3		; 0 0 0 0 1 1
	goto	Configuracion4		; 0 0 0 1 0 0
	goto	Configuracion5		; 0 0 0 1 0 1
	goto	Configuracion6		; 0 0 0 1 1 0
	goto	Configuracion7		; 0 0 0 1 1 1
	goto	Configuracion8		; 0 0 1 0 0 0
	goto	Configuracion9		; 0 0 1 0 0 1
	goto	Configuracion10		; 0 0 1 0 1 0
	goto	Configuracion11		; 0 0 1 0 1 1
	goto	Configuracion12		; 0 0 1 1 0 0
	goto	Configuracion13		; 0 0 1 1 0 1
	goto	Configuracion14		; 0 0 1 1 1 0
	goto	Configuracion15		; 0 0 1 1 1 1
	goto	Configuracion16		; 0 1 0 0 0 0
	goto	Configuracion17		; 0 1 0 0 0 1
	goto	Configuracion18		; 0 1 0 0 1 0
	goto	Configuracion19		; 0 1 0 0 1 1
	goto	Configuracion20		; 0 1 0 1 0 0
	goto	Configuracion21		; 0 1 0 1 0 1
	goto	Configuracion22		; 0 1 0 1 1 0
	goto	Configuracion23		; 0 1 0 1 1 1
	goto	Configuracion24		; 0 1 1 0 0 0
	goto	Configuracion25		; 0 1 1 0 0 1
	goto	Configuracion26		; 0 1 1 0 1 0
	goto	Configuracion27		; 0 1 1 0 1 1
	goto	Configuracion28		; 0 1 1 1 0 0
	goto	Configuracion29		; 0 1 1 1 0 1
	goto	Configuracion30		; 0 1 1 1 1 0
	goto	Configuracion31		; 0 1 1 1 1 1
	goto	Configuracion32
	goto	Configuracion33
	goto	Configuracion34
	goto	Configuracion35
	goto	Configuracion36
	goto	Configuracion37
	goto	Configuracion38
	goto	Configuracion39
	goto	Configuracion40
	goto	Configuracion41
	goto	Configuracion42
	goto	Configuracion43
	goto	Configuracion44
	goto	Configuracion45
	goto	Configuracion46
	goto	Configuracion47
	goto	Configuracion48
	goto	Configuracion49
	goto	Configuracion50
	goto	Configuracion51
	goto	Configuracion52
	goto	Configuracion53
	goto	Configuracion54
	goto	Configuracion55
	goto	Configuracion56
	goto	Configuracion57
	goto	Configuracion58
	goto	Configuracion59
	goto	Configuracion60
	goto	Configuracion61
	goto	Configuracion62
	goto	Configuracion63
Configuracion0						
	goto	ActivaSalida
Configuracion1						
	goto	ActivaSalida
Configuracion2					
	goto	ActivaSalida
Configuracion3					
	goto	ActivaSalida
Configuracion4
	goto	ActivaSalida
Configuracion5
	goto	ActivaSalida
Configuracion6
	goto	ActivaSalida
Configuracion7
	goto	ActivaSalida
Configuracion8
	goto	ActivaSalida
Configuracion9
	goto	ActivaSalida
Configuracion10
	goto	ActivaSalida
Configuracion11
	goto	ActivaSalida
Configuracion12
	goto	ActivaSalida
Configuracion13
	goto	ActivaSalida
Configuracion14
	goto	ActivaSalida
Configuracion15
	goto	ActivaSalida
Configuracion16
	goto	ActivaSalida
Configuracion17
	goto	ActivaSalida
Configuracion18
	goto	ActivaSalida
Configuracion19
	goto	ActivaSalida
Configuracion20
	goto	ActivaSalida
Configuracion21
	goto	ActivaSalida
Configuracion22
	goto	ActivaSalida
Configuracion23
	goto	ActivaSalida
Configuracion24
	goto	ActivaSalida
Configuracion25
	goto	ActivaSalida
Configuracion26
	goto	ActivaSalida
Configuracion27
	goto	ActivaSalida
Configuracion28
	goto	ActivaSalida
Configuracion29
	goto	ActivaSalida
Configuracion30
	goto	ActivaSalida
Configuracion31
	goto	ActivaSalida
Configuracion32
	goto	ActivaSalida
Configuracion33
	goto	ActivaSalida
Configuracion34
	goto	ActivaSalida
Configuracion35
	goto	ActivaSalida
Configuracion36
	goto	ActivaSalida
Configuracion37
	goto	ActivaSalida
Configuracion38
	goto	ActivaSalida
Configuracion39
	goto	ActivaSalida
Configuracion40
	goto	ActivaSalida
Configuracion41
	goto	ActivaSalida
Configuracion42
	goto	ActivaSalida
Configuracion43
	goto	ActivaSalida
Configuracion44
	goto	ActivaSalida
Configuracion45
	goto	ActivaSalida
Configuracion46
	goto	ActivaSalida
Configuracion47
	goto	ActivaSalida
Configuracion48
	goto	ActivaSalida
Configuracion49
	goto	ActivaSalida
Configuracion50
	goto	ActivaSalida
Configuracion51
	goto	ActivaSalida
Configuracion52
	goto	ActivaSalida
Configuracion53
	goto	ActivaSalida
Configuracion54
	goto	ActivaSalida
Configuracion55
	goto	ActivaSalida
Configuracion56
	goto	ActivaSalida
Configuracion57
	goto	ActivaSalida
Configuracion58
	goto	ActivaSalida
Configuracion59
	goto	ActivaSalida
Configuracion60
	goto	ActivaSalida
Configuracion61
	goto	ActivaSalida
Configuracion62
	goto	ActivaSalida
Configuracion63
	goto	ActivaSalida
ActivaSalida
;	movwf	PORTB				
	goto 	Principal
;
; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
	addwf	PCL,F
Mensaje1
	DT	"aaaaaaaaaaaaaaaaaaaa", 0x00
Mensaje2
	DT	"bbbbbbbbbbbbbbbbbbbb", 0x00
Mensaje3
	DT 	"cccccccccccccccccccc", 0x00
Mensaje4
	DT	"dddddddddddddddddddd", 0x00
Mensaje5
	DT 	"e", 0x00
Mensaje6
	DT	"M", 0x00
Mensaje7
	DT 	"S", 0x00
Mensaje8
	DT	"M", 0x00
;
FinTabla
;MensajeAnuncio
;	DT " fgfd ", 0x00	
	IF (FinTabla > 0xFF)
		ERROR	"¡CUIDADO!: La tabla ha superado el tamaño de la página de los"
		MESSG	"primeros 256 bytes de memoria ROM. NO funcionará correctamente."
	ENDIF
	INCLUDE		<BIN_BCD.INC>
	INCLUDE  <BUS_I2C.INC>			; Subrutinas de control del bus I2C.
	INCLUDE  <M24LC256.INC>			; Subrutinas de control de la memoria 24LC256.
	INCLUDE  <LCD_4BIT.INC>
	INCLUDE  <LCD_MENS.INC>
	INCLUDE  <RETARDOS.INC>
	END
Librería LCD_4BIT.INC por aquí configuro los puertos y espero que no estén en analógicos.
Código (asm) [Seleccionar] 
;**************************** Librería "LCD_4BIT.INC"
; Estas subrutinas permiten realizar las tareas básicas de control de un módulo LCD de 2
; líneas por 16 caracteres, compatible con el modelo LM016L.
;
; El visualizador LCD está conectado al Puerto B del PIC mediante un bus de 4 bits. Las
; conexiones son:
; -	Las 4 líneas superiores del módulo LCD, pines <DB7:DB4>  se conectan a las 4
;	líneas superiores del Puerto B del PIC, pines <RB7:RB4>.
; -	Pin RS del LCD a la línea RA0 del PIC.
; -	Pin R/W del LCD a la línea RA1 del PIC, o a masa.
; -	Pin Enable del LCD a la línea RA2 del PIC.
;
; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la librería
; RETARDOS.INC.
;
; ZONA DE DATOS *********************************************************************
	CBLOCK
	LCD_Dato
	LCD_GuardaDato
	LCD_GuardaTRISB
	LCD_Auxiliar1
	LCD_Auxiliar2
	ENDC
LCD_CaracteresPorLinea	EQU	.20			; Número de caracteres por línea de la pantalla.
#DEFINE  	LCD_PinRS		PORTB,0
#DEFINE  	LCD_PinRW		PORTB,1
#DEFINE  	LCD_PinEnable	PORTB,2
#DEFINE		LCD_BusDatos	PORTB
; Subrutina "LCD_Inicializa" ------------------------------------------------------------
;
; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software,
; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
; configuración inicial hay que hacerla como sigue:
;
LCD_Inicializa					
	BANKSEL	ANSEL                                     
    clrf	ANSEL					; E/S Digitales.
	clrf	ANSELH
	BANKSEL	TRISB
	bcf		LCD_PinRS				; R/W y E.
	bcf		LCD_PinEnable
	bcf		LCD_PinRW
	BANKSEL	TRISA
	clrf	TRISA
	clrf	TRISB
	BANKSEL	PORTA
	bcf		LCD_PinRW				; En caso de que esté conectado le indica
									; que se va a escribir en el LCD.
	bcf		LCD_PinEnable			; Impide funcionamiento del LCD poniendo E=0.
	bcf 	LCD_PinRS				; Activa el Modo Comando poniendo RS=0.
	call	Retardo_20ms
	movlw	b'00110000'	
	call	LCD_EscribeLCD			; Escribe el dato en el LCD.
	call	Retardo_5ms	
	movlw	b'00110000'	
	call	LCD_EscribeLCD
	call	Retardo_200micros
	movlw	b'00110000'	
	call	LCD_EscribeLCD
	call	Retardo_20micros		; Este retardo es necesario para simular en PROTEUS.
	movlw	b'00100000'				; Interface de 4 bits.
	call	LCD_EscribeLCD
	call	Retardo_20micros		; Este retardo es necesario para simular en PROTEUS.
	
; Ahora configura el resto de los parámetros: 
	call	LCD_2Lineas4Bits5x7		; LCD de 2 líneas y caracteres de 5x7 puntos.
	call	LCD_Borra				; Pantalla encendida y limpia. Cursor al principio
	call	LCD_CursorOFF			; de la línea 1. Cursor apagado.
	call	LCD_CursorIncr			; Cursor en modo incrementar.
	return
; Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
;
; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
; vuelve a enviar este dato sin cambiarlo.
LCD_EscribeLCD
	andlw	b'11110000'				; Se queda con el nibble alto del dato que es el
	movwf	LCD_Dato				; que hay que enviar y lo guarda.
	movf	LCD_BusDatos,W			; Lee la información actual de la parte baja
	andlw	b'00001111'				; del Puerto B, que no se debe alterar.
	iorwf	LCD_Dato,F				; Enviará la parte alta del dato de entrada
									; y en la parte baja lo que había antes.
	BANKSEL	TRISB					; Acceso al Banco 1.
	movf	TRISB,W					; Guarda la configuración que tenía antes TRISB.
	movwf	LCD_GuardaTRISB
	movlw	b'00001111'				; Las 4 líneas inferiores del Puerto B se dejan 
	andwf	PORTB,F					; como estaban y las 4 superiores como salida.
	BANKSEL	PORTB					; Acceso al Banco 0.
;
	movf	LCD_Dato,W				; Recupera el dato a enviar.
	movwf	LCD_BusDatos			; Envía el dato al módulo LCD.
	bsf		LCD_PinEnable			; Permite funcionamiento del LCD mediante un pequeño
	bcf		LCD_PinEnable			; pulso y termina impidiendo el funcionamiento del LCD.
	BANKSEL	TRISB					; Acceso al Banco 1. Restaura el antiguo valor en
	movf	LCD_GuardaTRISB,W		; la configuración del Puerto B.
	movwf	TRISB
	BANKSEL	PORTB					; Acceso al Banco 0.
	return
; Subrutinas variadas para el control del módulo LCD -----------------------------------------
;
;Los comandos que pueden ser ejecutados son:
;
LCD_CursorIncr						; Cursor en modo incrementar.
	movlw	b'00000110'
	goto	LCD_EnviaComando
LCD_Linea1							; Cursor al principio de la Línea 1.
	movlw	b'10000000'				; Dirección 00h de la DDRAM
	goto	LCD_EnviaComando
LCD_Linea2							; Cursor al principio de la Línea 2.
	movlw	b'11000000'				; Dirección 40h de la DDRAM
	goto	LCD_EnviaComando
LCD_Linea3							; Cursor al principio de la Línea 3
	movlw	b'10010100'				; Dirección 14h de la DDRAM
	goto	LCD_EnviaComando
LCD_Linea4							; Cursor al principio de la Línea 4
	movlw	b'11010100'				; Dirección 54h de la DDRAM
	goto	LCD_EnviaComando
LCD_PosicionLinea1					; Cursor a posición de la Línea 1, a partir de la
	iorlw	b'10000000'				; dirección 00h de la DDRAM más el valor del
	goto	LCD_EnviaComando		; registro W.
LCD_PosicionLinea2					; Cursor a posición de la Línea 2, a partir de la
	iorlw	b'11000000'				; dirección 40h de la DDRAM más el valor del
	goto	LCD_EnviaComando		; registro W.
LCD_OFF								; Pantalla apagada.
	movlw	b'00001000'
	goto	LCD_EnviaComando
LCD_CursorON						; Pantalla encendida y cursor encendido.
	movlw	b'00001110'
	goto	LCD_EnviaComando
LCD_CursorOFF						; Pantalla encendida y cursor apagado.
	movlw	b'00001100'
	goto	LCD_EnviaComando
LCD_Borra							; Borra toda la pantalla, memoria DDRAM y pone el 
	movlw	b'00000001'				; cursor a principio de la línea 1.
	goto	LCD_EnviaComando
LCD_2Lineas4Bits5x7					; Define la pantalla de 2 líneas, con caracteres
	movlw	b'00101000'				; de 5x7 puntos y conexión al PIC mediante bus de
;	goto	LCD_EnviaComando		; 4 bits. 
; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ------------------------------------
;
; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de
; comando ha sido entregada a través del registro W.  Trabaja en Modo Comando.
; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a
; a través del registro W. Trabaja en Modo Dato.
;
LCD_EnviaComando
	bcf		LCD_PinRS				; Activa el Modo Comando, poniendo RS=0.
	goto	LCD_Envia
LCD_Caracter
	bsf		LCD_PinRS				; Activa el "Modo Dato", poniendo RS=1.
	call	LCD_CodigoCGROM			; Obtiene el código para correcta visualización.
LCD_Envia
	movwf	LCD_GuardaDato			; Guarda el dato a enviar.
	call	LCD_EscribeLCD			; Primero envía el nibble alto.
	swapf	LCD_GuardaDato,W		; Ahora envía el nibble bajo. Para ello pasa el
									; nibble bajo del dato a enviar a parte alta del byte.
	call	LCD_EscribeLCD			; Se envía al visualizador LCD.
	btfss	LCD_PinRS				; Debe garantizar una correcta escritura manteniendo 
	call	Retardo_2ms				; 2 ms en modo comando y 50 µs en modo cáracter.
	call	Retardo_50micros
	return	
; Subrutina "LCD_CodigoCGROM" -----------------------------------------------------------
;
; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la
; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código
; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh.
;
; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que
; que puedan ser visualizado en el módulo LM016L.
; 
; Entrada:	En (W) el código ASCII del carácter que se desea visualizar.
; Salida:	En (W) el código definido en la tabla CGROM.
LCD_CodigoCGROM
	movwf	LCD_Dato				; Guarda el valor del carácter y comprueba si es
LCD_EnheMinuscula					; un carácter especial.
	sublw	'ñ' 					; ¿Es la "ñ"?
	btfss	STATUS,Z
	goto	LCD_EnheMayuscula		; No es "ñ".
	movlw	b'11101110'				; Código CGROM de la "ñ".
	movwf	LCD_Dato
	goto	LCD_FinCGROM
LCD_EnheMayuscula
	movf	LCD_Dato,W				; Recupera el código ASCII de entrada.
	sublw	'Ñ' 					; ¿Es la "Ñ"?
	btfss	STATUS,Z
	goto	LCD_Grado				; No es "Ñ".
	movlw	b'11101110'				; Código CGROM de la "ñ". (No hay símbolo para
	movwf	LCD_Dato				; la "Ñ" mayúscula en la CGROM).
	goto	LCD_FinCGROM	
LCD_Grado
	movf	LCD_Dato,W				; Recupera el código ASCII de entrada.
	sublw	'º' 					; ¿Es el símbolo "º"?
	btfss	STATUS,Z
	goto	LCD_FinCGROM			; No es "º".
	movlw	b'11011111'				; Código CGROM del símbolo "º".
	movwf	LCD_Dato
LCD_FinCGROM
	movf	LCD_Dato,W				; En (W) el código buscado.
	return
; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" --------------------------------
;
; Visualiza espacios en blanco.
LCD_LineaEnBlanco
	movlw	LCD_CaracteresPorLinea
	goto	LCD_EnviaBlancos
LCD_UnEspacioBlanco
	movlw	.1
	goto	LCD_EnviaBlancos
LCD_DosEspaciosBlancos
	movlw	.2
	goto	LCD_EnviaBlancos
LCD_TresEspaciosBlancos
	movlw	.3
LCD_EnviaBlancos
	movwf	LCD_Auxiliar1			; (LCD_Auxiliar1) se utiliza como contador.
LCD_EnviaOtroBlanco	
	movlw	' '						; Esto es un espacio en blanco.
	call	LCD_Caracter			; Visualiza tanto espacios en blanco como se
	decfsz	LCD_Auxiliar1,F			; haya cargado en (LCD_Auxiliar1).
	goto	LCD_EnviaOtroBlanco
	return
; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" --------------------------------------------
;
; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el
; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE".
;
; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero 
; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE"
; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante).
;
; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante.
;
LCD_Byte
	movwf	LCD_Auxiliar2			; Guarda el valor de entrada.
	andlw	b'11110000'				; Analiza si el nibble alto es cero.
	btfss	STATUS,Z				; Si es cero lo apaga.
	goto	LCD_VisualizaAlto		; No es cero y lo visualiza.
	movlw	' '						; Visualiza un espacio en blanco.
	call	LCD_Caracter
	goto	LCD_VisualizaBajo
LCD_ByteCompleto
	movwf	LCD_Auxiliar2			; Guarda el valor de entrada.
LCD_VisualizaAlto
	swapf	LCD_Auxiliar2,W			; Pone el nibble alto en la parte baja.
	call	LCD_Nibble				; Lo visualiza.
LCD_VisualizaBajo
	movf	LCD_Auxiliar2,W			; Repite el proceso con el nibble bajo.
;	call	LCD_Nibble				; Lo visualiza.
;	return
; Subrutina "LCD_Nibble" ----------------------------------------------------------------
;
; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble
; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos:
; - Si (W)=b'01010110', se visualizará "6". 
; - Si (W)=b'10101110', se visualizará "E". 
;
LCD_Nibble
	andlw	b'00001111'				; Se queda con la parte baja.
	movwf	LCD_Auxiliar1			; Lo guarda.
	sublw	0x09					; Comprueba si hay que representarlo con letra.
	btfss	STATUS,C	
	goto	LCD_EnviaByteLetra
	movf	LCD_Auxiliar1,W
	addlw	'0'						; El número se pasa a carácter ASCII sumándole
	goto 	LCD_FinVisualizaDigito	; el ASCII del cero y lo visualiza.
LCD_EnviaByteLetra
	movf	LCD_Auxiliar1,W
	addlw	'A'-0x0A				; Sí, por tanto, se le suma el ASCII de la 'A'.
LCD_FinVisualizaDigito
	goto	LCD_Caracter			; Y visualiza el carácter. Se hace con un "goto"
									; para no sobrecargar la pila.
El bus I2C también lo he modificado para el 16F886, espero que esté bien.
Código (asm) [Seleccionar] 
;**************************** Librería "BUS_I2C.INC" 
;
; Estas subrutinas permiten realizar las tareas básicas de control del bus serie I2C, 
; por parte de un solo microcontrolador maestro.
;
; ZONA DE DATOS *****************************
;
	CBLOCK
	I2C_ContadorBits				; Cuenta los bits a transmitir o a recibir.
	I2C_Dato						; Dato a transmitir o recibido.
	I2C_Flags						; Guarda la información del estado del bus I2C.
	ENDC
#DEFINE I2C_UltimoByteLeer	I2C_Flags,0
;    -  (I2C_UltimoByteLeer)=0, NO es el último byte a leer por el maestro.
;    -  (I2C_UltimoByteLeer)=1, SÍ es el último byte a leer por el maestro.
; La definición de las líneas SCL y SDA del bus I2C se puede cambiar según las
; necesidades del hardware.
#DEFINE SCL	PORTA,3					; Línea SCL del bus I2C.
#DEFINE SDA	PORTA,4					; Línea SDA del bus I2C.
;
; Subrutina "SDA_Bajo" ------------------------------------------------------------------
;
SDA_Bajo
	bcf		STATUS,RP1
	bsf		STATUS,RP0				; Configura la línea SDA como salida.
	bcf		SDA
	bcf		STATUS,RP1
	bcf		STATUS,RP0
	bcf		SDA						; SDA en bajo.
	return
;
; Subrutina "SDA_AltaImpedancia" --------------------------------------------------------
;
SDA_AltaImpedancia
	bcf		STATUS,RP1
	bsf		STATUS,RP0				; Configura la línea SDA entrada.
	bsf		SDA						; Lo pone en alta impedancia y, gracias a la
	bcf		STATUS,RP1
	bcf		STATUS,RP0				; Rp de esta línea, se mantiene a nivel alto.
	return
;
; Subrutina "SCL_Bajo" ------------------------------------------------------------------
;
SCL_Bajo
	bcf		STATUS,RP1
	bsf		STATUS,RP0
	bcf		SCL						; Configura la línea SCL como salida.
	bcf		STATUS,RP1
	bcf		STATUS,RP0
	bcf		SCL						; La línea de reloj SCL en bajo.
	return
;
; Subrutina "SCL_AltaImpedancia" --------------------------------------------------------
;
SCL_AltaImpedancia
	bcf		STATUS,RP1
	bsf		STATUS,RP0				; Configura la línea SCL entrada.
	bsf		SCL						; Lo pone en alta impedancia y, gracias a la Rp
	bcf		STATUS,RP1
	bcf		STATUS,RP0				; de esta línea, se mantiene a nivel alto.
SCL_EsperaNivelAlto
	btfss	SCL						; Si algún esclavo mantiene esta línea en bajo
	goto	SCL_EsperaNivelAlto		; hay que esperar.
	return
;
; Subrutina "I2C_EnviaStart" ------------------------------------------------------------
;
; Esta subrutina envía una condición de Start o inicio.
;
I2C_EnviaStart
	call	SDA_AltaImpedancia		; Línea SDA en alto.
	call	SCL_AltaImpedancia		; Línea SCL en alto.
	call	Retardo_4micros			; Tiempo tBUF del protocolo.
	call	SDA_Bajo				; Flanco de bajada de SDA mientras SCL está alto.
	call	Retardo_4micros			; Tiempo tHD;STA del protocolo.
	call	SCL_Bajo				; Flanco de bajada del reloj SCL.
	call	Retardo_4micros	
	return
;
; Subrutina "I2C_EnviaStop" -------------------------------------------------------------
;
; Esta subrutina envía un condición de Stop o parada.
;
I2C_EnviaStop
	call	SDA_Bajo
	call	SCL_AltaImpedancia		; Flanco de subida de SCL.
	call	Retardo_4micros			; Tiempo tSU;STO del protocolo.
	call	SDA_AltaImpedancia		; Flanco de subida de SDA.
	call	Retardo_4micros			; Tiempo tBUF del protocolo.
	return
;
; Subrutina "I2C_EnviaByte" -------------------------------------------------------------
;
; El microcontrolador maestro transmite un byte por el bus I2C, comenzando por el bit
; MSB. El byte a transmitir debe estar cargado previamente en el registro de trabajo W.
; De la subrutina ejecutada anteriormente I2C_EnviaStart o esta misma I2C_EnviaByte, 
; la línea SCL se debe encontrar a nivel bajo al menos durante 5 µs.
;
I2C_EnviaByte
	movwf	I2C_Dato				; Almacena el byte a transmitir.
	movlw	0x08					; A transmitir 8 bits.
	movwf	I2C_ContadorBits
I2C_EnviaBit
	rlf		I2C_Dato,F				; Chequea el bit, llevándolo previamente al Carry.
	btfsc	STATUS,C
	goto	I2C_EnviaUno
I2C_EnviaCero
	call	SDA_Bajo				; Si es "0" envía un nivel bajo.
	goto	I2C_FlancoSCL
I2C_EnviaUno
	call	SDA_AltaImpedancia		; Si es "1" lo activará a alto.
I2C_FlancoSCL
	call	SCL_AltaImpedancia		; Flanco de subida del SCL.
	call	Retardo_4micros			; Tiempo tHIGH del protocolo.
	call	SCL_Bajo				; Termina el semiperiodo positivo del reloj.
	call	Retardo_4micros			; Tiempo tHD;DAT del protocolo.
	decfsz	I2C_ContadorBits,F		; Lazo para los ocho bits.
	goto	I2C_EnviaBit
;
	call	SDA_AltaImpedancia		; Libera la línea de datos.
	call	SCL_AltaImpedancia		; Pulso en alto de reloj para que el esclavo
	call	Retardo_4micros			; pueda enviar el bit ACK.
	call	SCL_Bajo
	call	Retardo_4micros
	return
;
; Subrutina "I2C_LeeByte" ---------------------------------------------------------------
;
; El microcontrolador maestro lee un byte desde el esclavo conectado al bus I2C. El dato
; recibido se carga en el registro I2C_Dato y lo envía a la subrutina superior a través
; del registro W. Se empieza a leer por el bit de mayor peso MSB.
; De alguna de las subrutinas ejecutadas anteriormente I2C_EnviaStart, I2C_EnviaByte
; o esta misma I2C_LeeByte, la línea SCL lleva en bajo al menos 5 µs.
I2C_LeeByte
	movlw	0x08					; A recibir 8 bits.
	movwf	I2C_ContadorBits
	call	SDA_AltaImpedancia		; Deja libre la línea de datos.
I2C_LeeBit
	call	SCL_AltaImpedancia		; Flanco de subida del reloj.
	bcf		STATUS,C				; En principio supone que es "0".
	btfsc	SDA						; Lee el bit
	bsf		STATUS,C				; Si es "1" carga 1 en el Carry.
	rlf		I2C_Dato,F				; Lo introduce en el registro.
	call	SCL_Bajo				; Termina el semiperiodo positivo del reloj.
	call	Retardo_4micros			; Tiempo tHD;DAT del protocolo.
	decfsz	I2C_ContadorBits,F		; Lazo para los 8 bits.
	goto	I2C_LeeBit
;
; Chequea si este es el último byte a leer para enviar o no el bit de reconocimiento
; ACK en consecuencia.
;
	btfss 	I2C_UltimoByteLeer		; Si es el último, no debe enviar
									; el bit de reconocimiento ACK.
	call	SDA_Bajo				; Envía el bit de reconocimiento ACK
									; porque todavía no es el último byte a leer.
	call	SCL_AltaImpedancia		; Pulso en alto del SCL para transmitir el
	call	Retardo_4micros			; bit ACK de reconocimiento. Este es tHIGH.
	call	SCL_Bajo				; Pulso de bajada del SCL.
	call	Retardo_4micros
	movf	I2C_Dato,W				; El resultado se manda en el registro de
	return							; de trabajo W.	
La EEPROM 24LC256.
Código (asm) [Seleccionar] 
;**************************** Librería "M24LC256.INC" 
;
; Estas subrutinas permiten realizar las tareas de manejo de la memoria EEPROM serie
; 24LC256 que transmite y recibe la información vía serie a través de un bus I2C.
;
; Subrutina "M24LC256_InicializaEscritura" ----------------------------------------------
;
; Prepara la memoria para iniciar su escritura a partir de la posición de memoria fijada
; por los registros:
; - (M24LC256_AddressHigh), indica el número del bloque o página de memoria a escribir.
; - (M24LC256_AddressLow), indica posición a escribir dentro del bloque.
	CBLOCK
	M24LC256_AddressHigh			; Guarda el valor de la dirección de memoria a 
	M24LC256_AddressLow				; escribir o leer.
	M24LC256_Dato
	ENDC
;
M24LC256_DIR_ESCRITURA	 EQU	b'10100000'; Dirección de la memoria 24LC256 para
M24LC256_DIR_LECTURA	 EQU	b'10100001'; escritura y lectura respectivamente.
M24LC256_InicializaEscritura
	call	I2C_EnviaStart				; Envía condición de Start.
	movlw	M24LC256_DIR_ESCRITURA		; Envía dirección de escritura del 
	call	I2C_EnviaByte				; esclavo.
	movf	M24LC256_AddressHigh,W		; A partir de la dirección apuntada por los 
	call	I2C_EnviaByte				; registros M24LC256_AddressHigh y
	movf	M24LC256_AddressLow,W		; M24LC256_AddressLow.
	call	I2C_EnviaByte
	return	
; Subrutina "M24LC256_InicializaLectura" ------------------------------------------------
;
; Prepara la memoria para iniciar su lectura a partir de la posición de memoria fijada
; por los registros:
; - (M24LC256_AddressHigh), indica el número del bloque o página de memoria a leer.
; - (M24LC256_AddressLow), indica posición a escribir dentro del bloque.
M24LC256_InicializaLectura
	bcf		I2C_UltimoByteLeer			; Todavía no ha comenzado a leer ningún dato.
	call	I2C_EnviaStart				; Envía condición de Start.
	movlw	M24LC256_DIR_ESCRITURA		; Envía dirección de escritura del 
	call	I2C_EnviaByte				; esclavo.
	movf	M24LC256_AddressHigh,W		; A partir de la dirección apuntada por los 
	call	I2C_EnviaByte				; registros M24LC256_AddressHigh y
	movf	M24LC256_AddressLow,W		; M24LC256_AddressLow.
	call	I2C_EnviaByte
	call	I2C_EnviaStop
;
	call	I2C_EnviaStart				; Envía condición de Start.
	movlw	M24LC256_DIR_LECTURA		; Indica a la memoria 24LC256 que va a 
	call	I2C_EnviaByte				; proceder a la lectura.
	return
; Subrutina "M24LC256_Mensaje_a_LCD" ----------------------------------------------------
;
; Lee el mensaje grabado en la memoria 24LC256 y lo visualiza en la pantalla del módulo LCD.
; En el registro de trabajo W se introduce la página de la memoria a partir de cuya primera
; posición se va a leer. La lectura termina cuando encuentre el código 0x00. Así por ejemplo,
; si (W)=2Fh lee el mensaje que comienza en la posición 0 de la página 2Fh de la memoria,
; que es la posición 2F00h absoluta. 
; 
	CBLOCK
;	M24LC256_ValorCaracter				; Valor ASCII del carácter leído.
	ENDC
;M24LC256_Mensaje_a_LCD
	movwf	M24LC256_AddressHigh		; Apunta al inicio de la página correspondiente.
	clrf	M24LC256_AddressLow
	call	M24LC256_InicializaLectura
M24LC256_LeeOtroByte
	call	I2C_LeeByte					; Lee la memoria 24LC256.
	movwf	M24LC256_ValorCaracter		; Guarda el valor de carácter.
	movf	M24LC256_ValorCaracter,F	; Lo único que hace es posicionar flag Z. En caso
	btfsc	STATUS,Z					; que sea "0x00", que es código indicador final	
	goto	M24LC256_FinMensaje			; del mensaje, sale de la subrutina.
	movf	M24LC256_ValorCaracter,W	; Recupera el valor leído.
	call	LCD_Caracter				; Lo visualiza en la pantalla del LCD.
	incf	M24LC256_AddressLow,F		; Apunta a la siguiente posición.
	goto	M24LC256_LeeOtroByte
;M24LC256_FinMensaje
;	call	M24LC_256_FinalizaLectura
;	return
; Subrutina "M24LC256_FinalizaLectura" ------------------------------------------------
;
; Activa el bit I2C_UltimoByteLeer para que la subrutina I2C_LeeByte ponga en alta
; impedancia la línea SDA y pueda ejecutarse posteriormente la condición de Start o Stop
; que fija el protocolo del bus I2C.
M24LC256_FinalizaLectura
	bsf	I2C_UltimoByteLeer				; Con estas dos instrucciones se pone en 
	call	I2C_LeeByte				 	; alta impedancia la línea SDA. No importa el
	call	I2C_EnviaStop				; resultado de la lectura realizada.
	return
; Subrutina "M24LC256_Mensaje_a_LCD" ----------------------------------------------------
;
; Lee un mensaje grabado en la memoria 24LC256 y lo visualiza por el módulo LCD. En caso que
; sea más largo que la longitud de la pantalla se desplaza hacia la izquierda con sensación
; de movimiento. En el registro de trabajo W se introduce la página de la memoria a partir
; de cuya primera posición va a leer. La visualización termina cuando encuentre el código
; 0x00. Así por ejemplo si (W)= 2Fh lee el mensaje que comienza en la posición 0 de la
; página 2Fh de la memoria, que es la posición 2F00h absoluta. 
; 
	CBLOCK
	M24LC256_ValorCaracter				; Valor ASCII del carácter leído.
	M24LC256_CursorPosicion
	ENDC
	
M24LC256_Mensaje_a_LCD
	bcf	I2C_UltimoByteLeer
	movwf	M24LC256_AddressHigh		; Apunta al inicio de la página correspondiente.
	clrf	M24LC256_AddressLow
	call	M24LC256_InicializaLectura
M24LC256_PrimeraPosicion
	clrf	M24LC256_CursorPosicion		; El cursor en la posición 0 de la línea.
	call	LCD_Borra					; Se sitúa en la primera posición de la línea 1 y
M24LC256_VisualizaCaracter				; borra la pantalla.
	movlw	LCD_CaracteresPorLinea		; ¿Ha llegado a final de línea?
	subwf	M24LC256_CursorPosicion,W
	btfss	STATUS,C
	goto	M24LC256_NoEsFinalLinea
M24LC256_EsFinalLinea
	call	Retardo_200ms				; Lo mantiene visualizado durante este tiempo.
	call	Retardo_200ms
	call	M24LC256_FinalizaLectura
	incf	M24LC256_AddressLow,F
	call	M24LC256_InicializaLectura
	goto	M24LC256_PrimeraPosicion
M24LC256_NoEsFinalLinea
	call	I2C_LeeByte					; Obtiene el ASCII del carácter apuntado.
	movwf	M24LC256_ValorCaracter		; Guarda el valor de carácter.
	movf	M24LC256_ValorCaracter,F	; Lo único que hace es posicionar flag Z. En caso
	btfsc	STATUS,Z					; que sea "0x00", que es código indicador final
	goto	M24LC256_FinMensaje			; de mensaje, sale fuera.
M24LC256_NoUltimoCaracter
	call	LCD_Caracter				; Visualiza el carácter ASCII leído.
	incf	M24LC256_CursorPosicion,F	; Contabiliza el incremento de posición del 
										; cursor en la pantalla.
	goto	M24LC256_VisualizaCaracter	; Vuelve a visualizar el siguiente carácter
M24LC256_FinMensaje						; de la línea.
	call	M24LC256_FinalizaLectura
	return
Si lo deseas, te paso los archivos completos con esquema Proteus por e-mail. No encuentro la manera de que me funcione, a lo mejor es eso del puerto que lo tengo enanalógico y no lo se.
Saludo.



