Você está na página 1de 12

Projeto 1

Letreiro com Display 7 segmentos.


Disciplina: EN2617 - Sistemas Microprocessados.

Discentes:
Fernando Henrique Gomes Zucatelli
Rafael Pires Franco Silva
Turma: A1/Diurno
Prof Dr. Carlos Eduardo Capovilla.

Santo Andr, 17 de Outubro 2012

1. INTRODUO
A utilizao de letreiros luminosos algo bastante comum, uma maneira barata
e simples a utilizao de microcontroladores para esta aplicao. Quando se utiliza
displays de 7 seguimentos necessitamos de sete (ou oito se considerando o ponto)
pinos de I/O de nosso microcontrolador para ligar um display.
Porm em um letreiro precisa se controlar mais que um, e dependendo do
microcontrolador no existe portas suficientes para vrios displays, uma soluo
simples e usar o recurso da varredura.

Na Figura 1, temos a demonstrao de como a varredura pode ser


implementada. Ligamos todas as linhas dos segmentos juntas. Assim quando
enviamos um valor para um display, estamos enviando para todos.

Figura 1 modelo de ligao de displays em varedura.

O que determinar qual display mostrar o valor o controle do anodo/catodo.


Ao inserir um valor na linha, estando todos os anodos (ou catodos) desligados,
nenhum display acende e no temos nenhum valor em nenhuma posio. Porm se
ligamos um dos displays atravs de seu anodo (ou catodo) o valor ser apresentado
por este display e na posio desejada.

Para mostrar outro valor, em outro ponto, basta trocar o valor da linha e ligar
apenas o display desejado. Podemos assim fazer uma varredura, usando mais de
um display e apenas uma linha de dados para sete segmentos. O ponto mais
importante a velocidade com que isso feito, pois devido persistncia retiniana
no percebemos que os valores esto sendo trocados e muito menos que a posio
dos mesmos variou. Vemos assim um valor com um nmero de dgitos, todos
mostrados ao mesmo tempo. Em mdia podemos usar tempos de 5 ms (0,005s) a
30 ms (0,03s), tempos mais que suficientes para enganar nossa viso.

O projeto consiste na criao e desenvolvimento de um letreiro que ficara no


fundo de um palco com 4 letras onde ser mostrando o nome da banda DEAD
HELL de diversas maneiras diferentes que sero escolhidas atravs de um boto.

2. LISTA DE MATERIAIS
2.1.

Fonte Alimentao

1x Transformador 110V para 15V

4x Diodos 1N4004

1x LM7805

1x LM7812

2.2.

1x microcontrolador 8051

2.3.

Microcontrolador

Cada DISPLAY

7x Rels R73-5D10-12 NTE ELECTRONICS


o Coil Voltage VDC Nom:12V
o Contact Current Max:10A
o Contact Voltage AC Nom:120V
o Coil Resistance:320ohm

7x TIP120

o Beta aprox. 1000

2x CIs 74AC126N

7x Resistor 220 1/4W

35x lmpadas 110V/ 100W


o Consumo lmpadas:
o (100/110)*5 = 4,55A para cada seguimento do display

Figura 2 Fonte de alimentao DC.

Figura 3 Circuito Driver de corrente para o Display.

Figura 4 Modelo do display a ser utilizado.

3. PROGRAMA ASSEMBLY
A verso final do Programa desenvolvido encontra-se abaixo.
O programa contm 5 sub-rotinas cuja seleo feita atravs da interrupo
INT0, acionada por boto, de forma que a melhor rotina pode ser exibida de acordo
com a situao da plateia.
As explicaes de cada sub-rotina esto descritas na seo Histrico do
prprio programa.

