C1 - 2 Displays de 7 segmentos

MicrocontroladorPICPIC16F887MPLABX-XC8SimulIDE

Display de 7 segmentos: 2 dígitos

Raramente um único display de 7 segmentos é suficiente para exibir o valor de alguma grandeza. Assim faz-se necessária a ligação de ao menos outro dígito. Para acionar este outro dígito pode-se utilizar outro PORT de 8 pinos do uC. A quantidade de pinos utilizados para o display começa a ficar inviável ao aumentar a quantidade de dígitos. Para viabilizar a utilização de vários dígitos, é utilizada uma técnica chamada multiplexação.

Objetivo

Acionar dois displays de 7 segmentos de forma multiplexada para exibir uma contagem de 0 a 99.

1. Circuito (Hardware)

Figura 1.1: 2 Displays de 7 segmentos catodo comum
circuito

2. Programa (Firmware)

Figura 2: Árvore de diretório do projeto
circuito

Estrutura do programa

O programa presente no arquivo fonte main.c possui o seguinte arranjo:

  • Inclusão de bibliotecas;
  • Programa principal;
    • Declaração e inicializações;
    • Laço de repetição.

Programa principal

/*
 * File:   main.c
 * Author: josewrpereira
 *
 * Created on 13 de Agosto de 2020, 17:31:21
 * 
 * -------------------------------------------------
 *          MAPA DE ENTRADAS E SAIDAS
 * -------------------------------------------------
 *  Pinos   |nº     |Conexão
 * ---------|-------|-------------------------------
 *  RB0     |33     | Segmento a
 *  RB1     |34     | Segmento b
 *  RB2     |35     | Segmento c
 *  RB3     |36     | Segmento d
 *  RB4     |37     | Segmento e
 *  RB5     |38     | Segmento f
 *  RB6     |39     | Segmento g
 *  RB7     |40     | Segmento p
 *  RD7     |30     | Hab. Dezena (Catodo comum)
 *  RD6     |29     | Hab. Unidade (Catodo comum)
 * -------------------------------------------------
 */

#include <xc.h>
#include "config.h"
#include "delay.h"
#include "disp7seg.h"

void main(void) 
{
    char num = 0;
    int nScan = 0;
    
    disp7segX2_init();
    
    while( 1 )
    {
        disp7segX2( num );
        
        if( ++nScan > 200 )
        {
            nScan = 0;
            num = ++num % 100;
        }
        delay(1);
    }
    return;
}

Inclusão de bibliotecas

/*
 * File:   delay.c
 * Author: josewrpereira
 *
 * Created on 13 de Agosto de 2020, 17:32
 * 
 * -------------------------------------------------
 *          MAPA DE ENTRADAS E SAIDAS
 * -------------------------------------------------
 *  Pinos   |nº     |Conexão
 * ---------|-------|-------------------------------
 *  RB0     |33     | Segmento a
 *  RB1     |34     | Segmento b
 *  RB2     |35     | Segmento c
 *  RB3     |36     | Segmento d
 *  RB4     |37     | Segmento e
 *  RB5     |38     | Segmento f
 *  RB6     |39     | Segmento g
 *  RB7     |40     | Segmento p
 *  RD7     |30     | Hab. Dezena (Catodo comum)
 *  RD6     |29     | Hab. Unidade (Catodo comum)
 * ------------------------------------------------- 
 */
#include <xc.h>
#include "config.h"
#include "delay.h"

#define QTD_DIGITOS         2
#define BASE                10

#define DISP7SEG_BUS( x )   PORTB = x
#define HAB_DEZENA( x )     PORTDbits.RD7 = x
#define HAB_UNIDADE( x )    PORTDbits.RD6 = x


char digitos7seg[16] = {    0x3F, 0x06, 0x5B, 0x4F, 
                            0x66, 0x6D, 0x7D, 0x07, 
                            0x7F, 0x6F, 0x77, 0x7C, 
                            0x39, 0x5E, 0x79, 0x71  };

void disp7segX2_init( void )
{
    ANSELH = 0;
    TRISB = 0x00;
    TRISDbits.TRISD7 = 0;
    TRISDbits.TRISD6 = 0;
    
    HAB_DEZENA( 1 );
    HAB_UNIDADE( 1 );
    DISP7SEG_BUS(0xFF);    delay(500);
    DISP7SEG_BUS(0x00);    delay(500);
    DISP7SEG_BUS(0xFF);    delay(500);
    DISP7SEG_BUS(0x00);    delay(500);
}

unsigned char posicao = 0;
void disp7segX2( unsigned char num )
{
    switch( posicao )
    {
        case 0: // Unidade
                HAB_DEZENA( 0 );
                DISP7SEG_BUS( digitos7seg[num % BASE] );
                HAB_UNIDADE( 1 );
                break;

        case 1: // Dezena
                HAB_UNIDADE( 0 );
                DISP7SEG_BUS( digitos7seg[(num / BASE) % BASE] );
                HAB_DEZENA( 1 );
                break;
    }
    posicao = ++posicao % QTD_DIGITOS;
}

Agora é a sua vez!

Crie o seu projeto, copie o código, execute-o, procure os erros, arrume-os, seja resiliente, leia novamente a explicação, busque outras fontes, pergunte, responda, explique, faça alterações conscientes no código, explore, divirta-se.

Ficou com alguma dúvida, entre em contato.

Bom trabalho!


« C1 - Display de 7 segmentos « C1 - 2 Displays de 7 segmentos » C1 - Borda do botão pulsador »


Voltar