En este proyecto, crearemos una biblioteca Arduino de puerto IO de 8 bits que lee y escribe los ocho bits en un solo comando combinando pines Arduino. Esto significa que será posible enviar y recibir datos de 8 bits desde un solo pin.
Arduino proporciona salida digital utilizando la función digitalWrite y recibe entrada digital a través de la función digitalRead. Al utilizar estas dos funciones, Arduino puede proporcionar salida o entrada desde cualquier pin. Sin embargo, Arduino normalmente sólo proporciona entrada o salida a un pin a la vez.
Por lo tanto, para conectar Arduino con un dispositivo IO de 8 bits, como una pantalla de 7 segmentos, interruptores DIP o DAC (convertidor digital a analógico), generalmente se requieren ocho pines diferentes. El patrón de bytes de datos (8 bits) se envía a diferentes pines como '1' y '0'. Por ejemplo, si un byte de datos es 37h (0011 0111), necesita enviar el patrón '0' y '1' a ocho pines diferentes usando la función digitalWrite.
Para resolver esta situación, creamos una biblioteca de puerto IO (puerto de entrada-salida) de 8 bits que combina los pines de Arduino. Funciona como un puerto IO de 8 bits para Arduino y configura la dirección de los datos como entrada o salida. La dirección de los datos está definida por el carácter 'O' para salida y 'I' para entrada.
Esta biblioteca tiene cinco funciones. Dos "constructores" crean los objetos de la puerta, incluida una función que envía una salida digital de 8 bits a los pines de la puerta y otra que recibe una entrada digital de 8 bits desde los pines de la puerta. Una tercera función cambia y establece la dirección de E/S del puerto. Las cinco funciones se explican a continuación.
Las cinco funciones
 1. IO_Port_8bit(int pin1,int pin2,int pin3,int pin4,int pin5,int pin6,int pin7,int pin8,directorio char)
 Este constructor crea objetos de esta clase. Puede crear uno o varios puertos de 8 bits combinando pines Arduino específicos. Es importante especificar qué ocho pines Arduino deben coincidir, junto con la dirección de datos de cada puerto (entrada o salida). El último argumento, dir, define si un puerto funciona como entrada o salida.
- Si dir='O' = el puerto funciona como salida
- Si dir='I' = el puerto actúa como entrada
Un mismo puerto no puede funcionar como entrada y salida de forma simultánea o alternativa. Se debe seleccionar la dirección del puerto o se producirá un error.
 2. IO_Port_8bit (int pin1, int pin2, int pin3, int pin4, int pin5, int pin6, int pin7, int pin8)
 Este es otro constructor, que crea objetos de esta clase. Puede crear uno o varios puertos de 8 bits combinando pines Arduino específicos. Es importante especificar qué ocho pines Arduino deben coincidir con cada puerto. Sin embargo, no es necesario incluir la dirección de los datos como entrada o salida.
En su lugar, después de crear un objeto de puerto usando este constructor, establezca la dirección del puerto usando la función set_IO_direction. Este constructor permite al programador cambiar la dirección de los datos del puerto en tiempo de ejecución. Así, un puerto puede funcionar como entrada o salida alternativamente (pero no simultáneamente).
 3. set_IO_direction (directorio de caracteres)
 Esta función especifica la dirección de entrada y salida de un puerto. Tiene un argumento de carácter, que es 'I' para un puerto de entrada y 'O' para un puerto de salida. Se mostrará un error en el monitor serie Arduino si no se selecciona la dirección de los datos.
 4. send_8_bit_data(int byt)
 
Esta función envía datos de 8 bits a pines específicos. Proporciona los datos 'int' (debe ser <255) como argumento, que se envía directamente a ocho pines diferentes. Si los datos son >255, se mostrará un error en el monitor serie Arduino.
 5. get_8bit_data (vacío)
 Esta función recibe datos de 8 bits de pines específicos. Devuelve datos 'int' de 8 bits leyendo el estado de los ocho pines diferentes.
Ejemplo 1: ocho LED parpadean alternativamente a una velocidad de 1 Hz
 #incluir
 IO_Port_8bit mipuerto(2,3,4,5,6,7,8,9,'O'); //crea puerto de salida
 configuración vacía // no se requiere nada en la configuración
 {
 }
 bucle vacío
 {
 
myport.send_8bit_data(85); // envía datos para hacer parpadear todos los LED impares
 retraso(500);
 myport.send_8bit_data(170); envía datos para hacer parpadear todos los LED pares
 retraso(500);
 }
Diagrama de circuito

Ejemplo 2: mostrar un patrón de conteo binario en los LED, de 0 a F
 #incluir
 IO_Port_8bit my8bitport(2,3,4,5,6,7,8,9);//crear objeto de puerto
 configuración nula
 {
 my8bitport.set_IO_direction('O');// establece la dirección del puerto
 }
 bucle vacío
 {
 ent yo;
 for(i=0;i<16;i++) //envía datos del 0 al 15 para su visualización
 
{ // patrón binario
 mipuerto.send_8bit_data(i);
 retraso(200);
 }
 }
Ejemplo 3: indicar el nivel de voltaje de entrada analógica en una pantalla gráfica de barras LED de 8 bits
 #incluir
 IO_Port_8bit mipuerto(2,3,4,5,6,7,8,9,'O'); //crea un objeto de puerto de salida
 configuración nula
 {
 myport.send_8bit_data(255); //hace parpadear todos los LED del gráfico de barras una vez
 retraso(500);
 mipuerto.send_8bit_data(0);
 }
 bucle vacío
 {
 nivel internacional;
 
nivel = lectura analógica (A0); //leer el voltaje de entrada analógica
 nivel = mapa(nivel,0.1023,0.80);// limita el voltaje de 0 a 80
 //aumentar o disminuir el nivel del gráfico de barras dependiendo de la entrada
 if((nivel<80) && (nivel>70)) myport.send_8bit_data(255);
 else if((nivel<=70) && (nivel>60)) myport.send_8bit_data(127);
 else if((nivel<=60) && (nivel>50)) myport.send_8bit_data(63);
 else if((nivel<=50) && (nivel>40)) myport.send_8bit_data(31);
 else if((nivel<=40) && (nivel>30)) myport.send_8bit_data(15);
 else if((nivel<=30) && (nivel>20)) myport.send_8bit_data(7);
 
else if((nivel<=20) && (nivel>10))myport.send_8bit_data(3);
 else if((nivel<=10) && (nivel>0)) myport.send_8bit_data(1);
 else if(nivel==0) myport.send_8bit_data(0);
}
Diagrama de circuito

Ejemplo 4: recibir entrada digital de 8 bits desde interruptores DIP y mostrar el valor en el monitor serie
 #incluir
 IO_Port_8bit mipuerto(2,3,4,5,6,7,8,9); //crea objeto de puerta
 configuración nula
 {
 Serie.begin(9600); // inicializa la comunicación serie.
 myport.set_IO_direction('Yo'); // define la dirección del puerto
 Serial.println(“prueba del puerto de entrada de 8 bits”);
 }
bucle vacío
 {
 int entrada_byte;
 input_byt = mipuerto.get_8bit_data; // leer el estado del interruptor DIP
 Serial.print(“entrada recibida = “); // Es
 Serial.println(input_byt); //muestra su valor
 retraso(1000);
 }
Diagrama de circuito

 
              