Neste projeto, criaremos uma biblioteca Arduino de porta IO de 8 bits que lê e grava todos os oito bits em um único comando combinando os pinos do Arduino. Isso significa que enviar e receber dados de 8 bits de um único pino será possível.
O Arduino fornece saída digital usando a função digitalWrite e recebe entrada digital por meio da função digitalRead . Ao usar essas duas funções, o Arduino pode fornecer saída ou entrada de qualquer pino único. No entanto, o Arduino normalmente fornece apenas entrada ou saída de um pino por vez.
Portanto, para fazer a interface do Arduino com um dispositivo IO de 8 bits – como um display de 7 segmentos, chaves DIP ou DAC (conversor digital para analógico), geralmente são necessários oito pinos diferentes. O padrão de bytes de dados (8 bits) é enviado para pinos diferentes como '1s' e '0s'. Por exemplo, se um byte de dados for 37h (0011 0111), é necessário enviar o padrão '0' e '1' para oito pinos diferentes usando a função digitalWrite .
Para resolver esta situação, criamos uma biblioteca de portas IO (porta de entrada-saída) de 8 bits que combina os pinos do Arduino. Funciona como uma porta IO de 8 bits para Arduino e configura a direção dos dados como entrada ou saída. A direção dos dados é definida pelo caractere 'O' para a saída e 'I' para a entrada.
Esta biblioteca possui cinco funções. Dois “construtores” criam o(s) objeto(s) de porta, incluindo uma função que envia a saída digital de 8 bits para os pinos da porta e outra que recebe a entrada digital de 8 bits dos pinos da porta. Uma terceira função altera e define a direção de E/S da porta. Todas as cinco funções são explicadas a seguir.
As cinco funções
1. IO_Port_8bit(int pino1,int pino2,int pino3,int pino4,int pino5,int pino6,int pino7,int pino8,char diretório)
Este construtor cria objeto(s) desta classe.  Ele pode criar uma ou várias portas de 8 bits combinando pinos específicos do Arduino.  É importante especificar quais oito pinos do Arduino combinar, juntamente com a direção dos dados de cada porta (entrada ou saída).  O último argumento, dir, define se uma porta funciona como entrada ou saída. 
- Se dir='O' = a porta funciona como saída
- Se dir='I' = a porta funciona como entrada
A mesma porta não pode funcionar como entrada e saída simultaneamente ou alternativamente. A direção da porta deve ser selecionada ou resultará em erro.
2. IO_Port_8bit(int pin1,int pin2,int pin3,int pin4,int pin5,int pin6,int pin7,int pin8)
Este é outro construtor, que cria objeto(s) desta classe. Ele pode criar uma ou várias portas de 8 bits combinando pinos específicos do Arduino. É importante especificar quais oito pinos do Arduino combinar para cada porta. No entanto, incluir a direção dos dados como entrada ou saída é desnecessário. 
Em vez disso, após criar um objeto de porta usando este construtor, defina a direção da porta usando a função set_IO_direction. Este construtor permite que o programador altere a direção dos dados da porta em tempo de execução. Então, uma porta pode funcionar como entrada ou saída alternativamente (mas não simultaneamente).
3. set_IO_direction(char diretório)
Esta função especifica a direção de entrada e saída de uma porta. Ela tem um argumento de caractere, que é 'I' para uma porta que é entrada e 'O' para uma porta que é saída. Um erro será exibido no monitor serial do Arduino se a direção dos dados não for selecionada.
4. enviar_dados_de_8_bits(int byt)
Esta função envia dados de 8 bits para pinos especificados.  Ele fornece os dados 'int' (deve ser <255) como argumento, que é enviado diretamente para oito pinos diferentes.  Se os dados forem >255, um erro será exibido no monitor serial do Arduino.
5. get_8bit_data(vazio)
Esta função recebe dados de 8 bits de pinos especificados.  Ele retorna os dados 'int' de 8 bits lendo o status dos oito pinos diferentes.
Exemplo 1: Pisque oito LEDs alternadamente a uma taxa de 1 Hz
#incluir
IO_Port_8bit minhaport(2,3,4,5,6,7,8,9,'O');  //cria porta de saída
void setup  // nada é necessário na configuração
{   
}
loop vazio 
{
  myport.send_8bit_data(85); // envia dados para piscar todos os LEDs ímpares
  atraso(500);
  minhaporta.send_8bit_data(170);  envia dados para piscar todos os LEDs pares
  atraso(500);
}
Diagrama de circuito

Exemplo 2: Exiba um padrão de contagem binária nos LEDs, de 0 a F
#incluir 
IO_Port_8bit my8bitport(2,3,4,5,6,7,8,9);//criar objeto de porta
configuração nula 
{
  my8bitport.set_IO_direction('O');// define a direção da porta
}
loop vazio 
{
  int eu;
  for(i=0;i<16;i++) //envia dados de 0 a 15 para exibição
    { // padrão binário
     minhaporta.send_8bit_data(i);
     atraso(200);
    }
  }
Exemplo 3: Indicar o nível de tensão de entrada analógica em um display gráfico de barras LED de 8 bits
#incluir
IO_Port_8bit minhaport(2,3,4,5,6,7,8,9,'O');  //cria objeto de porta de saída
configuração nula 
{
  minhaporta.send_8bit_data(255);          //pisca todos os LEDs do gráfico de barras uma vez
  atraso(500);
  minhaporta.send_8bit_data(0);
}
loop vazio 
{
   nível int;
   level = analogRead(A0); //ler tensão de entrada analógica
   level = map(level,0,1023,0,80);// limita a voltagem de 0 a 80
    //aumenta ou diminui o nível do gráfico de barras conforme a entrada
     if((nível<80) && (nível>70)) myport.send_8bit_data(255);
     senão se((nível<=70) && (nível>60)) myport.send_8bit_data(127);
     senão if((nível<=60) && (nível>50)) myport.send_8bit_data(63);
     senão if((nível<=50) && (nível>40)) myport.send_8bit_data(31);
     senão if((nível<=40) && (nível>30)) myport.send_8bit_data(15);
     senão if((nível<=30) && (nível>20)) myport.send_8bit_data(7);
     senão if((nível<=20) && (nível>10))myport.send_8bit_data(3);
     senão if((nível<=10) && (nível>0)) myport.send_8bit_data(1);
     senão if(level==0) myport.send_8bit_data(0);   
}
Diagrama de circuito

Exemplo 4: Receba uma entrada digital de 8 bits de interruptores DIP e exiba o valor no monitor serial
#incluir
IO_Port_8bit minhaport(2,3,4,5,6,7,8,9);  //cria objeto porta
configuração nula 
{
    Serial.begin(9600); // inicializa comunicação serial.
    myport.set_IO_direction('I'); // define a direção da porta
    Serial.println(“teste de porta de entrada de 8 bits”);
}
loop vazio 
{
  int entrada_byt;
  input_byt = myport.get_8bit_data ; // leia o status do interruptor DIP
  Serial.print(“entrada recebida = “);   // e
  Serial.println(input_byt);                   //mostra seu valor
  atraso(1000);
  }
Diagrama de circuito

 
              