Como usar display 7 segmentos com a Franzininho C0

Este post faz parte da série Franzininho C0 com STM32CubeIDE

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

  1. Pinos do Display de 7 Segmentos:
    1. Conecte um resistor de 300 ohms entre o pino comum do display e o GND.
    2. Conecte os demais pinos do display às portas da Franzininho C0 conforme a tabela abaixo:
SegmentoPorta
aPA6
bPA5
cPA4
dPA3
ePA2
fPA7
gPA8
  1. 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

  1. Abra STM32Cube , crie um novo projeto e selecione o microcontrolador de destino “STM32C011F6P6”. 
  1. 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.
  1. 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.
  1. Por fim, gere o código em “Project” > “Generate Code”.

Implementando o código

  1. Abra o arquivo em Core > Src > main.c 
  1. 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);
  1. 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).

  1. 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.

  1. 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.

  1. Modifique a função int main com 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.

Franzininho C0 com STM32CubeIDE

Como gravar a Franzininho C0 via USB/Serial usando o STM32CubeProgrammer Trabalhando com ADC no Franzininho C0: Tutorial Completo no STM32CubeIDE
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Software » Firmware » Como usar display 7 segmentos com a Franzininho C0

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: