Você está na página 1de 24

Traduzido do Inglês para o Português - www.onlinedoctranslator.

com

Folha de dados do controlador LED de 7 segmentosLED7SEG V 1.20

Direitos autorais © 2005-2014 Cypress Semiconductor Corporation. Todos os direitos reservados.

PSoC®Blocos Memória API (Bytes)


Pinos (por
Recursos Digital TC Analógico Clarão BATER E/S externa)
Analógica SC
CY8C29/27/24/22/21xxx,CY 1a 0 0 311 9 1
8C23x33, CY8C28xxx,
CY8CLED02/04/08/16,
CY7C64215, CY8CPLC20,
CY8CLED16P01,
CYWUSB6953
a. Requer apenas um bloco digital se a opção de temporizador estiver selecionada.

Recursos e visão geral


 Suporta 1 a 8 dígitos
 Qualquer combinação de exibições individuais com até 8 dígitos no total
 Exibe valores hexadecimais e inteiros
 Suporta pontos decimais integrados no display de 7 segmentos
 Suporta displays de cátodo comum e ânodo comum
 Configurável para unidades de dígitos e segmentos Active High e Active Low
Figura 1. LED7SEG Diagrama de bloco

Cypress Semiconductor Corporation • 198 Quadra Campeã • São Jose,CA 95134-1709 • 408-943-2600
Número do Documento: 001-13571 Rev. Revisado 2 de julho de 2014
Controlador LED de 7
segmentos

Descrição Funcional
O Módulo de Usuário LED7SEG é capaz de multiplexar até oito displays de 7 segmentos. Este módulo de usuário é
compatível com cátodo comum, ânodo comum ou qualquer polaridade de inversor. Isso permite uma ampla gama
de flexibilidade com vários monitores. Dígitos e segmentos podem ser acionados diretamente pelos pinos PSoC
sem o uso de transistores ou drivers, desde que os limites de consumo e fonte de corrente dos pinos PSoC não
sejam excedidos.
O diagrama a seguir mostra como os displays de 7 segmentos de ânodo e cátodo comuns são configurados:
Figura 2. 7 segmentos Configurações de exibição

O projeto que utiliza o Módulo de Usuário LED7SEG que manipula pinos em uma porta compartilhada com uma
instância do LED7SEG deve evitar escritas diretas de PRTxDR. Use Shadow Registers para tal manipulação para
evitar operação incorreta do LED7SEG.

Como funciona a multiplexação


Quando 2 ou mais monitores são multiplexados, apenas um dígito fica ligado por vez, embora aparentemente todos
os dígitos fiquem ligados continuamente. Para conseguir esta ilusão, a velocidade com que os ecrãs são ligados e
desligados deve ser superior à resposta do olho humano. Para um display de quatro dígitos, a taxa multiplex deve
estar próxima de 1 kHz; para um display de oito dígitos, a taxa multiplex deve ser o dobro, ou 2 kHz. Ao
multiplexar um display de N dígitos, cada dígito é válido por 1/N do tempo total. Por exemplo, para um sistema
com 8 dígitos e uma taxa de atualização de 2 kHz (período de 500 uS), cada display fica ligado por 500 uSeg a cada
4 mSeg (8 dígitos * 500 uSeg/dígitos).

Por que multiplexar?


O principal motivo para multiplexar um display é salvar os pinos de E/S. Um display multiplexado de oito dígitos
requer apenas 16 pinos. Se o mesmo display fosse acionado diretamente, seriam necessários 64 pinos de E/S. Por
outro lado, a multiplexação requer alguma sobrecarga de CPU. Na maioria dos sistemas, a sobrecarga é pequena o
suficiente para não ser motivo de preocupação. Com este módulo de usuário, se a velocidade da CPU estiver
definida para 12 MHz, o overhead será inferior a 2% com uma taxa multiplex de 1 kHz.
O diagrama a seguir mostra um exemplo de display de quatro dígitos usando este módulo do usuário. A numeração
dos dígitos sempre começa da esquerda (MSB) para a direita (LSB). Resistores devem ser usados nos sinais de
segmento para limitar a corrente do LED e a corrente de drenagem ou fonte do PSoC por pino. Os resistores de
segmento são conectados entre os pinos da porta PSoC e todos os segmentos semelhantes para todos os dígitos. Por
exemplo, os sinais do segmento “a” para todos os monitores são conectados em paralelo, os sinais do segmento “b”
são conectados em paralelo e assim por diante. Uma porta completa de 8 bits é necessária para a porta usada para
acionar os segmentos de exibição (porta de segmento). Nisso

Número do Documento: 001-13571 Rev. Página2 de25


Controlador LED de 7
segmentos

por exemplo, a Porta 1 é usada. A porta usada para acionar o ânodo ou cátodo comum (porta de dígitos) requer
apenas tantos pinos quantos dígitos, mas os pinos devem ser consecutivos.
Neste exemplo, os pinos de porta P2[2], P2[3], P2[4] e P2[5] são usados. Os pinos das portas P2[0], P2[1], P2[2] e
P[3] poderiam igualmente ter sido usados, bem como diversas outras combinações.
Figura 3. Exemplo Display de 4 dígitos usando módulo de usuário LED7SEG

Embora o display de 1 a 8 dígitos possa parecer um display contíguo, ele pode ser organizado em um único display
de oito dígitos ou oito displays de 1 dígito e tudo mais. Por exemplo, você pode configurar 8 dígitos em dois
displays de 3 dígitos e um display de 2 dígitos, ou talvez quatro displays de 2 dígitos. A API pode lidar com
qualquer combinação, desde que os grupos de dígitos sejam contíguos.

Número do Documento: 001-13571 Rev. Página3 de25


Controlador LED de 7
segmentos

Na figura a seguir, oito dígitos foram organizados em três grupos de exibição. O display 1 contém os dígitos 1,2 e
3. O display 2 contém os dígitos 4 e 5, e o display 3 contém os dígitos 6, 7 e 8. Observe que embora os 8 dígitos
tenham sido organizados em 3 grupos, os números dos dígitos ainda são consecutivos. .
Figura 4. Grupos de displays de LED

A seguir está um exemplo de trecho de código que funcionaria com a configuração definida acima:

iNum1 = 123;
iNum2 = 47
iNum3 = 75;
LED7SEG_DispInt( iNum1, 1, 3);// Começa no Dígito 1, com três dígitos
LED7SEG_DispInt( iNum2, 4, 2); // Começa no Dígito 4, com dois dígitos
LED7SEG_DispInt( iNum3, 6, 3); // Comece no dígito 6, com
três dígitos.

Características Elétricas DC e AC
Consulte a ficha técnica do dispositivo.

Número do Documento: 001-13571 Rev. Página4 de25


Controlador LED de 7
segmentos

Colocação
Antes de colocar o Módulo de Usuário LED7SEG, o usuário deve escolher entre um temporizador multiplex
integrado e um temporizador multiplex gerado pelo usuário. Se o temporizador multiplex integrado for selecionado,
um bloco digital será adicionado ao projeto com o único propósito de multiplexação de exibição. Esta é a opção
mais simples se um bloco digital extra estiver disponível. Um parâmetro extra do usuário “Multiplex Rate” está
presente quando esta opção é selecionada.
Se um bloco digital extra não estiver disponível, o usuário poderá utilizar qualquer rotina de serviço de interrupção
do módulo do usuário que seja periódica e próxima de 1 kHz ou mais. Os módulos de usuário que podem ter rotinas
de serviço de interrupção periódica são contadores, temporizadores, PWMs e alguns ADCs. A chamada da função
LED7SEG_Update() deve ser colocada em qualquer rotina de serviço de interrupção do módulo do usuário. Ao
contrário da maioria das funções, a função LED7SEG_Update() preserva os registradores A e X.

Parâmetros e Recursos
Porta do segmento
Este parâmetro é usado para selecionar a porta GPIO que aciona os segmentos de exibição (consulteFigura
3). Todos os oito pinos da porta GPIO selecionada são usados por este módulo de usuário. Qualquer porta
GPIO que tenha todos os oito pinos disponíveis é mostrada como uma opção para este parâmetro.
Porta de dígito
Este parâmetro seleciona a porta GPIO usada para acionar os sinais "comuns" do display de 7 segmentos.Cada
dígito do display possui um sinal comum que controla se esse dígito está ativado ou desativado. Para ver
como os sinais comuns se conectam ao hardware do display de 7 segmentos, consulteFigura 3. Sempre que
umdos sinais comuns está em estado ativo, os cátodos dos LEDs que compõem o dígito correspondente são
conectados ao terra. Então, se algum dos sinais de segmento for acionado, os LEDs correspondentes
acenderão. Porém, se o sinal comum para um dígito não estiver ativo, os cátodos dos LEDs do dígito
correspondente não estão conectados ao terra e, portanto, os LEDs desse dígito não podem ser acesos.
Portanto, o sinal comum para um dígito serve como um sinal liga/desliga global para todo o dígito.
Os pinos que acionam os sinais comuns devem todos fazer parte da mesma porta GPIO para que o código
deste módulo de usuário seja simples e eficiente.
A seleção deste parâmetro escolhe apenas qual porta GPIO será usada para os sinais comuns. O parâmetro
Digit Drive Pins escolhe quais pinos específicos da porta GPIO escolhida serão usados.
Pinos de unidade de dígito
Este parâmetro é utilizado para escolher a quantidade de dígitos que compõem o display de 7 segmentos e os
pinos específicos que acionam os sinais "comuns" que correspondem a cada dígito. Referir-seFigura 3para
ver como os sinais comuns se conectam ao hardware do display de 7 segmentos.
Por exemplo, suponha que um display de 7 segmentos com três dígitos esteja sendo usado e assuma que os
pinos desejados para os sinais comuns são P2[2], P2[3] e P2[4]. Neste caso, deve-se escolher “Port_2” para o
parâmetro Digit Port e “3 Digits Px[2:4]” para o parâmetro Digit Drive Pins.
O caractere 'x' no texto das opções deste parâmetro é um espaço reservado para o número da porta que foi
escolhido com o parâmetro Digit Port. O texto "[x:y]" em cada opção de parâmetro especifica quais pinos da
porta serão usados. O primeiro dígito é o primeiro pino e o último dígito é o último pino. Portanto, "[2:4]"
significa que os pinos 2, 3 e 4 do GPIO da porta GPIO devem ser usados. Os pinos de sinal comuns devem
ser sempre consecutivos na porta GPIO. O primeiro pino comum (P2[2] no exemplo) deve ser conectado ao
primeiro dígito, o segundo pino comum (P2[3] no exemplo) deve ser conectado ao segundo dígito e assim
por diante.

Número do Documento: 001-13571 Rev. Página5 de25


Controlador LED de 7
segmentos

Polaridade da unidade de dígito


Este parâmetro seleciona qual polaridade é necessária para ativar um único dígito.

Opção Descrição
Ativo Baixo Sinal no pino acionado em nível baixo para ativar o dígito.
Alto ativo O sinal no pino é elevado para ativar o dígito.