; Programa Projeto_1_Main_7
; Rotina principal do projeto 1.
; ele seleciona a subrotina a ser executa
;================================== Histrico ==========================
; Verso 1: Criado sistema de seleo de subrotina por interrupo
; Verso 2: Criada subrotina de Exibe_1 mostrando d E A d H E L L correndo ao longo
do display
; Verso 3: Criada subroina Exibe_2 que mostra d E A d e depois H E L L fixamente
no display
; Verso 4: reduzido nmero desnecessrio de Lcall delay_rapido
; Verso 5: criada a subrotina 3 alterando-se o valor de R5
;
as subrotinas Exibe_2 e Exibe_3 setam o valor de R5
;
que usado na subrotina Exibe_2_e_3
;
assim cria-se outra forma de exibio sem gastar muita memria
;
foi necessrio usar "div AB" e guardar o resultado na pos "20h" da memria
;
tambm h o uso da pos "21h" para guardar o valor de tempo ligado usado para
carregar R1 antes do delay_rapido
;
Ajustados tempos para Exibe_3 piscar freneticamente.
; Verso 6: Adicionadas as subrotinas Exibe_4 e Exibe_5
;
Exibe_4 (de fora para dentro)
;
d
d
;
dead
;
h
l
;
hell
;
Exibe_5 (de dentro para fora)
;
ea
;
dead
;
el
;
hell
; Verso 7: feitos pequenos ajustes no programa
;
retirada linhas de recuros de programao auxiliares at ento mantidas em
comentrio
;==============================
; Inicio do programa
org 0000h
Ljmp inicio
org 0003h
Ljmp Int_troca ; ativa atrves de P3.2
;org 000Bh
; ; TO
;org 0013h
; ; INT1barrado ativa atravs de P3.3
;org 001Bh
; ; T1
;org 0023h
; ; S0
;org 002Bh
; ; T2, apenas no 805
;==============================
org 0033h
inicio:
mov SP, #2Fh; Prepara o ponteiro da Pilha fora da regio de memria que pode dar
erro
; Configurando as Interrupes
mov IE,
#10000001b ; EA _ _ ES0 ET1 EX1 ET0 EX0
mov IP,
#00000000b ; __ _ _ PS P1 PX1 P0 P0 ;1 prioridade forada
mov TCON, #00000001b ; TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
;acionamento nivel baixo = 0; acionamento borda = 1
; Inicializando o registrador do tipo de exibio a ser feita
mov R7, #00h
;==============================
loop_main:

cjne R7, #00h, verifique_1


sjmp loop_main
verifique_1:
cjne R7, #01h, verifique_2
Lcall Exibe_1
verifique_2:
cjne R7, #02h, verifique_3
Lcall Exibe_2
verifique_3:
cjne R7, #03h, verifique_4
Lcall Exibe_3
verifique_4:
cjne R7, #04h, verifique_5
Lcall Exibe_4
verifique_5:
cjne R7, #05h, loop_main
Lcall Exibe_5
sjmp loop_main
;==============================
;subrotinas
roda_left_Reg4:
mov A, R4
rl A ;prepara o prximo visor a ser ligado
mov R4, A
RET
;==============================
;subrotinas de
Exibe_1:
mov P1,
mov R6,
mov R4,
08h

exibio do 7 segmentos
#01h ; valor de conferncia de funcionanmento
#00h ; aponta posio da tab_dead_hell 00h a 07h
#01h ; aponta visor a ser ligado da esq. para dir.: 01h, 02h, 04h,

mov DPTR, #0FFC0h; posio da memria onde est o Display 7 seg


mov A, #00h; limpa a tela do visor
movx @DPTR, A
loop_Exibe_1:
;prepara o display
mov A, R4; apontador de visor no acc
mov DPTR, #0FFC1h ; Seleciona o Display ligado
movx @DPTR, A
;Liga a posio do display
mov A, R6; R6 guarda a posio a ser exibida da tab_dead_hell
mov dptr, #tab_dead_hell; aponta para a tabela
movc A, @A+DPTR
mov DPTR, #0FFC0h; posio da memria onde est o Display 7 seg
movx @DPTR, A
mov R2, #3; 0,3 segundos
lcall delay_visao ; o delay_visao est em funo do R2 ajustado antes
de entrar nele
Lcall roda_left_Reg4
cjne R4, #10h, continua_Reg4; chegou no 5 DISPLAY dir. que no
existe
mov R4, #01h; retorno para a primeira posio do display
continua_Reg4:
inc R6; prepara a prxima posio da tab-dead a ser exibida
cjne R6, #08h, continua_Reg6
mov R6, #00; retorno para a primeira posio da tab_dead
sjmp saida_loop_Exibe_1
continua_Reg6:
sjmp loop_Exibe_1
saida_loop_Exibe_1:
RET

