Você está na página 1de 7

Universidade Federal de Mato Grosso - UFMT

Faculdade de Arquitetura, Engenharia e Tecnologia - FAET


Departamento de Engenharia Elétrica
Microprocessadores - 2018/1

Laboratório 5: Acionamento de LED’s e Display’s


Objetivos: Projetar aplicações microcontroladas para gerenciar portas de E/S digitais. Desenvolver,
implementar e simular programas em Assembly para acionamento de LEDs e Displays de 7
segmentos utilizando o µC PIC16F877A. Os programas serão editados e simulados no ambiente
MPLAB-IDE. Testes experimentais serão realizados utilizando o módulo didático PIC-2377.

1) MPASM para geração de programa objeto


O MPLAB-IDE utiliza o montador MPASM para gerar o programa objeto (código de máquina absoluta)
que deve ser gravado no C PIC. Também pode gerar módulos de código que podem ser ligados mais tarde
usando a ferramenta MPLINK, para criar um programa completo.

CODE.ASM MPASM.EXE C PIC


CODE.HEX GRAVADOR

Figura 1. Programação, Montagem e gravação do µC PIC.


Arquivos de entrada e saída do programa MPASM
Extensão Propósito
.ASM Extensão, por default, de um arquivo fonte para MPASM:
<source_name>.ASM
.LST Extensão de arquivo para listagem de registros gerados pelo MPASM:
<source_name>.LST
.ERR Extensão de arquivo para relatar erros:
<source_name>.ERR
.HEX Extensão de arquivo do programa objeto:
<source_name>.HEX

Formato básico de uma linha de instrução em Assembly


[Etiqueta:] [Mnemónico] [Operando] [; Comentário]
Loop: movwf PORTD ; Exemplo de linha de instrução

2) Configuração de Portas como Entradas e Saídas (E/S)


O PIC16F877A possui suas portas identificadas como PORTA, PORTB, PORTC, PORTD e PORTE que
podem operar como entradas ou saídas digitais, e ainda cada uma destas portas possui funções adicionais
permitindo operar também como entradas analógicas, como sinais de interrupção, sinais para os
temporizadores internos, comunicação serial, modulador por largura de pulso (PWM) e/ou comunicação
paralela. Assim, as portas, geralmente, possuem mais de um tipo de função.
Antes de usar cada uma destas portas, é necessário configurá-las para o tipo de funcionamento desejado.
Portanto, existem registradores especiais que deverão ser inicializados, a fim de definir o modo de operação.
No módulo didático, estas portas foram conectadas a periféricos específicos, tais como, bancos de LEDs,
bancos de chaves, Displays, motor DC, sensor de temperatura, teclado, chaves, relês e outros. Assim,
devem-se verificar quais tipos de periféricos estão conectados a cada uma dessas portas, para não acionar
uma operação indevida no sistema.
A ligação dos periféricos ao PIC deve ser realizada através de micro chaves do tipo DIP-SWITCH, que
deverão sempre ser deixadas na posição OFF, ou seja, para baixo, para não conectar indevidamente os
periféricos não utilizados na experiência.
Conforme descrito no datasheet do PIC16F877A, as portas PORTB, PORTC e PORTD são bidirecionais,
de oito bits cada, e os registradores TRISB, TRISC e TRISD, respectivamente, são responsáveis pela
direção dos dados nessas portas. Um nível alto (1) no bit n do registrador TRISx define que o pino n da
PORTx opere como entrada e um nível baixo (0), vai defini-lo como saída.
Os registradores PORTB, PORTC e PORTD, estão localizados nos endereções 0x06, 0x07 e 0x08,
respectivamente, do banco de registradores (banco 0). Os registradores TRISB, TRISC e TRISD, estão
localizados nos endereções 0x86, 0x87 e 0x88, respectivamente, do banco de registradores (banco 1). O
banco de registradores corresponde à memória de dados do PIC.
Ainda, é necessário lembrar que, para acessar a um registrador localizado em um determinado banco da
memória RAM, deve-se selecionar o banco através dos bits RP1 e RP0 do registrador de STATUS
(STATUS<5:4>).

3) Esquemático para acionamento de LEDs e teclado básico no módulo didático


O acionamento dos LEDs é realizado através da PORTD, então, é necessário fechar as chaves CH4(1-8).
Nota-se que para acender um LED, o bit correspondente da PORTD deverá estar definido em nível zero.
Para isso acontecer, todos os pinos da PORTD devem ser definidos como saídas.
+5V 330 RB3
RD0 330 +5V
RB2
PIC16F877A
RD1
RB1
RD2
RB0
RD3 Linha 1 10k
RD4 RC3 F 0 E D