Polaridade da unidade de segmento


Este parâmetro seleciona qual polaridade é necessária para ligar os segmentos do display.

Opção Descrição
Ativo Baixo Sinal no pino acionado em nível baixo para ativar o segmento.
Alto ativo O sinal no pino é elevado para ativar o segmento.

Taxa Multiplex (válida apenas se a opção de temporizador Multiplex for selecionada)


Esta função seleciona a taxa de atualização do display. A tabela abaixo mostra as opções válidas para este
parâmetro. O temporizador integrado usa o clock de 32kHz para que seja independente do clock VC!, VC2 e
VC3. Telas maiores devem usar as taxas multiplex mais rápidas. Displays menores (2 a 4 dígitos) podem
utilizar taxas mais baixas. Se a tela parecer tremer, aumente a taxa multiplex.

Opção Descrição
500Hz Multiplex a uma taxa de 500 Hz (2 a 3 dígitos)
1kHz Multiplex a uma taxa de 1 kHz (3 a 5 dígitos)
2 kHz Multiplex a uma taxa de 2 kHz (4 a 6 dígitos)
4kHz Multiplex a uma taxa de 4 kHz (6 a 8 dígitos)

Número do Documento: 001-13571 Rev. Página6 de25


Controlador LED de 7
segmentos

Interface de programação de aplicativos


As rotinas da Interface de Programação de Aplicativo (API) são fornecidas como parte do módulo do usuário para
permitir que o designer lide com o módulo em um nível superior.
Embora algumas funções da API do módulo de usuário possam deixar A e X inalterados, não há garantia de que
isso acontecerá no futuro.
Para dispositivos Modelo de Memória Grande, também é responsabilidade do chamador preservar qualquer valor
nos registros CUR_PP, IDX_PP, MVR_PP e MVW_PP. Mesmo que alguns desses registros não possam ser
modificados agora, não há garantia de que continuará assim em versões futuras.
Cada vez que um módulo de usuário é colocado, é atribuído a ele um nome de instância. Por padrão, o PSoC
Designer atribui o LED7SEG_1 à primeira instância deste módulo de usuário em um determinado projeto. Pode ser
alterado para qualquer valor único que siga as regras sintáticas para identificadores. O nome da instância atribuído
torna-se o prefixo de cada nome de função global, variável e símbolo de constante. Nas descrições a seguir, o nome
da instância foi abreviado para LED7SEG para simplificar.
As seguintes constantes são definidas no cabeçalho do módulo do usuário:

Constante Valor
LED7SEG_Digit1 0x01
LED7SEG_Digit2 0x02
LED7SEG_Digit3 0x04
LED7SEG_Digit4 0x08
LED7SEG_Digit5 0x10
LED7SEG_Digit6 0x20
LED7SEG_Digit7 0x40
LED7SEG_Digit8 0x80
LED7SEG_DimOn 0x01
LED7SEG_DimOff 0x00
LED7SEG_DpOn 0x01
LED7SEG_DpOff 0x00

LED7SEG_Start

Descrição:
Limpa toda a memória de dígitos e permite a digitalização. Se o temporizador multiplex for selecionado, ele
também habilita o temporizador e habilita sua interrupção. As interrupções globais precisam ser habilitadas
para que a multiplexação funcione.
Protótipo C:
vazio LED7SEG_Start(vazio)

Montador:
ligue para LED7SEG_Start

Número do Documento: 001-13571 Rev. Página7 de25


Controlador LED de 7
segmentos

Parâmetros:
Nenhum
Valor de retorno:
Nenhum
Efeitos colaterais:
Nenhum

LED7SEG_Stop

Descrição:
Interrompe a varredura do display e desativa todos os dígitos. Se o temporizador de multiplexação for
selecionado, esta função também desabilita o temporizador e sua interrupção.
Protótipo C:
vazio LED7SEG_Stop(vazio)

Montador:
ligue para LED7SEG_Stop

Parâmetros:
Nenhum.
Valores de retorno:
Nenhum
Efeitos colaterais:
O ISR de atualização não verifica mais a exibição.

LED7SEG_PutHex

Descrição:
Coloca um único dígito hexadecimal (0 a F) no dígito fornecido.
Protótipo C:
vazio LED7SEG_PutHex(BYTE bValue, BYTE bDigit)

Montador:
movimentoa,0x5; Escreva um '5' no display
movx,0x01; Escreva o '5' no dígito 1

chamar LED7SEG_PutHex

Parâmetros:
bValue: Valor hexadecimal entre 0 e F a ser
exibido. bDigit: localização do dígito para colocar o
bValue fornecido.
Valor de retorno:
Nenhum

Número do Documento: 001-13571 Rev. Página8 de25


Controlador LED de 7
segmentos

Efeitos colaterais:
Os registradores A e X podem ser alterados por esta função.

LED7SEG_PutPattern

Descrição:
Grava um padrão de bytes diretamente na memória do display. Um bit alto corresponde a um segmento ativo,
independentemente de o display ser ânodo ou cátodo comum. O LSB é o segmento 'a' e o MSB é o “dp”,
ponto decimal.
Protótipo C:
vazio LED7SEG_PutPattern(BYTE bPattern, BYTE bDigit)

Montador:
movimentoa,0xFF; Ative todos os
segmentos mov x,0x01

lcall LED7SEG_PutPattern

Parâmetros:
bPattern: Um padrão de bits a ser exibido. Por exemplo, 0x80 ativa apenas o ponto decimal e 0x7F ativa
todos os segmentos exceto o ponto decimal.
bDigit: localização do dígito para colocar o bValue fornecido.
Valor de retorno:
Nenhum