;---------------------------------------Exibe_2:
mov P1, #02h ; valor de conferncia de funcionanmento
mov R5, #240 ; default no programa separado era 200
mov A, R5
mov B, #2
div AB; fornece o resultado da diviso de R5/#2 e guarda em A
mov 20h, A; para o cjne R5, R5/2, "label"
; 20h a pos de memria onde vou guardar R5/2
; assim fao cjne A, 20h, "label"
; aponta qual tabela exibe >100 tab_dead e <100 tab_hell
; uso de djnz R5, "label" para sair
mov 21h, #10; fica sem piscar na linha; mov R1, #10; 5 ms
Lcall Exibe_2_e_3
RET
;---------------------------------------Exibe_3:
mov P1, #03h ; valor de conferncia de funcionanmento
mov R5, #80 ; interessante que seja multiplo de 8
mov A, R5
mov B, #2
div AB; fornece o resultado da diviso de R5/#2
mov 20h, A; para o cjne R5, R5/2, "label"
; aponta qual tabela exibe >20 tab_dead e <20 tab_hell
; uso de djnz R5, "label" para sair,
mov 21h, #20; fica piscando na linha; mov R1, #20; 10 ms
Lcall Exibe_2_e_3
RET
;---------------------------------------Exibe_2_e_3:
mov R6, #00h ; aponta posio da tab_dead 00h a 03h e tab_hell 00h a 03h
mov R4, #01h ; aponta visor a ser ligado da esq. para dir.: 08h, 04h, 02h,
01h
mov DPTR, #0FFC0h; posio da memria onde est o Display 7 seg
mov A, #00h; apontador de visor no acc
movx @DPTR, A
loop_Exibe_2_e_3:
mov A, R4; apontador de visor no acc
mov DPTR, #0FFC1h ; Seleciona o Display ligado
movx @DPTR, A
;seleo da tab a ser exibida
;>100 tab_dead e =<100 tab_hell
;cjne R5, R5/2, diferente; default no programa separada era
mov A, R5; s assim posso compara R5 com R5/2 (pos 20h)
cjne A, 20h, diferente
sjmp exibe_tab_hell; R5 = R5/2
diferente:
jc exibe_tab_hell; se < => C=1; se > => C=0
; R5 > R5/2
mov dptr, #tab_dead; aponta para a tabela
mov A, R6; R6 guarda a posio a ser exibida da tab_dead ou
movc A, @A+DPTR
mov DPTR, #0FFC0h; posio da memria onde est o Display 7
movx @DPTR, A
sjmp saida_tab
; R5 =< R5/2
exibe_tab_hell:
mov dptr, #tab_hell; aponta para a tabela
mov A, R6; R6 guarda a posio a ser exibida da tab_dead ou
movc A, @A+DPTR
mov DPTR, #0FFC0h; posio da memria onde est o Display 7
movx @DPTR, A

100

tab_hell
seg

tab_hell
seg

saida_tab:
mov R1, 21h ; 21h recebe #10 no Exibe_2 (no pisca) e #20 no Exibe_3
(pisca)
lcall delay_rapido

mov A, #00h
movx @DPTR, A; apaga o display
mov R1, #01; fica apagado por 500 microsegundos
lcall delay_rapido; tempo suficiente para no borrar o display
; Exibe o valor da posio de memria da tab_dead ou tab_hell apontado por R6
; no Display da posio apontada por R4
Lcall roda_left_Reg4
cjne R4, #10h, continua_Reg4_Exibe_2_e_3; chegou no 5 DISPLAY dir.
que no existe
mov R4, #01h; retorno para a primeira posio do display
continua_Reg4_Exibe_2_e_3:
inc R6; prepara a prxima posio da tab-dead a ser exibida
cjne R6, #04h, continua_Reg6_Exibe_2_e_3
mov R6, #00; retorno para a primeira posio da tab_dead
continua_Reg6_Exibe_2_e_3:
djnz R5, loop_Exibe_2_e_3
RET
;---------------------------------------Exibe_4:
mov P1, #04h
mov R6, #00h
tab_hell1 00h a 03h
mov R4, #01h
08h

;
;
e
;

valor de conferncia de funcionanmento


