#include <stdio.h>
#include "pico/stdlib.h"
//#include "pico/cyw43_arch.h" // não é neceesário neste código
// Vamos utilizar os displays catodo comum
// Definição dos pinos dos segmentos do display
const uint8_t segment_pins[] = {0, 1, 2, 3, 4, 5, 6};
const uint8_t mux_display_pins[]={10,11};
// Gpio 10: poisção 0 do vetor, Display que representa o digito das dezenas;
// Gpio 11: posição 1 do vetor, Display que representa o dígito das unidades;
// Mapeamento dos dígitos para os segmentos do display
const uint8_t display[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
};
// função para configurar os pinos como saída
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(mux_display_pins[i]);
gpio_set_dir(mux_display_pins[i], GPIO_OUT);
gpio_put(mux_display_pins[i],1); // Desativa os displays de catodo comum
}
}
// função para mostrar um dígito em um dos display selecionado
void show_digit(uint8_t digits, uint8_t digit){
// desativa os dois dispalys em catodo comum
gpio_put(mux_display_pins[0],1);
gpio_put(mux_display_pins[1],1);
//Ativa os segmentos referentes ao dígito
for (int i=0; i<7; i++){
gpio_put(segment_pins[i], display[digit][i]);
}
//Ativa o display desejado
gpio_put(mux_display_pins[digits], 0);
}
int main() {
stdio_init_all();
// Inicializa e configura os pinos dos segmentos como saída
setup();
while (true) {
for (uint8_t numero = 0; numero < 100; numero++) {// contagem de 0 a 99
uint8_t dezenas = numero/10; // calcula o dígito das dezenas
uint8_t unidades = numero % 10; // calcula o dígito da unidades
// Multiplex rápido entre os display
for (int j=0; j<100; j++){ // valor de j controla a velocidade de atualização
show_digit(0, dezenas); // exibe o dígito das dezenas no primeiro display
sleep_ms(5); // tempo de permanência no primeiro display
show_digit(1, unidades); // exibe o dígito das unidades no segundo display
sleep_ms(5); // tempo de permanência no segundo display
}
sleep_ms(50); // pausa de 0,5 segundos entre os incrementos
}
}
return 0;
}