LED7SEG_DP

Descrição:
Ative ou desative o ponto decimal no local especificado.
Protótipo C:
vazio LED7SEG_DP(BYTE bOnOff, BYTE bDigit)

Montador:
movimento
a,0x1
movimento
x,0x01
ligue para LED7SEG_DP
Parâmetros:
bOnOff: 0 => Desativar ponto decimal, 1 => ativar ponto decimal. bDigit:
Localização do dígito para ponto decimal.
Valor de retorno:
Nenhum
Efeitos colaterais:
Os registradores A e X podem ser alterados por esta função.

Número do Documento: 001-13571 Rev. Página9 de25


Controlador LED de 7
segmentos

LED7SEG_Dim

Descrição:
Escureça ou apague a tela. Quando dim está ativado, a atualização ignora todos os outros ciclos de atualização.
Protótipo C:
vazio LED7SEG_Dim(BYTE bDim)

Montador:
movimento x,0x01 ;
Escureça o display lcall LED7SEG_Dim
Parâmetros:
bDim: 0 => Não escurecer a tela, 1 => Escurecer a tela
Valor de retorno:
Nenhum
Efeitos colaterais:
Os registradores A e X podem ser alterados por esta função.

LED7SEG_DispInt

Descrição:
Exibir um valor inteiro no display. Pode ter entre 1 e 5 dígitos e começar em qualquer local. Intervalo de números a
serem exibidos, de 0 a 65535.
Protótipo C:
void LED7SEG_DispInt(int iValue, BYTE bPos, BYTE bLSD)

Montador:
mov X, SP
adicionar
SP, 4
movimento [X], 0x34; Carregue MSB de
valor para exibir mov [X+1], 0x12 ; Carregue o
LSB do valor a ser exibido
movimento [X+2], 0; Defina o local inicial para o
valor no display mov [X+3], 4; Defina o número de dígitos a serem
exibidos
lcall LED7SEG_DispInt
Parâmetros:
iValue: Valor inteiro a ser exibido.
bPos: Posição do dígito no display onde se inicia a exibição do valor.
BLSD: Comprimento do dígito a ser exibido, por exemplo, exibir apenas 4
dígitos.
Valor de retorno:
Nenhum
Efeitos colaterais:
Os registradores A e X podem ser alterados por esta função.

Número do Documento: 001-13571 Rev. Página10 de25


Controlador LED de 7
segmentos

LED7SEG_Atualização

Descrição:
A função Update controla a taxa de multiplexação do display. Cada vez que é chamado, o dígito exibido
anterior é desativado e o próximo é ativado. Esta função é chamada automaticamente periodicamente caso a
opção “LED7SEG com MPX Timer” seja selecionada no menu “User Module Selection Options...”. Se a
opção “LED7SEG sem MPX Timer" for escolhida, o usuário precisa chamar esta função periodicamente a
cada 2 a 0,5 mseg para fornecer multiplexação sem cintilação. Esta função pode ser chamada no loop do
programa principal do usuário ou a partir de uma rotina de serviço de interrupção existente.
Protótipo C:
vazio LED7SEG_Update(vazio)

Montador:
lcall LED7SEG_Update

Parâmetros:
Nenhum
Valores de retorno:
Nenhum
Efeitos colaterais:
Todos os registradores são preservados, portanto não há necessidade de preservar A e X antes de chamar esta
função.

Exemplo de código-fonte de firmware


Exemplo de código de montagem
;
; // Exemplo de código ASM usando módulo de usuário LED7SEG
;

incluir "m8c.inc" ; parte constantes e macros específicas


inclua "memory.inc"; Constantes e macros para SMM/LMM eO
compilador inclui "PSoCAPI.inc"; Definições da API PSoC para todos
os módulos de usuário

exportar _principal

_principal:
ligue para LED7SEG_Start

;; Ative o temporizador multiplex aqui se estiver usando


;; versão sem temporizador integrado.

M8C_EnableGint ; Habilitar interrupções


globais push X
movimento A,4 ; Empurre o tamanho da
exibição na pilha "4" empurre A
movimento UM,1 ; Pressione o início do
display na pilha "1" pressione A
movimento UM,>1234 ; Push MSB do valor
1234 na pilha push A

Número do Documento: 001-13571 Rev. Página11 de25


Controlador LED de 7
segmentos
movimento UM,<1234 ; Empurre LSB do valor 1234 na pilha

Número do Documento: 001-13571 Rev. Página12 de25


Controlador LED de 7
segmentos

empurre A
lcall LED7SEG_DispInt; Exibir "1234"
movimento X,3 ; Ative o ponto decimal no dígito 3
movimento UM,1 ;
Habilitar DP lcall LED7SEG_DP

.terminar:
jmp.terminar

Exemplo de código C
//
// Exemplo de código C usando o módulo de usuário LED7SEG
//

#include <m8c.h>
#include "PSoCAPI.h"

vazio principal(vazio)
{
LED7SEG_Start(); // Ativar exibição
M8C_EnableGint; // Habilitar IRQ

// Habilite o timer multiplex aqui se estiver usando


// versão do temporizador não integrado.

M8C_EnableGint;
LED7SEG_DispInt(1234, 1, 4); // Exibe "1234"
LED7SEG_DP(1, 3);// Ligue DP (123,4)
}

Registros de configuração
Nenhum

Número do Documento: 001-13571 Rev. Página13 de25


Controlador LED de 7
segmentos

Histórico de versões

Versão Originador Descrição


