Escolar Documentos
Profissional Documentos
Cultura Documentos
com
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.
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.
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.
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.
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.
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.
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)
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
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
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.
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.
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.
exportar _principal
_principal:
ligue para LED7SEG_Start
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
M8C_EnableGint;
LED7SEG_DispInt(1234, 1, 4); // Exibe "1234"
LED7SEG_DP(1, 3);// Ligue DP (123,4)
}
Registros de configuração
Nenhum
Histórico de versões
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.
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
#include <p16f628a.inc>
__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.
2- MAPEAMENTO DO HARDWARE
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.
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
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 --
digit2_off:
copy_uni:
exit_ISR:
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.
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.
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
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.
1. `send_disp:`:
`send_disp` é uma label que marca o início da sub-rotina de conversão.
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.
exit_ISR:
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.
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.