RD5 RC2 1 2 3 C Teclado


Básico
RD6 RC1 4 5 6 B

RD7 RC0 7 8 9 A
LEDs Linha 4
Figura 2 – Circuito esquemático de conexões de PIC com LEDs e teclado básico.
Quatro pinos da PORTB e 4 pinos da PORTC são usados para implementar mecanismos de varredura para
leitura de um teclado matricial 4x4. Um arranjo matricial de teclas é um método utilizado nos
microcomputadores, pois permite usar um menor número de pinos do processador, necessários para a
varredura um teclado, ou seja, se cada tecla fosse ligada a um pino do processador seriam necessários 16
pinos para acessar individualmente cada tecla. No modo matricial a varredura de um teclado, com 16 teclas,
foi possível com apenas 8 pinos (4 da PORTB e 4 da PORTC).
Como mostrado na Figura 2, para implementar uma varredura, os quatro pinos PORTC<3:0> devem ser
definidas como saídas (TRISC<3:0> = 0000). Os quatros pinos PORTB<3:0> devem ser definidas como
entradas (TRISB<3:0> = 1111).
O processo de identificação de qual tecla está sendo pressionada deve ser realizada por software, onde um
pino da PORTC é colocado em nível baixo e os demais pinos em nível alto. Assim, se uma tecla é
pressionada, um nível lógico zero é transmitido pela coluna onde a tecla está conectada, entrando pelo
correspondente pino da PORTB.
Para permitir o acesso ao teclado matricial, é necessário fechar as chaves CH3(1-4) e CH5(1-4).

4) Esquemático para acionamento dos Displays de 7 segmentos no módulo didático


O módulo didático PIC-2377 possui quatro displays de sete segmentos que têm o mesmo barramento de
dados ligados à porta D. Por vez, apenas um Display deve ser habilitado, de modo que para mostrar
informação em vários displays, deve-se utilizar o mecanismo de multiplexação. Os pinos: RE0, RE1, RE2
e RA5, do µC, são utilizados para habilitar, um por vez, cada um dos quatro Displays de 7 segmentos. Um
nível lógico zero, presente nesses pinos, irá energizar o display correspondente. Um nível zero, em cada
pino da PORTD irá acender um segmento do display energizado, pois o display é do tipo anodo comum.
Dessa forma, é possível varrer os quatro displays conectados na mesma a porta D. Na Figura 3 é mostrado
como os displays estão ligados no módulo didático, onde as chaves CH4(1-8) conecta os LEDs dos displays
à porta D e as chaves CH6(1-4) conecta as linhas de habilitação dos displays às portas A e E. Além disso
para habilitar o display de sete segmentos é necessário colocar o jumper J3 na posição B.
5V
10k RB3
RA5
RB2

PIC16F877A
RE2
RB1
RE1 RB0

RE0
UMIL CENT DEZE UNID 330 RC3
a a RD7
b RD6 RC2
f b c RD5
g d RD4 RC1
e RD3
e c f RC0
g RD2
d p RD1
RD0
DP-4 DP-3 DP-2 DP-1
Figura 3 - Circuito esquemático de conexões de PIC com os Displays de 7 segmentos.

5) Codificação de hexadecimal para 7 segmentos usando display anodo comum


Na Tabela seguinte se apresenta a codificação em 7 segmentos dos caracteres hexadecimais:
Digito Código em 7 segmentos Digito Código em 7 segmentos
hexadecimal abcd efg p hexadecimal abcd efg p
0 0 0 0 0 0 0 1 1 = 0x03 8 0 0 0 0 0 0 0 1 = 0x01
1 1 0 0 1 1 1 1 1 = 0x9F 9 0 0 0 0 1 0 0 1 = 0x09
2 0 0 1 0 0 1 0 1 = 0x25 A 0 0 0 1 0 0 0 1 = 0x11
3 0 0 0 0 1 1 0 1 = 0x0D B 1 1 0 0 0 0 0 1 = 0xC1
4 1 0 0 1 1 0 0 1 = 0x99 C 0 1 1 0 0 0 1 1 = 0x63
5 0 1 0 0 1 0 0 1 = 0x49 D 1 0 0 0 0 1 0 1 = 0x85
6 0 1 0 0 0 0 0 1 = 0x41 E 0 1 1 0 0 0 0 1 = 0x61
7 0 0 0 1 1 1 1 1 = 0x1F F 0 1 1 1 0 0 0 1 = 0x71
Para o ponto decimal, o código que corresponde é 0xFE.