1.1 DHA Adicionado histórico de versões.
1,20 DHA Adicionado suporte para dispositivos CY8C21x12.

ObservaçãoPSoC Designer 5.1 introduz um histórico de versão em todas as planilhas de dados do módulo do
usuário. Esta seção documenta descrições de alto nível das diferenças entre as versões atuais e anteriores do
módulo do usuário.

Número do Documento: 001-13571 Rev. Revisado 2 de julho de 2014 Página 13 de 13


Direitos autorais © 2005-2014 Cypress Semiconductor Corporation. As informações aqui contidas estão sujeitas a alterações sem aviso prévio. A Cypress Semiconductor Corporation não assume nenhuma
responsabilidade pelo uso de qualquer circuito que não seja o incorporado em um produto Cypress. Nem transmite ou implica qualquer licença sob patente ou outros direitos. Os produtos Cypress não são
garantidos nem se destinam ao uso em aplicações médicas, de suporte à vida, de salvamento, de controle crítico ou de segurança, a menos que esteja de acordo com um acordo expresso por escrito com a Cypress.
Além disso, a Cypress não autoriza o uso de seus produtos como componentes críticos em sistemas de suporte à vida, onde um mau funcionamento ou falha possa razoavelmente resultar em ferimentos
significativos ao usuário. A inclusão de produtos Cypress na aplicação de sistemas de suporte de vida implica que o fabricante assume todos os riscos de tal uso e, ao fazê-lo, indeniza a Cypress contra todas as
acusações.

PSoC Designer™ e Programmable System-on-Chip™ são marcas comerciais e PSoC® é uma marca registrada da Cypress Semiconductor Corp. Todas as outras marcas comerciais ou marcas registradas aqui
mencionadas são propriedade das respectivas corporações.

Qualquer código-fonte (software e/ou firmware) é de propriedade da Cypress Semiconductor Corporation (Cypress) e é protegido e sujeito à proteção de patente mundial (Estados Unidos e estrangeiros), leis de
direitos autorais dos Estados Unidos e disposições de tratados internacionais. A Cypress concede ao licenciado uma licença pessoal, não exclusiva e intransferível para copiar, usar, modificar, criar trabalhos
derivados e compilar o Código Fonte Cypress e trabalhos derivados com o único propósito de criar software personalizado e/ou firmware de suporte do produto licenciado para ser usado somente em conjunto com
um circuito integrado Cypress conforme especificado no contrato aplicável. Qualquer reprodução, modificação, tradução, compilação ou representação deste Código Fonte, exceto conforme especificado acima, é
proibida sem a permissão expressa por escrito da Cypress.

Isenção de responsabilidade: A CYPRESS NÃO OFERECE QUALQUER TIPO DE GARANTIA, EXPRESSA OU IMPLÍCITA, COM RELAÇÃO A ESTE MATERIAL, INCLUINDO, MAS NÃO SE LIMITANDO A, AS
GARANTIAS IMPLÍCITAS
DE COMERCIALIZAÇÃO E ADEQUAÇÃO A UM DETERMINADO FIM. Cypress reserva-se o direito de fazer alterações sem aviso prévio nos materiais aqui descritos. Cypress não assume qualquer
responsabilidade decorrente da aplicação ou uso de qualquer produto ou circuito aqui descrito. A Cypress não autoriza o uso de seus produtos como componentes críticos em sistemas de suporte à vida, onde um
mau funcionamento ou falha pode razoavelmente resultar em ferimentos significativos ao usuário. A inclusão do produto Cypress em uma aplicação de sistemas de suporte à vida implica que o fabricante assume
todos os riscos de tal uso e, ao fazê-lo, indeniza a Cypress contra todas as acusações.
Controlador LED de 7
segmentos
O uso pode ser limitado e sujeito ao contrato de licença de software Cypress aplicável.

1-CONFIGURAÇÕES INICIAIS

Listagem do Processador Utilizado:


Esta diretiva informa ao montador qual processador está sendo utilizado. Neste caso, é o PIC16F628A.
list p=16F628A

Arquivos Inclusos no Projeto:


Inclui o arquivo de configuração específico para o PIC16F628A. Esse arquivo contém definições e
Controlador LED de 7
segmentos
constantes específicas para o processador.

#include <p16f628a.inc>

FUSE Bits (Bits de Fusível):


Configura os bits de fusível do microcontrolador. Cada configuração tem um significado específico. Aqui estão
algumas das configurações:
 _XT_OSC: Configuração para uso de cristal externo.
 _WDT_OFF: Desabilita o Watchdog Timer.
 _PWRTE_ON: Habilita o Power-Up Timer.
 _BOREN_OFF: Desabilita o Brown-Out Reset.
 _LVP_OFF: Desabilita a programação de baixa tensão.
 _CP_OFF e _CPD_OFF: Desabilitam a proteção de código.
 _MCLRE_OFF: Desabilita o pino MCLR como entrada.

__config _XT_OSC & _WDT_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CP_OFF &
_CPD_OFF & _MCLRE_OFF

Paginação de Memória:
Define macros para facilitar a seleção de bancos de memória. bank0 e bank1 são utilizadas para selecionar o banco
0 e o banco 1, respectivamente.

#define bank0 bcf STATUS,RP0


#define bank1 bsf STATUS,RP0

Essas configurações iniciais estabelecem o ambiente de desenvolvimento para o código, especificando o


processador, incluindo arquivos de configuração relevantes, configurando os bits de fusível e definindo macros
para facilitar a manipulação dos bancos de memória. Isso permite ao programador configurar o ambiente de
execução do programa de acordo com os requisitos específicos do projeto.

