Sistemas Operacionais de Tempo Real - Displays de 7 segmentos

displays de 7 segmentos

Introdução

 

Este artigo faz parte da série de artigos que apresenta Bibliotecas de funções e rotinas padronizadas em linguagem C para MCS-51, que podem facilmente ser adaptadas para outros microcontroladores. Para a melhor compreensão do que será desenvolvido aqui, é recomendável que você leia os artigos anteriores dessa série e esse sobre displays de LED de 7 seguimentos.

 

A filosofia utilizada para o desenvolvimento das rotinas para os displays de 7 segmentos é a mesma utilizada nas rotinas apresentadas no artigo Sistemas Operacionais de Tempo Real – Timers. Cria-se um temporizador virtual por software, que é baseado na interrupção de um timer de hardware definindo assim a frequência com a qual os displays são atualizados. Deve-se escolher uma frequência de atualização alta o suficiente para que  não se tenha a desagradável sensação de que o display está “piscando”. Em geral essa frequência é da ordem de 20 a 30 vezes por segundo para cada display. A transferência de dados entre o programa principal e a rotina de interrupção é feita através de um vetor dedicado cujo conteúdo é o que deve ser apresentado no display e de eventuais mecanismos para controlar o acesso a esse vetor.

 

A biblioteca permite que se opere com algumas soluções de hardware distintas, tais como linhas de seleção multiplexadas, ou então separadas, dependendo do tipo de solução e compromissos desenvolvidos no projeto. Também é ilustrado como se pode de maneira simples codificar as letras e símbolos a serem mostrados nos displays.

 

 

Arquitetura de Hardware

 

Para que se possa desenvolver rotinas de programação padronizadas para os displays de 7 segmentos e cuja adaptação ao hardware seja simples é necessário definir arbitrariamente e fixar alguns modelos físicos para as conexões. A mais óbvia é a alocação de um port inteiro de 8 bits para gerar os segmentos e o ponto decimal dos displays. Para recordar como que é uma interface com um display de 7 segmentos, veja um exemplo na Figura 1.

 

Conexões de acionamento de um display de 7 segmentos
Figura 1: Conexões de acionamento de um display de 7 segmentos

 

 

 

Acionamento dos segmentos de LED

 

A atribuição dos segmentos de LED aos pinos do Port foi arbitrária. Por questão de simplicidade eles foram conectados em sequência numa mesma porta: bits 0123456 nos segmentos ABCDEFG e o ponto decimal foi colocado no bit 7. Pode-se observar na Figura 2 uma ilustração simplificada disso. Essa solução de hardware para conexão dos segmentos do display ao microcontrolador é pressuposta nas rotinas em linguagem C da biblioteca, que serão apresentadas mais adiante, agrupadas como ROTINA DOS DISPLAYS DE 7 SEGMENTOS I e ROTINA DOS DISPLAYS DE 7 SEGMENTOS II. O que diferencia os dois grupos, são as formas de seleção dos displays.

 

Exemplo de alocação dos segmentos dos Displays de 7 segmentos a um port de 8 bits
Figura 2: Exemplo de alocação dos segmentos dos displays a um port de 8 bits

 

Nessa atribuição arbitrária, pode-se formar os dígitos e alguns caracteres alfabéticos conforme ilustrado na Tabela 1.

 

Tabela 1: Códigos para acender os segmentos de acordo com o dígito ou caractere desejado.

 

Outra forma de conectar o display de LED de 7 segmentos a um microprocessador é por meio de um decodificador BCD para 7 segmentos, tais como por exemplo os circuitos integrados 74LS49, ou então o 74HC4511. Na Figura 3 é ilustrada uma solução de hardware onde é utilizado um decodificador desse tipo, com a atribuição arbitrária dos pinos e ports utilizada nas rotinas padronizadas em linguagem C agrupadas como  ROTINA DOS DISPLAYS DE 7 SEGMENTOS III.

Displays de 7 segmentos decodificador
Figura 3: Solução de hardware com decodificador BCD / display de 7 segmentos

 

 

Formas de seleção dos displays

 

Nas rotinas padronizadas foram previstas duas formas de seleção dos displays: linhas de seleção separadas, utilizadas nos grupos de rotinas ROTINA DOS DISPLAYS DE 7 SEGMENTOS II e III, e linhas de seleção codificadas, utilizadas na ROTINA DOS DISPLAYS DE 7 SEGMENTOS I.

 