aponta posio da tab_dead1 00h a 03h, tab_dead 00h a 03h,
tab_hell 00h a 03h
aponta visor a ser ligado da esq. para dir.: 01h, 02h, 04h,

mov DPTR, #0FFC0h; posio da memria onde est o Display 7 seg


mov A, #00h; limpa a tela do visor
movx @DPTR, A
mov R5, #200
; aponta qual tabela exibe >50 tab_dead1, >100 tab_dead, >150 tab_hell1 e
<150 tab_hell
loop_Exibe_4:
mov A, R4; apontador de visor no acc
mov DPTR, #0FFC1h ; Seleciona o Display ligado
movx @DPTR, A
;Liga a posio do display
mov A, R6; R6 guarda a posio a ser exibida da tabela
;seleo da tab a ser exibida
cjne R5, #170, diferente1
sjmp exibe_tab_dead;
diferente1:
jc exibe_tab_dead; se < => C=1; se > => C=0
mov dptr, #tab_dead1; aponta para a tabela
movc A, @A+DPTR
mov DPTR, #0FFC0h; posio da memria do Display
movx @DPTR, A
sjmp saida_tabe
exibe_tab_dead:
cjne R5, #100, diferente2
sjmp exibe_tab_hell1
diferente2:
jc exibe_tab_hell1; se < => C=1; se > => C=0
mov dptr, #tab_dead; aponta para a tabela
movc A, @A+DPTR
mov DPTR, #0FFC0h; posio da memria do Display
movx @DPTR, A
sjmp saida_tabe
exibe_tab_hell1:
cjne R5, #70, diferente3
sjmp exibe_tab_hell2

diferente3:
jc exibe_tab_hell2; se < => C=1; se > => C=0
mov dptr, #tab_hell1; aponta para a tabela
movc A, @A+DPTR
mov DPTR, #0FFC0h; posio da memria do Display
movx @DPTR, A
sjmp saida_tabe
exibe_tab_hell2:
mov dptr, #tab_hell; aponta para a tabela
movc A, @A+DPTR
mov DPTR, #0FFC0h; posio da memria do Display
movx @DPTR, A
saida_tabe:
mov R1, #10 ; 5ms ;mov R1, #200; 100 ms
lcall delay_rapido
mov A, #00h
movx @DPTR, A; apaga o display
mov R1, #01; fica apagado por 500 microsegundos
lcall delay_rapido; tempo suficiente para no borrar o display
; Exibe o valor da posio de memria da tab_dead ou tab_hell apontado por R6
; no Display da posio apontada por R4
Lcall roda_left_Reg4
;mov A, R4
;rl A ;prepara o prximo visor a ser ligado
;mov R4, A
cjne R4, #10h, continua_Reg4_Exibe_4; chegou no 5 DISPLAY dir.
mov R4, #01h; retorno para a primeira posio do display
continua_Reg4_Exibe_4:
inc R6; prepara a prxima posio da tab-dead a ser exibida
cjne R6, #04h, continua_Reg6_Exibe_4
mov R6, #00; retorno para a primeira posio da tabela
continua_Reg6_Exibe_4:
djnz R5, loop_Exibe_4
sjmp saida_loop_Exibe_4
sjmp loop_Exibe_4
saida_loop_Exibe_4:
RET
;==============================
Exibe_5:
mov P1, #05h
mov R6, #00h
tab_hell1 00h a 03h
mov R4, #01h
08h

;
;
e
;

valor de conferncia de funcionanmento


aponta posio da tab_dead1 00h a 03h, tab_dead 00h a 03h,
tab_hell 00h a 03h
aponta visor a ser ligado da esq. para dir.: 01h, 02h, 04h,

mov DPTR, #0FFC0h; posio da memria onde est o Display 7 seg


mov A, #00h; limpa a tela do visor
movx @DPTR, A
mov R5, #200
; aponta qual tabela exibe >50 tab_dead1, >100 tab_dead, >150 tab_hell1 e
<150 tab_hell
loop_Exibe_5:
mov A, R4; apontador de visor no acc
mov DPTR, #0FFC1h ; Seleciona o Display ligado
movx @DPTR, A
;Liga a posio do display

10

mov A, R6; R6 guarda a posio a ser exibida da tabela


