Hola, vamos por partes:
* el 16F84 es muy limitado (es el mas viejo de la 16F), poca memoria de codigo, y poca ram
* no tiene un periferico UART
Visto y considerando que hoy en dia es casi imposible usar el puerto paralelo (muchas computadoras no lo tienen; ademas yo lo descartaria), y el serie esta casi extinto tambien (EXCEPTO si se usan adaptadores usb-serie), te recomiendo 3 posibles soluciones:
- Usar un PIC con USB (como el 18F2550 o 18F4550)
Pero esto tiene un par de desventajas:
* necesitas saber programar en C18 o CCS (yo prefiero C18, siempre)
* necesitas armar una placa mas grande, ya que el 18F2550 tiene mas pines que el 16F84
* necesitas un programador que soporte a esos pics
No todo es malo:
* posibilidad de actualizar el firmware desde el mismo usb (bootloaders)
* transmision de datos confiable
* self-powered desde el Vbus (5V del usb, 500mA)
* ejecucion rapida de codigo
* perifericos: ADC, PWM, I2C, UART, comparadores, etc. - Usar un PIC con serie (como el 16F627 o 16F628)
Estos PICs son de la misma serie que el 16F84, tienen el mismo pinout y tienen un modo de oscilador interno (para que no se tenga que usar un XTAL).
Si tenes un programador para el 16F84, entonces seguramente funciona con estos pic (hay otros tambien, yo te comento nomas los que son mas comunes)
Si la PC donde lo pensas usar no tiene Serie, tenes que acoplarle un adaptador serie-usb (algunos cables de celulares viejos sirven)
La programacion la podes hacer en Assembler o en CCS (como estos pics tienen mucha mas memoria de codigo, te recomiendo CCS)
Igualmente estas limitado por la cantidad de pines, que te quedarian aproximadamente 12 - Usar el 16F84 con software UART (tanto en ASM como en CCS)
Visto y considerando que lo queres hacer con un 16F84, podes hacer rutinas por codigo, que emulan a un UART. Estas bloquean la ejecucion del codigo (si tenes que leer un byte), y ocupan mucho espacio en codigo
Como el 16F84 no tiene mucha capacidad, y lo que vos precisas hacer REQUIERE algun protocolo para la comunicacion serie (aunque sea recibir bytes y escribirlos en los puertos), puede que te quedes sin espacio.
Pero como la idea es sencilla, puede funcionar.
Nos quedamos con la 3º opcion, y usamos CCS.
Para empezar, del pinout tenemos:

Vamos a suponer que el RA0 y RA1 los usamos para el serie, y los demas quedan a disposicion como salidas.
#include <16F84A.h>
/* XT, sin WDT, sin CODE PROTECT */
#fuses XT, NOWDT, NOPROTECT
/* clock XT a 4MHz */
#use delay(clock=4000000)
/* nosotros configuramos el TRIS de cada puerto */
#use fast_io(A)
#use fast_io(B)
#define SERIAL_TX PIN_A1 // PORT A, pin 1 (RA1)
#define SERIAL_RX PIN_A0 // PORTA A, pin 0 (RA0)
#define SERIAL_BAUDS 9600 // 9600bps
#use rs232(baud=SERIAL_BAUDS, xmit=SERIAL_TX, rcv=SERIAL_RX)
void main (void)
{
char temp;
/* ambos puertos como salida */
set_tris_b(0x00);
set_tris_a(0x00);
while(1)
{
/* aqui hay que notar que, los 2 primeros bits, irian a parar a RA1 y RA0, los cuales estan en uso para el serie.
con un simple bitmask se borran de la data enviada desde la pc, pero en el puerto deben quedar iguales. */
temp = getc() & 0xFC; // al cuerno esos 2 bits
temp |= input_a() & 0x3; // aca se hace OR entre el byte leido, y SOLO los 2 bits del puerto A
output_a(temp); // aca se escriben derecho al puerto A
putc(input_a() & 0xFC); // se hace eco de lo que quedo en el puerto A (excepto los 2 ultimos bits)
output_b(getc()); // se lee y escribe al puerto B
putc(input_b()); // eco de lo que esta en puerto B
}
}
No lo probe, pero compila bien.
Bueno, entonces desde VB6 lo que necesitas hacer es enviar solo 2 bytes:
el 1º va al puerto A y el siguiente al B. esto se repite infinitas veces.
Una vez que envias algo, te deberia aparecer un "eco" de lo que se escribio a cada puerto.
el byte se envia binariamiente, no en modo ASCII.
Saludos!