6) Esquema para conectar o conversor UART-USB com o PIC do módulo didático

PIC
PICbootPlus
(RC7) Rx Tx
(RC6) Tx Rx
GND GND USB PC

7) Projeto 1: Acionamento de LEDs


O objetivo deste exemplo é conhecer os procedimentos para configurar as portas de E/S digitais do PIC e
acionar os LEDs conectados à PORTD. No Exemplo1, serão implementados dois tipos de operações
sequenciais: contador binário crescente (modo = 0) e deslocamento de bits à esquerda (modo = 1). Cada
um dos valores da sequência será mostrado, nos LEDs, durante 1seg.
Roteiro:
a) Procedimento para criar e ensamblar projeto 1
 Crie uma pasta para o projeto (sugestão: Lab-05_p1). Em seguida copie, nessa pasta, o arquivo fonte
de nome Lab-05_p1_LEDs.asm.
 Utilize o assistente para criar um projeto com o nome Ex1. Anexe o arquivo fonte do item anterior.
 Abrir o arquivo fonte:
list p=16f877a ; define o tipo de Microcontrolador usado
#include <p16f877a.inc> ; inclui arquivo com declarações típicas
__CONFIG H'2F02' ; define a palavra de configuração
;Atribuições de variáveis
cblock 0x20 ;
modo, contador1, contador2, contador3
endc
;Definição de endereço inicial do programa
org 0x00 ;
goto Inicio ; salta para o endereço indicado por Inicio
nop ; sem operação
nop ; 3 endereços reservados para o Bootloader
nop
;Corpo do programa
Inicio: bcf modo,0 ; zerar o bit 0 do registrador “modo” (modo<0> = 0)
movlw 0xFF ; mover o valor 0xFF para o Wreg (notação hexadecimal)
movwf PORTD ; mover o conteúdo de Wreg para PORTD, [0x08]  Wreg
bsf STATUS, RP0 ; STATUS<5>=1, seleciona o banco 1
clrf TRISD ; pinos da PORTD definidos como saídas
bcf STATUS, RP0 ; STATUS<5>=0, seleciona o banco 0
btfsc modo,0 ; se modo<0>=0 pula, ou seja PC=PC+1
goto deslocamento ; salta para o endereço indicado por deslocam, PC = deslocam
incremento:
decf PORTD,F ; decrementa em 1 o conteúdo de PORTD
call delay_1s ; executa uma sub-rotina de atraso que demora 1 seg.
goto incremento ; salta para o endereço indicado por incr
deslocamento:
bcf STATUS,C ; STATUS<0> = C =1, zera o bit de carry
call delay_1s ; executa uma sub-rotina de atraso que demora 1 seg.
rlf PORTD,F ; rotaciona à esquerda os bits de PORTD, inclusive o bit C
goto $-2 ; salta recuando 2 endereços
;Sub-rotina de atraso de tempo
delay_1s:
movlw D'250' ; Wreg = 250 (número atribuído em notação decimal)
movwf contador1 ; [contador1]  Wreg
movlw D'75' ; Wreg = 75
movwf contador2 ; [contador2]  Wreg
movlw D'21' ; Wreg = 21
movwf contador3 ; [contador3]  Wreg
decfsz contador1,1 ; decrementa em 1 o contador1; se Z=1 => PC=PC+1
goto $-1 ; recua para executar de novo a instrução anterior
decfsz contador2,1 ; decrementa em 1 o contador2; se Z=1 => PC=PC+1
goto $-3 ; salta recuando 3 endereços
decfsz contador3,1 ; decrementa em 1 o contador3; se Z=1 => PC=PC+1
goto $-5 ; salta recuando 5 endereços
return ; retorna da sub-rotina
END ; FIM DE PROGRAMA
 Faça a montagem do programa: Project > Build All ou <Ctrl> + <F10>.
b) Procedimento para simulação usando MPLAB-IDE + Proteus
 Habilitar a ferramenta no menu Debugger > Select Tool > Proteus VSM
 Na janela “Proteus VSM MPLAB viewer” abrir o circuito esquemático do módulo didático.
 Na janela de propriedades do µC, anexe o arquivo Lab-05_p1_LEDs.hex. Esse arquivo deve-se