;seleo da tab a ser exibida
cjne R5, #170, diferente11
sjmp exibe_tab_dead3;
diferente11:
jc exibe_tab_dead3; se < => C=1; se > => C=0
mov dptr, #tab_dead2; aponta para a tabela
movc A, @A+DPTR
mov DPTR, #0FFC0h; posio da memria do Display
movx @DPTR, A
sjmp saida_tabel
exibe_tab_dead3:
cjne R5, #100, diferente21
sjmp exibe_tab_hell3
diferente21:
jc exibe_tab_hell3; se < => C=1; se > => C=0
mov dptr, #tab_dead; aponta para a tabela
movc A, @A+DPTR
mov DPTR, #0FFC0h; posio da memria do Display
movx @DPTR, A
sjmp saida_tabel
exibe_tab_hell3:
cjne R5, #70, diferente31
sjmp exibe_tab_hell4
diferente31:
jc exibe_tab_hell4; se < => C=1; se > => C=0
mov dptr, #tab_hell2; aponta para a tabela
movc A, @A+DPTR
mov DPTR, #0FFC0h; posio da memria do Display
movx @DPTR, A
sjmp saida_tabel
exibe_tab_hell4:
mov dptr, #tab_hell; aponta para a tabela
movc A, @A+DPTR
mov DPTR, #0FFC0h; posio da memria do Display
movx @DPTR, A
saida_tabel:
mov R1, #10 ; 5ms ;mov R1, #200; 100 ms
lcall delay_rapido
mov A, #00h
movx @DPTR, A; apaga o display
mov R1, #01; fica apagado por 500 microsegundos
lcall delay_rapido; tempo suficiente para no borrar o display
; Exibe o valor da posio de memria da tab_dead ou tab_hell apontado por R6
; no Display da posio apontada por R4
Lcall roda_left_Reg4
;mov A, R4
;rl A ;prepara o prximo visor a ser ligado
;mov R4, A
cjne R4, #10h, continua_Reg4_Exibe_5; chegou no 5 DISPLAY dir.
mov R4, #01h; retorno para a primeira posio do display
continua_Reg4_Exibe_5:
inc R6; prepara a prxima posio da tab-dead a ser exibida
cjne R6, #04h, continua_Reg6_Exibe_5
mov R6, #00; retorno para a primeira posio da tabela
continua_Reg6_Exibe_5:
djnz R5, loop_Exibe_5
sjmp saida_loop_Exibe_5
sjmp loop_Exibe_5

11

saida_loop_Exibe_5:
RET
;subrotinas de tempo
delay_visao:
;mov R2, #2; 0,2 segundo
loop2:
mov R1, #200; 100 ms
loop1:
mov R0, #250; 250 ciclo mquina
djnz R0, $; equivale 500 microsegundos
djnz R1, loop1; djnz leva 2 ciclo mquina
djnz R2, loop2
RET
delay_rapido:
;mov R1, #200; 100 ms
loop1_rapido:
mov R0, #250; 250 ciclo mquina
djnz R0, $; equivale 500 microsegundos
djnz R1, loop1_rapido; djnz leva 2 ciclo mquina
RET
;==============================
;Interrupes
Int_troca:
inc R7
cjne R7, #06, Int_troca_proximo
mov R7, #01h
Int_troca_proximo:
RETi
;tabelas
tab_led:
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h, 7fh, 67h, 77h, 7ch, 39h, 5Eh, 79h, 71h
;
0
1
2
3
4
5
6
7
8
9
A
b
C
d
E
F
tab_dead:
db 5Eh, 79h, 77h, 5Eh
;
d
E
A
d
tab_dead1:
db 5Eh, 00h, 00h, 5Eh
;
d
d
tab_dead2:
db 00h, 79h, 77h, 00h
;
E
A
tab_hell:
db 76h, 79h, 38h, 38h
;
H
E
L
L
tab_hell1:
db 76h, 00h, 00h, 38h
;
H
L
tab_hell2:
db 00h, 79h, 38h, 00h
;
E
L
tab_dead_hell:
db 5Eh, 79h, 77h, 5Eh, 76h, 79h, 38h, 38h
;
d
E
A
d
H
E
L
L
end

Você também pode gostar