Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Discentes:
Fernando Henrique Gomes Zucatelli
Rafael Pires Franco Silva
Turma: A1/Diurno
Prof Dr. Carlos Eduardo Capovilla.
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.
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.
2. LISTA DE MATERIAIS
2.1.
Fonte Alimentao
4x Diodos 1N4004
1x LM7805
1x LM7812
2.2.
1x microcontrolador 8051
2.3.
Microcontrolador
Cada DISPLAY
7x TIP120
2x CIs 74AC126N
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:
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,
;---------------------------------------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
;
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
;
10
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