Neste exemplo, demonstraremos como integrar um display de 7 segmentos com a placa Franzininho C0, utilizando dois botões para controle. Um dos botões será responsável por incrementar o valor exibido no display, enquanto o outro será usado para decrementar esse valor.
Componentes necessários
- 1 Franzininho C0
- 2 botões push-button
- 1 resistor 300 ohms
- 1 display 7 segmentos catodo comum
Conexões Hardware
- Pinos do Display de 7 Segmentos:
- Conecte um resistor de 300 ohms entre o pino comum do display e o GND.
- Conecte os demais pinos do display às portas da Franzininho C0 conforme a tabela abaixo:
| Segmento | Porta |
| a | PA6 |
| b | PA5 |
| c | PA4 |
| d | PA3 |
| e | PA2 |
| f | PA7 |
| g | PA8 |
- Botões de controle: conecte o primeiro botão ao pino PB6 e o segundo ao PB7.
As figuras abaixo mostram o esquema de conexão:
Funcionamento display 7 segmento
Dependendo do número que você deseja exibir, você deve acender os LEDs do segmentos apropriados. Para exibir o número 3, por exemplo, quatro segmentos de LED a, b, c, d, g devem estar acesos. Da mesma forma, vários dígitos de 0 a 9 podem ser exibidos em um display de 7 segmentos, como mostrado na figura abaixo:
Configurando CubeMx
- Abra STM32Cube , crie um novo projeto e selecione o microcontrolador de destino “STM32C011F6P6”.
- Vá para a página de configurações de relógio e em HCLK digite 48 MHz para a frequência de saída desejada do sistema. Pressione a tecla “Enter” e deixe o aplicativo resolver os divisores/multiplicadores PLL necessários para atingir a taxa de clock desejada. Depois volte para a página de configuração dos pinos, selecione “Trace and Debug” e habilite “Serial Wire.
- Em seguida, configuraremos os GPIOs. Selecione os pinos PA3, PA4, PA5, PA6, PA7 e PA8 e configure-os como “GPIO_Output”. Depois, selecione os pinos PB6 e PB7 e configure-os como “GPIO_Input”. No System Core, ative o resistor de pull-up para os pinos configurados como entrada e nomeie todos os pinos conforme mostrado na imagem abaixo. Isso tornará seu código mais legível e fácil de entender.
- Por fim, gere o código em “Project” > “Generate Code”.
Implementando o código
- Abra o arquivo em Core > Src > main.c
- No início do programa, logo após, SystemClock_Config(void) e MX_GPIO_Init(void) inclua as seguintes declarações de protótipos de funções:
void numero(uint32_t a, uint32_t b,uint32_t c,uint32_t d,uint32_t e, uint32_t f, uint32_t g);
void atualizaDisplay(int valor);
int debounceBotao(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);- Crie a função numero:
void numero(uint32_t a, uint32_t b,uint32_t c,uint32_t d,uint32_t e, uint32_t f, uint32_t g){
HAL_GPIO_WritePin(GPIOA, A_Pin, a);
HAL_GPIO_WritePin(GPIOA, B_Pin, b);
HAL_GPIO_WritePin(GPIOA, C_Pin, c);
HAL_GPIO_WritePin(GPIOA, D_Pin, d);
HAL_GPIO_WritePin(GPIOA, E_Pin, e);
HAL_GPIO_WritePin(GPIOA, F_Pin, f);
HAL_GPIO_WritePin(GPIOA, G_Pin, g);
}
Esta função define os segmentos do display de sete segmentos. Cada parâmetro (A a G) corresponde a um segmento do display, que pode ser ligado (1) ou desligado (0).
- Crie a função atualizaDisplay
void atualizaDisplay(int valor)
{
// Configurações dos segmentos para cada dígito de 0 a 9
switch(valor)
{
case 0: numero(1, 1, 1, 1, 1, 1, 0); break;
case 1: numero(0, 1, 1, 0, 0, 0, 0); break;
case 2: numero(1, 1, 0, 1, 1, 0, 1); break;
case 3: numero(1, 1, 1, 1, 0, 0, 1); break;
case 4: numero(0, 1, 1, 0, 0, 1, 1); break;
case 5: numero(1, 0, 1, 1, 0, 1, 1); break;
case 6: numero(1, 0, 1, 1, 1, 1, 1); break;
case 7: numero(1, 1, 1, 0, 0, 0, 0); break;
case 8: numero(1, 1, 1, 1, 1, 1, 1); break;
case 9: numero(1, 1, 1, 1, 0, 1, 1); break;
}
}
Esta função atualiza o display de sete segmentos para mostrar o valor de 0 a 9. Cada caso no switch chama a função numero com os parâmetros corretos para acender ou desligar os segmentos apropriados do display.
- Crie a função debounceBotao
int debounceBotao(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
uint32_t debounce_inicio = HAL_GetTick();
// Aguarda até que o botão seja liberado
while (HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET)
{
if (HAL_GetTick() - debounce_inicio >= 50) // Espera 50ms
{
// Botão pressionado por tempo suficiente
while (HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET); // Espera o botão ser solto
return 1; // Retorna verdadeiro
}
}
return 0; // Retorna falso se o botão não foi pressionado por tempo suficiente
}
Esta função implementa um mecanismo de debounce para um botão. Ele verifica se o botão está pressionado continuamente por pelo menos 50ms para evitar leituras falsas devido a ruídos ou vibrações. Se o botão for pressionado por tempo suficiente, retorna 1, indicando que o botão foi pressionado. Caso contrário, retorna 0. O HAL_GetTick() fornece um valor em milissegundos.
- Modifique a função
int maincom o código abaixo.
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
int valor = 0;
atualizaDisplay(valor);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if (debounceBotao(GPIOB, SOMA_Pin)){
valor = (valor + 1) % 10; //assegurar que permaneça dentro do intervalo de 0 a 9
atualizaDisplay(valor);
}
if (debounceBotao(GPIOB, SUBTRAI_Pin)){
valor = (valor - 1 + 10) % 10; //assegurar que permaneça dentro do intervalo de 0 a 9
atualizaDisplay(valor);
}
}
/* USER CODE END 3 */
}
Na função int main temos:
HAL_Init(): Inicializa a biblioteca HAL.
SystemClock_Config(): Configura o clock do sistema.
MX_GPIO_Init(): Inicializa os pinos GPIO.
valor: Variável que armazena o valor a ser exibido no display.
atualizaDisplay(valor): Atualiza o display com o valor inicial.
- O loop while (1) é executado continuamente:
- Verifica se o botão de incremento (SOMA_Pin) foi pressionado, incrementa o valor e atualiza o display.
- Verifica se o botão de decremento (SUBTRAI_Pin) foi pressionado, decrementa valor e atualiza o display.
- A conta valor = (valor + 1) % 10 e valor = (valor – 1 + 10) % 10 assegura que o número a ser exibido no display permaneça no intervalo de 0 a 9. Dessa forma, quando o valor atinge 9 e é incrementado, ele volta para 0 e quando atinge 0 e é decrementado, ele volta para 9. Por exemplo, suponha que o valor seja 9, teremos valor + 1 = 10, logo 10 % 10 = 0 (porque 10 dividido por 10 dá 1 como quociente e 0 como resto). Portanto, valor será 0.
O código pode ser visto na imagem abaixo.

Gravação do código
Ao finalizar o código, partiremos para gravação. Nessa etapa você pode utilizar o ST-Link seguindo as conexões da imagem abaixo ou utilizar um cabo usb como apresentado em um dos tutoriais desta série.
Funcionamento
Desafio
E que tal um desafio extra? Modifique o código para que ao pressionar o botão de decremento, o valor seja continuamente decrementado até chegar a 0, mostrando todos os números intermediários. Exemplo, se valor no display estiver em 5 e eu pressionar o botão os números apresentados no display devem ser: 5 4 3 2 1 0. Se conseguir realizá-lo, sinta-se à vontade para compartilhar em suas redes e nos marca.
Conclusão
Neste artigo, demonstramos como integrar um display de 7 segmentos com a placa Franzininho C0, utilizando dois botões para controle. Implementamos um código que permite incrementar e decrementar o valor exibido no display, garantindo que ele sempre esteja no intervalo de 0 a 9. Além disso, propusemos um desafio para aprimorar ainda mais o projeto.