2- MAPEAMENTO DO HARDWARE

#define LED1 PORTA,3


#define LED2 PORTA,2
#define S1 PORTB,0
#define S2 PORTA,5
#define digit1 PORTA,1
#define digit2 PORTA,0

Mapeamento de hardware:
 - `LED1`: Define o pino do LED1 como o pino RA3 do registrador PORTA.
 - `LED2`: Define o pino do LED2 como o pino RA2 do registrador PORTA.
 - `S1`: Define o pino do botão S1 como o pino RB0 do registrador PORTB.
 - `S2`: Define o pino do botão S2 como o pino RA5 do registrador PORTA.
 - `digit1`: Define o pino do dígito mais significativo do display como o pino RA1 do registrador PORTA.
 - `digit2`: Define o pino do dígito menos significativo do display como o pino RA0 do registrador
PORTA.
Controlador LED de 7
segmentos
Essas definições tornam o código mais legível e fácil de entender, pois os nomes simbólicos (`LED1`,
`LED2`, etc.) são usados em vez de números de pinos brutos. Isso é útil porque, se a configuração de hardware
precisar ser modificada posteriormente, apenas essas definições precisam ser ajustadas, facilitando a manutenção
do código.
Esses mapeamentos são usados ao longo do código para se referir aos diferentes pinos do
microcontrolador, proporcionando uma abstração que torna o código mais claro e modular. Por exemplo, em vez
de usar constantemente números de pino brutos, o programador pode usar esses nomes simbólicos para melhorar
a legibilidade do código e facilitar futuras modificações no hardware.

3- REGISTRADORES DE USO GERAL

A seção de "Registradores de Uso Geral" destina-se a reservar uma área específica de memória para o
armazenamento temporário de dados. Isso é feito por meio da definição de um bloco de registradores utilizando
a diretiva `cblock`.

cblock H'20'
W_TEMP ; Registrador para armazenar o conteúdo temporário de W
STATUS_TEMP ; Registrador para armazenar o conteúdo temporário de
STATUS
counter ; Registrador auxiliar de contagem
timer ; Registrador para atualizar o valor do display
dez ; Dezena do número exibido no display
uni ; Unidade do número exibido no display
endc

1. cblock H'20:
 A diretiva `cblock` define um bloco de registradores de uso geral. `H'20'` especifica o endereço de início
do bloco. Isso cria um espaço de armazenamento em que o programador pode atribuir nomes simbólicos
para facilitar o acesso e manipulação de dados temporários.

2. `W_TEMP`:
 `W_TEMP` é um registrador destinado a armazenar temporariamente o conteúdo do registrador W
(registrador de trabalho). Durante a execução de certas operações, o conteúdo do registrador W pode ser
temporariamente transferido para `W_TEMP` e, posteriormente, restaurado.

3. `STATUS_TEMP`:
 `STATUS_TEMP` é um registrador usado para armazenar temporariamente o conteúdo do registrador de
status. O registrador de status contém informações sobre o estado do microcontrolador, incluindo
sinalizadores de status e informações sobre o banco de memória atual.

4. `counter`:
 `counter` é um registrador auxiliar de contagem. Pode ser utilizado para contar eventos ou iterações em
determinadas partes do código.

5. `timer`:
 `timer` é um registrador usado para rastrear o tempo ou a contagem. Parece ser utilizado para controlar a
multiplexação do display, conforme mencionado na seção de interrupção do Timer0.

6. `dez` e `uni`:
Controlador LED de 7
segmentos
 `dez` e `uni` são registradores destinados a armazenar a dezena e a unidade do número que será exibido
no display, respectivamente.

Esses registradores são definidos para facilitar o armazenamento temporário de dados durante a execução
do programa. O uso de nomes simbólicos melhora a legibilidade do código e facilita a manutenção, pois os
registradores são referenciados por seus nomes significativos em vez de endereços brutos de memória.

4- VETOR DE RESET

org H'0000' ; Origem no endereço 0000h de memória


goto inicio ; Desvia para a label início

A diretiva `org` (origem) define o endereço no qual o vetor de RESET começa. No caso, `H'0000'` representa o
endereço de memória 0000h, que é onde o programa começa a ser executado quando o microcontrolador é ligado
ou é realizado um reset.

2. `goto inicio`
 A instrução `goto` é uma instrução de desvio incondicional. `inicio` é uma label (rótulo) que
marca o início do programa principal. Essa instrução desvia a execução do programa para o
ponto rotulado como `inicio`.

O vetor de RESET é a primeira parte do código a ser executada quando o microcontrolador é ligado ou é
realizado um reset. Sua principal função é iniciar a execução do programa principal, e no caso deste código, o
programa principal é marcado pela label `inicio`.
Ao usar a instrução `goto inicio`, o código pula diretamente para o início do programa, evitando a
execução de quaisquer instruções no vetor de RESET além daquela que direciona para o início. Essa é uma
prática comum em programação de microcontroladores, onde o vetor de RESET é usado apenas para direcionar
a execução para a parte principal do programa.

5-VETOR DE INTERRUPÇÃO
org H'0004' ; As interrupções deste processador apontam para
este endereço

; -- Salva Contexto --
movwf W_TEMP ; Copia o conteúdo de Work para W_TEMP
swapf STATUS,W ; Move o conteúdo de STATUS com os nibbles
invertidos para Work
bank0 ; Seleciona o banco 0 de memória (padrão do RESET)
movwf STATUS_TEMP ; Copia o conteúdo de STATUS com os nibbles
invertidos para STATUS_TEMP
; -- Final do Salvamento de Contexto --

