#include "pico/stdlib.h"
// Configura os pinos dos segmentos do display e dos controlos dos display (Dig1 e Dg2)
const uint8_t segment_pins[] = {5, 6, 4, 2, 3, 0, 1}; // pinos dos segmentos a, b, c, d, e, f, g
const uint8_t display_pins[] = {12, 11}; // Pinos de controle dos display (Dig1 e Dig2)
//Mapeamento dos dígitos para os segmentos do display (0 = desligado, 1 = ligado)
const uint8_t digits[10][7] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 0, 0, 1, 1} // 9
};
// Configura todos os pinos como output
void setup() {
for (int i = 0; i < 7; i++) {
gpio_init(segment_pins[i]);
gpio_set_dir(segment_pins[i], GPIO_OUT);
}
for (int i = 0; i < 2; i++) {
gpio_init(segment_pins[i]);
gpio_set_dir(display_pins[i], GPIO_OUT);
gpio_put(display_pins[i], 0); // Desativa inicialmente os displays
}
}
// Função para exibir um dígito em um display específico
void show_digit(uint8_t display, uint8_t digit) {
// Desativa ambos displays
gpio_put(display_pins[0], 0);
gpio_put(display_pins[1], 0);
// Ativa os segmentos correspondentes ao dígito
for (int i = 0; i < 7; i++) {
gpio_put(segment_pins[i], digits[digit][i]);
}
// Ativa o display específico
gpio_put(display_pins[display], 1);
}
int main() {
stdio_init_all();
setup(); // Configura todos pinos como output
sleep_ms(1000);
while (true) {
for (uint8_t numero = 0; numero < 100; numero++) { // Loop para contagem de 0 a 99
uint8_t dezenas = numero / 10; // Cacula o digíto das dezenas
uint8_t unidades = numero % 10; // Cacula o digíto das unidades
//Multiplexa rapidamente entre os displays
for (int j = 0; j < 50; j++) { // Ajuste o valor de j para controlar a velocidade de atualização
show_digit(0, dezenas); // Exibe o digíto das dezenas no primeiro display
sleep_ms(5); // Tempo de permanência no primeiro display
show_digit(1, unidades); // Exibe o digíto das unidade no segundo display
sleep_ms(5); // Tempo de permanência no segundo display
}
sleep_ms(500); // Pausa de meio segundo entre increment
}
}
return 0;
}