1) O documento discute displays de 7 segmentos, incluindo como representar números e letras usando os 7 segmentos e a multiplexação de vários displays.
2) É apresentado o mapeamento hexadecimal para cada algarismo e como ligar/desligar os segmentos correspondentes.
3) É explicado como multiplexar temporalmente 4 displays usando linhas de controle individuais para cada display e alternando rapidamente entre eles.
1. Display de 7 segmentos
Prof.MSc.Rodrigo Maximiano Antunes de Almeida
Universidade Federal de Itajub´a
rodrigomax@unifei.edu.br
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 1 / 29
3. Programa¸c˜ao dos Perif´ericos
Acesso `as portas do microcontrolador
Porta Endere¸co dos dados Endere¸co de config. (TRIS)
PORTA 0xF80 0xF92
PORTB 0xF81 0xF93
PORTC 0xF82 0xF94
PORTD 0xF83 0xF95
PORTE 0xF84 0xF96
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 3 / 29
4. Programa¸c˜ao dos Perif´ericos
Acesso `as portas do microcontrolador
1// d e f i n e s para p o r t a s de entrada e s a´ı d a
2#d e f i n e PORTD (∗( v o l a t i l e near unsigned char ∗) 0xF83 )
3#d e f i n e TRISD (∗( v o l a t i l e near unsigned char ∗) 0xF95 )
4// i n i c i o do programa
5void main ( void ) interrupt 0
6{
7 // configurando todos os pinos como s a´ı d a s
8 TRISD = 0b00000000 ;
9 // l i g a apenas os quatro ´u l t i m o s l e d s
10 PORTD = 0b11110000 ;
11 //mant´em o sistema l i g a d o i n d e f i n i d a m e n t e
12 f o r ( ; ; ) ;
13}
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 4 / 29
5. Programa¸c˜ao dos Perif´ericos
Acesso `as portas do microcontrolador
1// b a s i c o . h
2// fun¸c˜oes de b i t
3#d e f i n e BitSet ( arg , b i t ) (( arg ) |= (1<< b i t ) )
4#d e f i n e B i t C l r ( arg , b i t ) (( arg ) &= ˜(1<< b i t ) )
5#d e f i n e B i t F l p ( arg , b i t ) (( arg ) ˆ= (1<< b i t ) )
6#d e f i n e BitTst ( arg , b i t ) (( arg ) & (1<< b i t ) )
7
8// d e f i n e s para r e g i s t r o s e s p e c i a i s
9#d e f i n e PORTA (∗( v o l a t i l e near unsigned char ∗) 0xF80 )
10#d e f i n e PORTB (∗( v o l a t i l e near unsigned char ∗) 0xF81 )
11#d e f i n e PORTC (∗( v o l a t i l e near unsigned char ∗) 0xF82 )
12#d e f i n e PORTD (∗( v o l a t i l e near unsigned char ∗) 0xF83 )
13#d e f i n e PORTE (∗( v o l a t i l e near unsigned char ∗) 0xF84 )
14
15#d e f i n e TRISA (∗( v o l a t i l e near unsigned char ∗) 0xF92 )
16#d e f i n e TRISB (∗( v o l a t i l e near unsigned char ∗) 0xF93 )
17#d e f i n e TRISC (∗( v o l a t i l e near unsigned char ∗) 0xF94 )
18#d e f i n e TRISD (∗( v o l a t i l e near unsigned char ∗) 0xF95 )
19#d e f i n e TRISE (∗( v o l a t i l e near unsigned char ∗) 0xF96 )
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 5 / 29
7. Programa¸c˜ao dos Perif´ericos
Configura¸c˜ao dos perif´ericos
Term. Descri¸c˜ao
Configurar
como
Fun¸c˜ao
4 RA2/AN2/VREF-/CVREF RA2 Display 2
7 RA5/AN4/SS/C2OUT RA5 Display 1
8 RE0/AN5/CK1SPP RE0 RS-LCD / Display 3
10 RE2/AN7/OESPP RE2 RW-LCD / Display 4
19 RD0/SPP0 RD0
Barramento de dados
para o LCD/7seg/Led
20 RD1/SPP1 RD1
21 RD2/SPP2 RD2
22 RD3/SPP3 RD3
27 RD4/SPP4 RD4
Barramento de dados
para o LCD / 7seg /
Led
28 RD5/SPP5/P1B RD5
29 RD6/SPP6/P1C RD6
30 RD7/SPP7/P1D RD7
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 7 / 29
8. Display de 7 segmentos
Display de 7 segmentos
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 8 / 29
9. Display de 7 segmentos
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 9 / 29
10. Display de 7 segmentos
Evolu¸c˜ao das v´alvulas nixie
Objetivo: reproduzir algarismos (n´umeros) ar´abicos
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Efeito colateral: reproduzir letras
mai´usculas: A, C, E, F, H, J, L, P, S, U, Z
min´usculas: a, b, c, d, h, i, n, o, r, t, u
Reprodu¸c˜ao de pequenas mensagens
Reprodu¸c˜ao de valores hexadecimal
digitos hex: A, b, C, d, E, F
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 10 / 29
11. Display de 7 segmentos
http://www.hobbyprojects.com/the diode/seven segment d
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 11 / 29
12. Display de 7 segmentos
A montagem dos algarismos ´e feita ligando ou desligando cada um
dos 7 segmentos.
Por exemplo o n´umero 2: ´e necess´ario ligar apenas os segmentos/leds
a, b, g, e, d.1
Para acender o led ´e necess´ario saber se o display ´e de catodo ou
anˆodo comum.
catodo comum: cada led ´e aceso com 0 volts
anˆodo comum: cada led ´e aceso com 5 volts
1
Imagine a estrutura gfedcba, onde cada bit ´e um segmento. O n´umero 2 ´e
representado por 0b1011011 ou 0x5B
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 12 / 29
14. Display de 7 segmentos
Aten¸c˜ao
Alguns displays possuem o ponto decimal embutido como no caso da
nossa placa. Para lig´a-lo ´e necess´ario setar o bit 7 (MSB) da vari´avel
PORTD, que est´a ligada diretamente ao display.
Cada segmento opera com um led que possue caracter´ısticas similares
aos leds discretos. Portanto cada um consome de 15 a 20 mA de
corrente. A liga¸c˜ao direta aos terminais do micro deve ser
acompanhada de um resistor de limita¸c˜ao de corrente.
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 14 / 29
15. Display de 7 segmentos
1void main ( void )
2{
3 // v e t o r que armazena a convers˜ao
4 // dos a l g a r i s m o s para o d i s p l a y 7 seg
5 const char conv [ ] = {0x3F , 0x06 , 0x5B , 0x4F ,
6 0x66 , 0x6D , 0x7D , 0x07 ,
7 0x7F , 0x6F , 0x77 , 0x7C ,
8 0x39 , 0x5E , 0x79 , 0x71 };
9 unsigned i n t var , time ;
10 TRISD = 0x00 ;
11 TRISA = 0x00 ;
12 PORTA = 0xFF ;
13 f o r ( var = 0; var < 16; var++)
14 {
15 // c ol o ca os c a r a c t e r e s em s eq uˆen cia na s a´ı d a
16 PORTD = conv [ var ] ;
17 // apenas para contar tempo
18 f o r ( time = 0; time < 65000; time++);
19 }
20}
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 15 / 29
16. Display de 7 segmentos
Multiplexa¸c˜ao de displays
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 16 / 29
17. Display de 7 segmentos
Multiplexa¸c˜ao dos displays
Multiplexar: Consiste em combinar diversos sinais num ´unico canal de
transmiss˜ao
Vantagens
Redu¸c˜ao de custos com cabeamento e tamanho de placa
Utiliza¸c˜ao de uma quantidade maior de dispositivos que sa´ıdas
dispon´ıveis
Desvantagens
Perda de tamanho de banda devido a efeitos de overhead
Discretiza¸c˜ao do tempo no acionamento dos dispositivos
Aumento da complexidade do sistema
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 17 / 29
18. Display de 7 segmentos
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 18 / 29
19. Display de 7 segmentos
Multiplexa¸c˜ao dos displays
Pelo esquema da liga¸c˜ao dos displays na placa de desenvolvimento
podemos notar que os segmentos semelhantes de cada um dos 4
displays est˜ao ligados a um mesmo terminal
Os displays podem ser ativados/desativados atrav´es das linhas de
comando que s˜ao operadas cada uma por um bit:
Disp1 - RA5
Disp2 - RA2
Disp3 - RE0
Disp4 - RE2
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 19 / 29
20. Display de 7 segmentos
Multiplexa¸c˜ao dos displays
N˜ao ´e poss´ıvel apresentar n´umeros diferentes de modo simultˆaneo
em cada um dos displays
A solu¸c˜ao ´e realizar uma multiplexa¸c˜ao temporal
´E ligado apenas um display de cada vez.
O tempo ligado deve ser suficiente para que as c´elulas oculares sejam
sensibilizadas (percep¸c˜ao retiniana)
A mudan¸ca deve ser r´apida o suficiente para evitar flicker
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 20 / 29
21. Display de 7 segmentos
Multiplexa¸c˜ao dos displays
Rotina para acionar displays de 7 segmentos multiplexados:
1 colocar no barramento de dados o valor a ser mostrado no display X
2 ligar o display X atrav´es da linha de comando
3 esperar um tempo adequado para evitar flicker
4 desligar o display
5 escolher o pr´oximo display (X+1)
6 voltar ao passo 1
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 21 / 29
22. Display de 7 segmentos
Cria¸c˜ao da biblioteca disp7seg
Fun¸c˜oes necess´arias para a cria¸c˜ao de uma biblioteca de acionamento de
um conjunto de displays de 7 segmentos multiplexados:
Inicializa¸c˜ao()
Configura os terminais de dados e de controle
MudaDigito()
Recebe um n´umero entre 0 e F e uma posi¸c˜ao
Armazena internamente os 4 n´umeros a serem exibidos
AtualizaDisplay() 2
Desliga o display atual, muda o n´umero e liga o pr´oximo display
2
N˜ao ´e recomendado que o tempo de exibi¸c˜ao seja feito dentro da fun¸c˜ao. Isto pode
atrapalhar em sistemas maiores, principalmente sistemas que possuem interrup¸c˜oes.
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 22 / 29
23. Display de 7 segmentos
Cria¸c˜ao da biblioteca disp7seg
Armazenamento de dados dentro de uma biblioteca
Usado sempre que for necess´ario passar valores entre fun¸c˜oes dentro
de um mesmo arquivo ou armazenar valores que n˜ao podem ser
perdidos ao longo da execu¸c˜ao do programa. Ex: o display que est´a
atualmente ligado
´E feito atrav´es de vari´aveis ”globais-locais”3
As vari´aveis devem possuir o atributo static
Usar sempre o menor tamanho poss´ıvel pois estas vari´aveis s˜ao
alocadas permanentemente, reduzindo a mem´oria RAM dispon´ıvel.
Devem ser inicializadas dentro da fun¸c˜ao principal da biblioteca
3
Global dentro do escopo da biblioteca, local pois n˜ao pode ser acessada fora do
arquivo
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 23 / 29
24. Display de 7 segmentos
Cria¸c˜ao da biblioteca disp7seg
1#i n c l u d e "disp7seg.h"
2// v e t o r para armazenar a convers˜ao do d i s p l a y
3 s t a t i c const char valor [ ] = {0x3F , 0x06 , 0x5B , 0x4F , 0x66 , 0x6D ,
4 0x7D , 0x07 , 0x7F , 0x6F , 0x77 , 0x7C , 0x39 , 0x5E , 0x79 , 0x71 };
5 s t a t i c char display ; // armazena qual ´e o d i s p l a y d i s p o n´ı v e l
6 s t a t i c char v0 , v1 , v2 , v3 ; // armazena o v a l o r a s e r enviado ao ←
d i s p l a y
7void MudaDigito ( char val , char pos ) {
8 i f ( pos == 0) {
9 v0 = val ;
10 }
11 i f ( pos == 1) {
12 v1 = val ;
13 }
14 i f ( pos == 2) {
15 v2 = val ;
16 }
17 i f ( pos == 3) {
18 v3 = val ;
19 }
20}
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 24 / 29
25. Display de 7 segmentos
Cria¸c˜ao da biblioteca disp7seg
1void InicializaDisplays ( void )
2{
3 // c o n f i g u r a ¸c˜a o dos pinos de c o n t r o l e
4 BitClr ( TRISA , 2 ) ;
5 BitClr ( TRISA , 5 ) ;
6 BitClr ( TRISE , 0 ) ;
7 BitClr ( TRISE , 2 ) ;
8 // i n i c i a l i z a ¸c ˜a o das v a r i ´a v e i s
9 v0 = 0;
10 v1 = 0;
11 v2 = 0;
12 v3 = 0;
13 disp = 0;
14 // apenas AN0 ´e a n a l ´o g i c o
15 ADCON1 = 0b00001110 ;
16 // Porta de dados
17 TRISD = 0b00000000 ;
18}
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 25 / 29
26. Display de 7 segmentos
Cria¸c˜ao da biblioteca disp7seg
1void AtualizaDisplay ( void ) {
2 PORTA = 0x00 ; // d e s l i g a todos os d i s p l a y s
3 PORTE = 0x00 ;
4 PORTD = 0x00 ; // d e s l i g a todos os l e d s
5 switch ( display ) { // l i g a apenas o d i s p l a y da vez
6 case 0:
7 PORTD = valor [ v0 ] ; BitSet ( PORTA , 5 ) ; display = 1;
8 break ;
9 case 1:
10 PORTD = valor [ v1 ] ; BitSet ( PORTA , 2 ) ; display = 2;
11 break ;
12 case 2:
13 PORTD = valor [ v2 ] ; BitSet ( PORTE , 0 ) ; display = 3;
14 break ;
15 case 3:
16 PORTD = valor [ v3 ] ; BitSet ( PORTE , 2 ) ; display = 0;
17 break ;
18 d e f a u l t :
19 display = 0;
20 break ;
21 }
22} ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 26 / 29
27. Display de 7 segmentos
Cria¸c˜ao da biblioteca disp7seg
Header4
1#i f n d e f DISP7SEG H
2 #define DISP7SEG_H
3 void MudaDigito ( char val , char pos ) ;
4 void AtualizaDisplay ( void ) ;
5 void InicializaDisplays ( void ) ;
6#e n d i f
4 ´E interessante notar que as vari´aveis foram declaradas apenas no arquivo .c,
portanto n˜ao s˜ao acess´ıveis fora do disp7seg.c. A ´unica maneira de mudar o valor delas
´e atrav´es da fun¸c˜ao MudaDigito() e AtualizaDisplay().
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 27 / 29
28. Display de 7 segmentos
Utiliza¸c˜ao da biblioteca disp7seg
Utiliza¸c˜ao da biblioteca
A fun¸c˜ao AtualizaDisplay() deve ser chamada em intervalos regulares
dentro do programa principal
Ela deve ser repetida indefinidamente at´e o termino da execu¸c˜ao do
programa
1// i n i c i o do programa
2void main ( void )
3{
4 // d e c l a r a ¸c˜a o de v a r i ´a v e i s
5 // execu¸c˜ao do c´odigo
6 //mudan¸ca dos v a l o r e s dos d i s p l a y s
7 f o r ( ; ; ) // loop i n f i n i t o
8 {
9 // a t u a l i z a ¸c ˜a o do d i s p l a y
10 }
11}
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 28 / 29
29. Display de 7 segmentos
Utiliza¸c˜ao da biblioteca disp7seg
1// programa exemplo de u t i l i z a ¸c ˜a o da b i b l i o t e c a d i s p 7 s e g
2#i n c l u d e "basico.h"
3#i n c l u d e "config.h"
4#i n c l u d e "disp7seg.h"
5
6// i n i c i o do programa
7void main ( void )
8{
9 unsigned i n t tempo ;
10 InicializaDisplays () ;
11 MudaDigito (0 ,0) ;
12 MudaDigito (1 ,1) ;
13 MudaDigito (2 ,2) ;
14 MudaDigito (3 ,3) ;
15 f o r ( ; ; )
16 {
17 AtualizaDisplay () ;
18 // gasta um tempo para e v i t a r o e f e i t o f l i c k e r
19 f o r ( tempo =0;tempo <1000; tempo++);
20 }
21}
ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 29 / 29