encontrar na pasta do projeto.
 Inicie a simulação pulsando <F12> ou pulsando o botão da cor verde.
 Para executar a simulação, pulse <F9> ou use os controles da barra de ferramentas correspondente.
c) Procedimento para gravar o programa no PIC do módulo didático
 Conecte o módulo didático ao computador por meio de um conversor TTL-USB, em seguida, procure
saber, via o sistema operacional, a porta COM utilizada pelo conversor; para isso basta acessar ao
‘Gerenciador de dispositivos’.
 Todas as chaves CH2 e CH7 devem estar em OFF (abertas, para baixo)
 Execute o programa PICbootPlus, desde a área de trabalho. Na janela do programa, utilize o botão
“Buscar” para localizar o arquivo Lab-05_p1_LEDs.hex. Selecione a porta COM ocupado pelo
conversor UART-USB e defina o baud-rate para 9600. Então, clique no botão “Gravar” e na
sequência pulse o botão RESET do módulo didático.
d) Procedimento para testar o programa no módulo didático
 Ligue os jumpers e as chaves conforme indicado na Tabela 1, a seguir:
Dispositivos sob teste Jumper ON Chaves ON Jumper OFF Chaves OFF
LEDs J3 - A CH4(1 – 8) J4 As demais chaves
 Durante o teste, deve-se verificar que se modo<0> = 0, a aplicação implementará um contador
binário crescente.
e) Mudança no modo acionamento dos LEDs
 No programa fonte, mude a instrução de “bcf modo,0” para “bsf modo,0”.
 Faça a montagem do programa.
 Repita os procedimentos dos itens b), c) e d)
 Durante o teste, deve-se verificar que se modo<0> = 1, a aplicação implementará um rotacionamento
de bits à esquerda.

8) Projeto 2: Acionando displays de 7 segmentos


O objetivo é mostrar, nos displays de 7 segmentos, os códigos de teclas pressionadas. Assim, se uma ou
mais teclas de uma linha estiver pressionada, os displays DP4 até DP1 deverão mostrar respectivamente os
códigos correspondendo às teclas pressionadas. Em geral, a varredura das teclas deve ser feita através de
uma matriz 4x4, onde a PORTC é usada para habilitar, com nível baixo, a linha a ser varrida e através dos
pinos RB0 até RB3 da PORTB, é lida a condição das teclas.
No Exemplo2, pretende-se varrer apenas a linha 2 do teclado básico, que se encontra ligada ao pino RC2
da PORTC. Para cada tecla pressionada, será apresentada, nos displays, um dos caracteres que representam
as 4 teclas [1], [2], [3] ou [C]. Para isso, deve-se colocar, na PORTD, o código em 7 segmentos que
corresponde ao caractere a ser apresentado e acionar um bit para energizar e habilitar um display. Nota-se
que o sistema é não retentivo, portanto, a varredura é repetida constantemente, para manter visível o código
no display.
Um display de 7 segmentos irá ser energizado quando algum dos pinos RE0, RE1, RE2 ou RA5, for definido
com nível zero.
Roteiro:
a) Procedimento para criar e ensamblar projeto 2
 Crie uma pasta para o projeto (sugestão: Lab-05_p2). Em seguida copie, nessa pasta, o arquivo fonte
de nome Lab-05_p2_7seg_e_teclado.asm.
 Utilize o assistente para criar um projeto com o nome Ex2. Anexe o arquivo fonte do item anterior.
 Abrir o arquivo fonte:

list p=16f877a
#include <p16f877a.inc>
__CONFIG H'2F02'
cblock 0x20
contador1,contador2
endc
org 0x00
goto Inicio
org 0x04
Inicio: bsf PORTA,5
movlw 0xFF
movwf PORTB ; PORTB<3:0> = 1111
movwf PORTC ; linhas desbilitadas
movwf PORTD ; LEDs off
movwf PORTE ; Displays desabilitados
bsf STATUS,RP0 ; banco 1
bcf TRISA,5 ; RA5 como saída
movlw 0x0F
movwf TRISB ; PORTB<3:0> como entrada
clrf TRISC ; PORTC como saída
clrf TRISD ; PORTD como saída
clrf TRISE ; PORTE como saída
movlw 0x06
movwf ADCON1 ; PORTA e PORTE como E/S digitais
movlw 0xDF ; RA5 como saída
movwf TRISA
bcf STATUS,RP0 ; banco 0
loop: bcf PORTC,2 ; habilita linha 2: teclas [1],[2],[3],[C]
btfsc PORTB,0 ; [1] foi pressionada?
goto $+6 ; não, vai testar outra TECLA
movlw 0x9F ; código de 7 seg do digito 1
movwf PORTD
bcf PORTA,5 ; habilita display UMIL
call delay_3ms ; atraso 3ms
bsf PORTA,5 ; desabilita display UMIL
btfsc PORTB,1 ; [2] foi pressionada?
goto $+6 ; não, vai testar outra TECLA
movlw 0x25 ; código de 7 seg do digito 2
movwf PORTD
bcf PORTE,2 ; habilita display CENT
call delay_3ms
bsf PORTE,2 ; desabilita display CENT
btfsc PORTB,2 ; [3] foi pressionada?
goto $+6 ; não, vai testar outra TECLA
movlw 0x0D ; código de 7 seg do digito 3
movwf PORTD
bcf PORTE,1 ; habilita display DECE
call delay_3ms
bsf PORTE,1 ; desabilita display DECE
btfsc PORTB,3 ; [C] foi pressionada?
goto $+6 ; não, vai testar outra TECLA
movlw 0x63 ; código de 7 seg de letra C
movwf PORTD
bcf PORTE,0 ; habilita display UNI
call delay_3ms
bsf PORTE,0 ; desabilita display UNI
bsf PORTC,2 ; desabilita linhas
goto loop

delay_3ms:
movlw D'147'
movwf contador1
movlw D'16'
movwf contador2
decfsz contador1,F
goto $-1
decfsz contador2,1
goto $-3
return
END
 Faça a montagem do programa: Project > Build All ou <Ctrl> + <F10>.
b) Procedimento para simulação usando MPLAB-IDE + Proteus
 Habilitar a ferramenta no menu Debugger > Select Tool > Proteus VSM
 Na janela “Proteus VSM MPLAB viewer” abrir o circuito esquemático do módulo didático.
 Na janela de propriedades do µC, anexe o arquivo Lab-05_p2_7seg_e_teclado.hex. Esse arquivo
deve-se encontrar na pasta do projeto.
 Inicie a simulação pulsando <F12> ou pulsando o botão da cor verde.
 Para executar a simulação, pulse <F9> ou use os controles da barra de ferramentas correspondente.
c) Procedimento para gravar o programa no PIC do módulo didático
 Todas as chaves CH2 e CH7 devem estar em OFF (abertas, para baixo)
 Execute o programa PICbootPlus, desde a área de trabalho. Na janela do programa, localize o
arquivo Lab-05_p2_7seg_e_teclado.hex. Verifique que sejam selecionados a porta COM ocupado
pelo conversor UART-USB e o baud-rate = 9600. Então, clique no botão Write e na sequência pulse
o botão RESET do módulo didático.
d) Procedimento para testar o programa no módulo didático
 Ligue os jumpers e as chaves conforme indicado na Tabela 2, a seguir:
Dispositivos sob teste Jumper ON Chaves ON Jumper OFF Chaves OFF
Displays de 7seg J3 – B CH4(1-8), CH6(1-4) J4
As demais chaves
Teclado básico 4x4 CH3(3), CH5(1-4)
Para testar: enquanto uma tecla da linha 2 for pressionada (teclas [1], [2], [3] ou [C], ver Figura 2),
em um display de sete segmentos, será mostrado um caractere que representa a tecla pressionada.
Porém, se a tecla for solta, o display correspondente será apagado.

9) Avaliação do aprendizado
No dia do Laboratório 06, cada aluno deve apresentar funcionando no módulo didático PIC-2377, os
programas solução dos enunciados a seguir:
Exercício 1: escreva um programa em Assembly para mostrar, nos LEDs, uma contagem binaria crescente
ou decrescente. A contagem crescente será a contagem por default, porém enquanto a tecla [D] é
pressionada, o tipo de contagem deverá mudar decrescente.
Exercício 2: escreva um programa em Assembly para mostrar, nos LEDs, um rotacionamento de bits à
esquerda ou à direita. O rotacionamento à direita será escolhido por default, porém cada vez que a tecla [C]
for pulsada, o tipo de rotacionamento deverá mudar: à esquerda ou à direita.
Exercício 3: escreva um programa em Assembly a fim de mostrar, nos Displays, o caractere que
corresponde a qualquer tecla pressionada, conforme a distribuição de caracteres do teclado básico 4x4
ilustrado na Figura 2.

BOM TRABALHO!

Você também pode gostar