btfss INTCON,T0IF ; Houve overflow do Timer0?


goto exit_ISR ; Não, desvia para a saída da interrupção
bcf INTCON,T0IF ; Sim, limpa a flag
btfss digit1 ; Digito mais significativo ativado?
goto digit2_off ; Não, desvia para desligar digito menos
significativo
bcf digit1 ; Sim, desliga digito mais significativo
clrf PORTB ; Limpa PORTB
bsf digit2 ; Liga digito menos significativo
goto copy_uni ; Desvia para copiar unidade ao display

digit2_off:

bcf digit2 ; Desliga digito menos significativo


clrf PORTB ; Limpa PORTB
bsf digit1 ; Liga digito mais significativo
Controlador LED de 7
segmentos
movf dez,W ; Move conteúdo de dezena para work
call send_disp ; Chama sub-rotina para atualizar display
movwf PORTB ; PORTB recebe o dado convertido
goto exit_ISR ; Desvia para saída da interrupção

copy_uni:

movf uni,W ; Move conteúdo de unidade para work


call send_disp ; Chama sub-rotina para atualizar display
movwf PORTB ; PORTB recebe o dado convertido

exit_ISR:

swapf STATUS_TEMP,W ; Copia em Work o conteúdo de STATUS_TEMP com os


nibbles invertidos
movwf STATUS ; Recupera o conteúdo de STATUS
swapf W_TEMP,F ; W_TEMP = W_TEMP com os nibbles invertidos
swapf W_TEMP,W ; Recupera o conteúdo de Work
retfie ; Retorna da interrupção

1. `org H'0004'`:
 - Assim como no vetor de RESET, a diretiva `org` define o endereço onde o vetor de
interrupção começa. No caso, `H'0004'` representa o endereço de memória 0004h.
2. Salvando o Contexto (início):
 Antes de realizar qualquer operação no vetor de interrupção, o código salva o contexto atual.
 `movwf W_TEMP`: Move o conteúdo do registrador de trabalho (W) para o registrador
temporário W_TEMP.
 `swapf STATUS,W`: Move o conteúdo do registrador de status com os nibbles invertidos para o
registrador W.
 `bank0`: Seleciona o banco 0 de memória.
 `movwf STATUS_TEMP`: Move o conteúdo de W para o registrador STATUS_TEMP.

3. Verificação da Condição da Interrupção:


 - `btfss INTCON,T0IF`: Verifica se houve um overflow no Timer0.
 - `goto exit_ISR`: Se não houver overflow, o código desvia para a saída da interrupção.

4. Manipulação da Interrupção:
 - Diversas operações são realizadas dependendo das condições.
 - O código manipula a multiplexação dos dígitos do display e a limpeza de flags de interrupção.

5. Recuperação do Contexto (fim):


 - `exit_ISR` é uma label que marca o fim do tratamento da interrupção.
 - O contexto salvo é recuperado:
 - `swapf STATUS_TEMP,W`: Move o conteúdo de STATUS_TEMP com os nibbles invertidos
para W.
 - `movwf STATUS`: Recupera o conteúdo de STATUS.
 - `swapf W_TEMP,F`: W_TEMP = W_TEMP com os nibbles invertidos.
 - `swapf W_TEMP,W`: Recupera o conteúdo de W_TEMP.
 - `retfie`: Retorna da interrupção.
Controlador LED de 7
segmentos
O vetor de interrupção é responsável por tratar a interrupção gerada pelo Timer0. Ele salva o contexto,
verifica a condição da interrupção, executa ações específicas e, em seguida, recupera o contexto antes de retornar
à execução normal do programa.

6- PROGRAMA PRINCIPAL

inicio:
bank1 ; Muda para o banco 1 de memória
movlw H'F0' ; Move o literal F0h para work
movwf TRISA ; Configura RA3, RA2, RA1 e RA0 como saída
movlw H'01' ; Move o literal 01h para work
movwf TRISB ; Configura todo PORTB como saída, exceto RB0
movlw H'D3' ; Move o literal D3h para work
movwf OPTION_REG ; Timer0 incrementa com ciclo de máquina,
prescaler 1:32
bank0 ; Muda para o banco 0 de memória
movlw H'07' ; Move o literal 07h para work
movwf CMCON ; Desabilita comparadores
movlw H'A0' ; Move o literal A0h para work
movwf INTCON ; Habilita a interrupção global e do timer0
clrf dez ; Limpa dezena
clrf uni ; Limpa unidade

loop:
movlw D'1'
movwf dez
movlw D'3'
movwf uni

goto loop ; Não, desvia de volta para loop

1. `inicio`:
 - `inicio` é uma label que marca o início do programa principal.

2. Configurações Iniciais:
 - `bank1`: Muda para o banco 1 de memória.
 - `movlw H'F0'`: Move o literal F0h para o registrador de trabalho (W).
 - `movwf TRISA`: Configura os pinos RA3, RA2, RA1 e RA0 como saída.
 - `movlw H'01'`: Move o literal 01h para W.
 - `movwf TRISB`: Configura todo o registrador PORTB como saída, exceto RB0.
 - `movlw H'D3'`: Move o literal D3h para W.
 - `movwf OPTION_REG`: Configura o Timer0 para incrementar com o ciclo de máquina e
prescaler 1:32.
 - `bank0`: Muda de volta para o banco 0 de memória.
 - `movlw H'07'`: Move o literal 07h para W.
 - `movwf CMCON`: Desabilita os comparadores.
 - `movlw H'A0'`: Move o literal A0h para W.
 - `movwf INTCON`: Habilita a interrupção global e do Timer0.