Linhas Separadas

 

As linhas de seleção separadas são alocadas num segundo Port. Uma definição cuidadosa das variáveis do programa padronizado, permite que se selecione em que bit do Port começam essas linhas. Essas linhas de seleção devem estar necessariamente alocadas em ordem crescente e na sequência dos pinos do Port. Veja por exemplo o código em C mostrado na Figura 4.

 

No exemplo da Figura 4 foram definidos que são utilizados 3 displays, os segmentos conectados ao Port 3, as linhas de seleção ao Port 1 e será utilizado o ponto decimal. Na parte específica relacionado com as linhas de seleção, é definido que as linhas estão alocadas nos pinos 5, 6 e 7 do Port 1 (0xE0).

 

 Figura 4: Definições relacionadas com as linhas de seleção

 

Linhas codificadas

 

Nessa forma de seleção dos displays são utilizados poucos pinos do port para codificar o número do display a ser ativado em código binário. Ou seja, 1 bit seleciona até dois displays, 2 bits quatro etc. A intenção foi a de economizar pinos nos Ports do microcontrolador, especialmente se o número de displays for grande. É necessária a utilização de um decodificador / multiplexador na saída do Port, conforme ilustrado na Figura 5. Um exemplo desse tipo de componente é o 74LS139.

Displays de 7 segmentos Selecao Multiplexada
Figura 5: Solução de hardware usando um multiplexador  para seleção dos Display de 7 segmentos

 

 

Rotinas padronizadas em C para os displays de 7 segmentos

 

O código em linguagem C para os displays segue o mesmo padrão do desenvolvido para os timers em Sistemas Operacionais de Tempo Real – Timers. Tem um conjunto de definições e variáveis, uma parte a ser inserida na rotina de interrupção do timer, de forma que quando o timer virtual do display terminar a contagem, é executado um trecho curto de código para atualizar os displays. No programa principal são inseridas algumas inicializações.

 

Definições e variáveis

 

A seguir os códigos exemplo referentes às definições e configurações correspondentes às arquiteturas descritas anteriormente. Esse trecho de código é inserido tipicamente num arquivo do tipo .h do programa.

 

ROTINA DOS DISPLAYS DE 7 SEGMENTOS I (Sinais de seleção codificados)

 

 

ROTINA DOS DISPLAYS DE 7 SEGMENTOS II (Sinais de seleção separados)

 

 

ROTINA DOS DISPLAYS DE 7 SEGMENTOS III (Utiliza decodificador BCD para 7 segmentos e sinais de seleção separados)

 

 

São utilizadas algumas convenções com relação às definições e uso das constantes. Em todo o programa, 1 quer dizer ligado ou ativo e 0 desligado ou inativo. Este trecho de código é na sua essência o configurador dos displays, amarrando as particularidades do hardware com o software. O código é muito parecido com o da primeira rotina. Existem apenas algumas pequenas diferenças O que deve ser configurado:

  • #define DISPLAY_INVERTIDO: Essa linha deve ser colocada como comentário, se acaso as saídas para os segmentos não necessitam de inversão lógica;
  • #define TEM_PONTO_DECIMAL: Essa linha deve ser colocada como comentário, se acaso não for utilizado o ponto decimal;
  • #define NUMERO_DE_DISPLAYS: Nessa linha deverá ser colocado o número de displays multiplexados que existem no hardware;
  • #define FREQ_DE_INTERRUP_TIMER_DISPLAYS: é a frequência de atualização de um display multiplicada pelo número de displays;
  • #define NUMERO_DE_LINHAS_DO_DISPLAY: Aqui é definido o número de linhas de seleção que serão utilizadas;
  • #define PORTA_DE_SAIDA_DOS_DISPLAYS: Aqui deve ser definida em que Port estão conectados os segmentos dos displays;
  • #define PORTA_DE_SAIDA_DA_SELECAO_DOS_DISPLAYS: Aqui é definido em que Port estão conectadas as linhas de seleção;
  • #define MASCARA_DA_SELECAO_DE_DISPLAY: Aqui é definida a posição e abrangência das linhas de seleção;
  • #define SELETOR_DOS_SINAIS_DE_SELECAO_DISPLAY: Define a posição do bit de seleção que será deslocado em anel para selecionar os diversos displays;
  • #define SAIDAS_INVERTIDAS_SEL_DISP : Colocar essa linha como comentário, se acaso as linhas de seleção não precisarem ser invertidas;
  • unsigned char ucFilaDeSaidaDosDisplays[NUMERO_DE_DISPLAYS]: É necessário dimensionar e inicializar corretamente esse vetor.

 

As demais variáveis e constantes são calculadas automaticamente pelo programa.

 

Código a ser inserido na rotina de interrupção do Timer 0

 

Os trechos de códigos a seguir implementam um temporizador virtual para o acionamento dos displays. Sempre que o contador termina a contagem, é desligado o display atual e ativado o próximo, tomando as providências de hardware para isso.

 

ROTINA DOS DISPLAYS DE 7 SEGMENTOS I        (Sinais de seleção codificados)

 

 

ROTINA DOS DISPLAYS DE 7 SEGMENTOS II (Sinais de seleção separados)

 

Para examinar o código, “clique” na barra a seguir.

 

ROTINA DOS DISPLAYS DE 7 SEGMENTOS III (Utiliza decodificador BDC para 7 segmmentos e sinais de seleção separados)

 

Para examinar o código, “clique” na barra a seguir.

 

Código a ser inserido nas inicializações do programa principal

 

O trecho de código a seguir inicializa uma variável auxiliar e desativa as linhas de seleção dos displays.

 

 

Como transferir dígitos para os displays?

 

Da forma como foi projetado esse programa, o gerenciamento do display de 7 segmentos propriamente dito é totalmente automático e transparente para o programa principal. Você só precisa converter o dígito para o código, usando-o como índice na tabela ucTabelaDeDisplayDeSeteSegmentos[dígito] e transferí-lo para a fila de saída dos displays (ucFilaDeSaidaDosDisplays[]) na posição correspondente. Veja no exemplo a seguir.

 

 

EXEMPLO

 

Nesse programa foi aproveitado o mesmo programa desenvolvido para a demonstração de operação dos timers de tempo real, acrescidos os trechos relativos aos displays. Aqui será programado o Timer 0 no modo 2 de operação, com o microcontrolador operando com um clock de 4 MHz e uma frequência de interrupção de 1,5 kHz. Foram definidos 3 displays de 7 segmentos do tipo II com a seleção separada, e atualizados a cada 30 contagens cada um. Confira o código no quadro abaixo.

 

 

Se você quiser simular o programa exemplo acima e explorá-lo um pouco mais, siga os seguintes passos:

  • Instale o KEIL C51 μVision;
  • Baixe o arquivo Testa_Display.zip;
  • Instale os arquivos de Testa_Display.zip num diretório para testes;
  • Navegue até o diretório de testes e acione o arquivo Testa_Display.uvproj (2 “clickes”)  (Figura 6).

 

display de 7 segmentos
Figura 6: Arquivos no diretório de teste

 

Nesse instante deverá abrir o programa Keil e a tela deverá ser a retratada na Figura 7. Esse painel permite navegar no código em C, editá-lo e compilá-lo. Não é necessário fazer isso para realizar a simulação, mas você poderá posteriormente alterar alguns parâmetros do código e testar o programa com as novas alterações.

 

displays de 7 segmentos - Programa Keil pronto com o programa exemplo carregado
Figura 7: Programa Keil pronto com o programa exemplo carregado

 

A seguir coloque o programa no modo de Debug (Figura 8, Figura 9 e Figura10) para que se possa iniciar a simulação.

 

displays de 7 segmentos - Selecionando o modo Debug do programa
Figura 8: Selecionando o modo Debug do programa

 

 Antes de entrar no modo de depuração, aparece na tela a mensagem da Figura 9. Clique no “OK” para continuar.

 

displays de 7 segmentos - Aviso de que no modo de avaliação, o código fica limitado a 2K
Figura 9: Aviso de que no modo de avaliação, o código fica limitado a 2K

 

 

displays de 7 segmentos - Modo Debug de operação
Figura 10: Modo Debug de operação

 

Observe que já estão destacados os painéis de monitoramento do Timer 0,  do Port 1, cujo bit 1 deverá ser alternado a cada término de contagem do temporizador de software do teste do timer e cujos bits 5, 6 e 7 são usados como linhas de seleção dos 3 displays, e o Port 3, onde aparecem os códigos de cada dígito de 7 segmentos. Nessa simulação, aparecem os números 1, 2 e 3 respectivamente nos displays 0, 1 e 2.

 

É possível utilizar as teclas de função F11 para executar o programa passo a passo ou F5 entrar em execução. Recomendo que você inicie a simulação utilizando o passo a passo para poder observar detalhadamente como que funciona o mecanismo de operação desse programa.

 

 

Resumo

 

Neste artigo técnico foram apresentadas algumas possíveis soluções padronizadas para acionamento de displays de 7 segmentos com auxílio de um timer de hardware. Essas soluções constituem uma biblioteca padronizada para a utilização dos displays de 7 segmentos em microcontroladores da família MCS-51, codificada em C, para ser compilada no programa da Keil. Depois foi desenvolvido um programa exemplo para que você possa simular o que foi apresentado e observar os detalhes dessa implementação.

 

Este artigo é o terceiro da série de artigos que abordam algumas funções comuns em projetos de sistemas embarcados de tempo real. Confira os demais artigos (em breve).

 

Bibliotecas de funções e rotinas padronizadas em linguagem C para MCS-51

 

  • Timers - É apresentada uma biblioteca desenvolvida em linguagem C para a inicialização e o uso dos Timers do MCS-51;
  • Displays de 7 segmentos (este artigo) – É apresentada uma biblioteca desenvolvida em linguagem C para a inicialização e o uso em displays de 7 segmentos;
  • Teclados Matriciais – É apresentada uma biblioteca desenvolvida em linguagem C para varredura, leitura, debounce, identificação da tecla acionada e desvio para a rotina de tratamento. A forma como as rotinas foram escritas, permitem sua fácil reutilização em outros projetos;
  • Periféricos - É apresentada uma biblioteca desenvolvida em linguagem C para a inicialização e o uso de alguns periféricos, tais como conversores A/D, sensor de temperatura e memórias seriais.

 

 

Outros artigos da série

<< Sistemas Operacionais de Tempo Real - TimersSistemas Operacionais de Tempo Real - Teclados Matriciais >>
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Henrique Frank Werner Puhlmann
Sou paulistano, 60 anos, formado em Engenharia Eletrônica pela Escola Politécnica da Universidade de São Paulo (formado em 1982) e trabalho há pelo menos 33 anos no Instituto de Pesquisas Tecnológicas do Estado de São Paulo S/A - IPT com Pesquisa e Desenvolvimento, principalmente pesquisa aplicada e desenvolvimento tecnológico de protótipos e produtos eletrônicos dedicados.

4
Deixe um comentário

avatar
 
3 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
Henrique Frank Werner PuhlmannRafael DiasSistemas Operacionais de Tempo Real – Alguns Periféricos | Blog do Engenheiro PuhlmannSistemas Operacionais de Tempo Real – Teclados Matriciais | Blog do Engenheiro Puhlmann Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
trackback

[…] Displays de 7 segmentos  – É apresentada uma biblioteca desenvolvida em linguagem C para a inicialização e o uso em displays de 7 segmentos; […]

trackback

[…] foi aproveitado o mesmo programa desenvolvido para a demonstração de operação dos timers e displays de 7 segmentos de tempo real, acrescidos os trechos relativos ao teclado. Aqui será programado o Timer 0 no modo […]

Rafael Dias
Visitante
Rafael Dias

Muito legal esta biblioteca.
Um ponto interessante que não poderia passar batido é a importância de se apagar o display antes de escrever um novo dígito. Esta prática evita o surgimento de fantasmas no display.

Henrique Frank Werner Puhlmann
Visitante

Caro Rafael,

muito bem observado destacar a necessidade de se apagar o display antes de acionar o próximo.De fato neste artigo não abordei explicitamente esse assunto, mas no artigo anterior, "Displays de LED de 7 segmentos", foi comentado isso no tópico "Como acionar um arranjo com vários displays de 7 segmentos?"

De qualquer maneira, no código em C acima é realizada essa operação.
Agradeço o seu comentário.

Abraço