// Multiplexação de display de 7 segmentos
// Display tipo Catodo Comum
// Codigo escrito para o tinkercad que tem transistor na simulação.
int pot = A5; // cursor do pot ligado a entrada analógica A5
// Declaração de variáveis
int valpot, mil, cen, dez, uni, temp = 0;
int tempo = 50;
// Declaração do vetor para conexão do display
// Sequencia do vetor ( a, b, c, d, e, f, g, dp, u, d, c, m
const int Pinos[12] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
// sequencia de segmentos que devem acender em cada numero
// valor em hexadecimal para display cc
// primeiro hexa e,f,g,dp
// segundo hexa a,b,c,d
const byte Numeros[10] =
{
0x3F, //0 0XC0
0x06, //1 0xF9
0x5B, //2 0XA4
0x4F, //3 0XB0
0x66, //4 0X99
0x6D, //5 0X92
0x7D, //6 0X82
0x07, //7 0XF8
0x7F, //8 0X80
0x6F, //9 0X90
};
void setup()
{
// inicializa monitor serial
Serial.begin(9600);
// contador 0 até 11 para definir pinos como saída
for(int i = 0; i < 12; i++)
{
pinMode(Pinos[i], OUTPUT);
}
}
// função para auxiliar a escrita no display de 7 segmentos
// recebe o numero num obtido após leitura no pot
void escreveDisplay(int num)
{
// busca no vetor Numeros o valor e guarda o byte em numBit
byte numBit = Numeros[num];
// contador de 0 até 8
for (int i = 0; i < 7; i++)
{
// faz a leitura de cada bit de numBit e guarda em bit
int bit = bitRead(numBit, i);
// escreve o bit no pino correspondente
digitalWrite(Pinos[i], bit);
}
}
void loop()
{
//Leitura do potenciômetro
valpot = analogRead(pot);
//escreve no monitor serial o valor lido
Serial.print("valpot = ");
Serial.println(valpot);
// para obter o valor do numero da cada milhar,
// faz-se a divisão do valor lido por 1000.
// o resultado será um inteiro, que neste caso serã
// 0 para numero 999 ou menor
// 1 para números maior do que 1000
// o resultado é acumulado na variável mil
mil = valpot/1000;
// mostrar milhar
Serial.print("milhar = ");
Serial.println(mil);
// para obter o valor do número de cada centena,
// faz-se a divisão de valpot por 100
// o resultado será novamente divido agora por 10.
// mas o uso do % indica que o valor recebido será o
// primeiro resto da divisão.
cen = (valpot/100)%10;
// mostrar centena
Serial.print("centena = ");
Serial.println(cen);
// para obter a dezena, faz-se a divisão de valpot por 10
// o resultado é novamente dividio por 10 porém utilizando %
// assim, o acumulado será o resto da ultima divisão.
dez = (valpot/10)%10;
// mostrar dezena
Serial.print("dezena = ");
Serial.println(dez);
// para obter a unidade, faz-se a divisão do valpot por 10
// utilizando %. Assim, o valor acumulado será
// o resto da divisão
uni = valpot%10;
// mostrar unidade
Serial.print("unidade = ");
Serial.println(uni);
// a função escreveDisplay recebe o valor da milhar
escreveDisplay(mil);
// aciona o display milhar
digitalWrite(10,1);
digitalWrite(11,1);
digitalWrite(12,1);
digitalWrite(13,0);
delay(tempo);
// a função escreveDisplay recebe o valor da centena
escreveDisplay(cen);
// aciona o display centena
digitalWrite(10,1);
digitalWrite(11,1);
digitalWrite(12,0);
digitalWrite(13,1);
delay(tempo);
// a função escreveDisplay recebe o valor da dezena
escreveDisplay(dez);
// aciona o display dezena
digitalWrite(10,1);
digitalWrite(11,0);
digitalWrite(12,1);
digitalWrite(13,1);
delay(tempo);
// a função escreveDisplay recebe o valor da unidade
escreveDisplay(uni);
// aciona o display dezena
digitalWrite(10,0);
digitalWrite(11,1);
digitalWrite(12,1);
digitalWrite(13,1);
delay(tempo);
}