3. Limpeza e Inicialização:
 - `clrf dez`: Limpa o registrador de dezena.
 - `clrf uni`: Limpa o registrador de unidade.
Controlador LED de 7
segmentos

4. Loop Infinito:
 - `loop` é uma label que marca o início de um loop infinito.
 - `movlw D'1'`: Move o literal 1 para W.
 - `movwf dez`: Atribui 1 ao registrador de dezena.
 - `movlw D'3'`: Move o literal 3 para W.
 - `movwf uni`: Atribui 3 ao registrador de unidade.

5. Retorno para o Loop:


- `goto loop`: Retorna para o início do loop, reiniciando o processo.

O programa principal configura o ambiente inicial do microcontrolador, define as condições iniciais e


entra em um loop infinito. Durante cada iteração do loop, são definidos valores para os registradores de dezena e
unidade, iniciando o ciclo novamente. O programa ficará continuamente repetindo essas operações enquanto
estiver em execução.

7- SUB ROTINAS DE CONVERSÂO PARA DISPLAY DE 7 SEGMENTOS


send_disp: ; Sub-rotina para conversão
binário
addwf PCL, F ; PCL = PCL + W

; 'gfedcba ' ; Reposicionamento correto


dos segmentos
retlw B'01111110' ; Retorna o símbolo '0'
retlw B'00001100' ; Retorna o símbolo '1'
retlw B'10110110' ; Retorna o símbolo '2'
retlw B'10111110' ; Retorna o símbolo '3'
retlw B'11001100' ; Retorna o símbolo '4'
retlw B'11011010' ; Retorna o símbolo '5'
retlw B'00001010' ; Retorna o símbolo '6'
retlw B'00001110' ; Retorna o símbolo '7'
retlw B'11101110' ; Retorna o símbolo '8'
retlw B'11011110' ; Retorna o símbolo '9'

1. `send_disp:`:
 `send_disp` é uma label que marca o início da sub-rotina de conversão.

2. `addwf PCL, F`:


 - `addwf PCL, F` é uma instrução que incrementa o Program Counter (PCL) pelo valor contido em W.
Neste caso, W é implicitamente considerado como 1, resultando em um desvio para o próximo
endereço de memória.

3. Comentários de Posicionamento de Segmentos:


 - Os comentários `'gfedcba '` indicam a correspondência entre os bits do byte retornado e os segmentos
de um display de 7 segmentos. Cada bit representa um segmento do display.

4. Retorno de Valores para Dígitos:


 - `retlw B'01111110'`: Retorna o valor binário correspondente ao dígito 0 em um display de 7 segmentos.
 - `retlw B'00001100'`: Retorna o valor binário correspondente ao dígito 1.
Controlador LED de 7
segmentos
 - ... e assim por diante, até o dígito 9.

Essa sub-rotina é usada para converter valores binários (de 0 a 9) em representações adequadas para um display
de 7 segmentos. O valor binário que precisa ser convertido é usado como índice para a tabela, e o byte
correspondente (representando os segmentos acesos para exibir o dígito) é retornado pela sub-rotina.

8- RECUPERAÇÂO DO CONTEXTO E FINALIZAÇÂO

exit_ISR:

Swapf STATUS_TEMP,W ; Copia em Work o conteúdo de


STATUS_TEMP com os nibbles invertidos
decfsz timer, F ; Decrementa o contador auxiliar
(timer)
goto exit_ISR ; Se não for zero, continua na
rotina de saída da interrupção
bsf LED1 ; Se for zero, liga o LED1
swapf W_TEMP,F ; W_TEMP = W_TEMP com os nibbles
invertidos
swapf W_TEMP,W ; Recupera o conteúdo de Work
retfie ; Retorna da interrupção

1. `exit_ISR:`:
 `exit_ISR` é uma label que marca o início da rotina de saída da interrupção.

2. `Swapf STATUS_TEMP,W`:
 `Swapf STATUS_TEMP,W` copia o conteúdo do registrador `STATUS_TEMP` com os nibbles
invertidos para o registrador `W`. Isso é feito para recuperar o conteúdo original de `STATUS` no final
da rotina.

3. `decfsz timer, F`:


 `decfsz timer, F` decrementa o registrador `timer` (contador auxiliar). Se o resultado for zero, o código
não pula para `exit_ISR` e continua para a próxima instrução.

4. `goto exit_ISR`:
 `goto exit_ISR` faz um loop de volta para a label `exit_ISR` se o contador `timer` não atingiu zero.
Controlador LED de 7
segmentos
5. `bsf LED1`:
 `bsf LED1` (Bit Set File) liga o LED1 (assumindo que o LED1 está conectado ao pino RA3) se o
contador `timer` atingiu zero.

6. `swapf W_TEMP,F`:
 `swapf W_TEMP,F` inverte os nibbles em `W_TEMP`. Este passo não é claramente explicado no código
fornecido, e o propósito exato pode depender de detalhes não apresentados.

7. `swapf W_TEMP,W`:
 `swapf W_TEMP,W` recupera o conteúdo de `W_TEMP`.

8. `retfie`:
 `retfie` é uma instrução que retorna da interrupção.

Essa parte do código lida com a recuperação do contexto após a interrupção do Timer0. Ela verifica se o
contador `timer` ainda não atingiu zero. Se ainda houver contagem, a rotina de saída da interrupção continua no
loop. Quando o contador atinge zero, o LED1 é ligado, e o contexto é recuperado antes de retornar da
interrupção.

Você também pode gostar