Prévia do material em texto
Display de 7 segmentos Prof.MSc.Rodrigo Maximiano Antunes de Almeida Universidade Federal de Itajuba´ rodrigomax@unifei.edu.br ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 1 / 29 Programac¸a˜o dos Perife´ricos Revisa˜o ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 2 / 29 Programac¸a˜o dos Perife´ricos Acesso a`s portas do microcontrolador Porta Enderec¸o dos dados Enderec¸o 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 Programac¸a˜o dos Perife´ricos Acesso a`s portas do microcontrolador 1// d e f i n e s para p o r t a s de e n t r a d a e s a ı´ d a 2#d e f i n e PORTD (∗ ( v o l a t i l e n e a r uns igned char ∗) 0 xF83 ) 3#d e f i n e TRISD (∗ ( v o l a t i l e n e a r uns igned char ∗) 0 xF95 ) 4// i n i c i o do programa 5 v o i d main ( v o i d ) interrupt 0 6{ 7 // c o n f i g u r a n d o t o d o s os p i n o s como s a ı´ d a s 8 TRISD = 0b00000000 ; 9 // l i g a apenas os q u a t r o u´ l t i m o s l e d s 10 PORTD = 0b11110000 ; 11 //mante´m o s i s t e m a 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 Programac¸a˜o dos Perife´ricos Acesso a`s portas do microcontrolador 1// b a s i c o . h 2// f u n c¸ o˜ e s de b i t 3#d e f i n e B i t S e t ( arg , b i t ) ( ( a r g ) |= (1<< b i t ) ) 4#d e f i n e B i t C l r ( arg , b i t ) ( ( a r g ) &= ˜(1<< b i t ) ) 5#d e f i n e B i t F l p ( arg , b i t ) ( ( a r g ) ˆ= (1<< b i t ) ) 6#d e f i n e B i t T s t ( arg , b i t ) ( ( a r g ) & (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 n e a r uns igned char ∗) 0 xF80 ) 10#d e f i n e PORTB (∗ ( v o l a t i l e n e a r uns igned char ∗) 0 xF81 ) 11#d e f i n e PORTC (∗ ( v o l a t i l e n e a r uns igned char ∗) 0 xF82 ) 12#d e f i n e PORTD (∗ ( v o l a t i l e n e a r uns igned char ∗) 0 xF83 ) 13#d e f i n e PORTE (∗ ( v o l a t i l e n e a r uns igned char ∗) 0 xF84 ) 14 15#d e f i n e TRISA (∗ ( v o l a t i l e n e a r uns igned char ∗) 0 xF92 ) 16#d e f i n e TRISB (∗ ( v o l a t i l e n e a r uns igned char ∗) 0 xF93 ) 17#d e f i n e TRISC (∗ ( v o l a t i l e n e a r uns igned char ∗) 0 xF94 ) 18#d e f i n e TRISD (∗ ( v o l a t i l e n e a r uns igned char ∗) 0 xF95 ) 19#d e f i n e TRISE (∗ ( v o l a t i l e n e a r uns igned char ∗) 0 xF96 ) ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 5 / 29 Programac¸a˜o dos Perife´ricos Configurac¸a˜o dos perife´ricos ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 6 / 29 Programac¸a˜o dos Perife´ricos Configurac¸a˜o dos perife´ricos Term. Descric¸a˜o Configurar como Func¸a˜o 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 Display de 7 segmentos Display de 7 segmentos ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 8 / 29 Display de 7 segmentos ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 9 / 29 Display de 7 segmentos Evoluc¸a˜o das va´lvulas nixie Objetivo: reproduzir algarismos (nu´meros) ara´bicos 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Efeito colateral: reproduzir letras maiu´sculas: A, C, E, F, H, J, L, P, S, U, Z minu´sculas: a, b, c, d, h, i, n, o, r, t, u Reproduc¸a˜o de pequenas mensagens Reproduc¸a˜o de valores hexadecimal digitos hex: A, b, C, d, E, F ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 10 / 29 Display de 7 segmentos http://www.hobbyprojects.com/the diode/seven segment display.html ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 11 / 29 Display de 7 segmentos A montagem dos algarismos e´ feita ligando ou desligando cada um dos 7 segmentos. Por exemplo o nu´mero 2: e´ necessa´rio ligar apenas os segmentos/leds a, b, g, e, d.1 Para acender o led e´ necessa´rio saber se o display e´ de catodo ou anoˆdo comum. catodo comum: cada led e´ aceso com 0 volts anoˆdo comum: cada led e´ aceso com 5 volts 1Imagine a estrutura gfedcba, onde cada bit e´ um segmento. O nu´mero 2 e´ representado por 0b1011011 ou 0x5B ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 12 / 29 Display de 7 segmentos Display g f e d c b a Hex. (0gfedcba) 0 0 1 1 1 1 1 1 3F 1 0 0 0 0 1 1 0 06 2 1 0 1 1 0 1 1 5B 3 1 0 0 1 1 1 1 4F 4 1 1 0 0 1 1 0 66 5 1 1 0 1 1 0 1 6D 6 1 1 1 1 1 0 1 7D 7 0 0 0 0 1 1 1 07 8 1 1 1 1 1 1 1 7F 9 1 1 0 1 1 1 1 6F A 1 1 1 0 1 1 1 77 b 1 1 1 1 1 0 0 7C C 0 1 1 1 0 0 1 39 d 1 0 1 1 1 1 0 5E E 1 1 1 1 0 0 1 79 F 1 1 1 0 0 0 1 71 ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 13 / 29 Display de 7 segmentos Atenc¸a˜o Alguns displays possuem o ponto decimal embutido como no caso da nossa placa. Para liga´-lo e´ necessa´rio setar o bit 7 (MSB) da varia´vel PORTD, que esta´ 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 ligac¸a˜o direta aos terminais do micro deve ser acompanhada de um resistor de limitac¸a˜o de corrente. ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 14 / 29 Display de 7 segmentos 1 v o i d main ( v o i d ) 2{ 3 // v e t o r que armazena a c o n v e r s a˜ o 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 uns igned i n t var , time ; 10 TRISD = 0x00 ; 11 TRISA = 0x00 ; 12 PORTA = 0xFF ; 13 f o r ( var = 0 ; var < 1 6 ; var++) 14 { 15 // c o l o c a os c a r a c t e r e s em s e q u eˆ n c i a na s a ı´ d a 16 PORTD = conv [ var ] ; 17 // apenas para c o n t a r tempo 18 f o r ( time = 0 ; time < 65000 ; time++) ; 19 } 20} ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 15 / 29 Display de 7 segmentos Multiplexac¸a˜o de displays ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 16 / 29 Display de 7 segmentos Multiplexac¸a˜o dos displays Multiplexar: Consiste em combinar diversos sinais num u´nico canal de transmissa˜o Vantagens Reduc¸a˜o de custos com cabeamento e tamanho de placa Utilizac¸a˜o de uma quantidade maior de dispositivos que sa´ıdas dispon´ıveis Desvantagens Perda de tamanho de banda devido a efeitos de overhead Discretizac¸a˜o do tempo no acionamento dos dispositivos Aumento da complexidade do sistema ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 17 / 29 Display de 7 segmentos ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 18 / 29 Display de 7 segmentos Multiplexac¸a˜o dos displays Pelo esquema da ligac¸a˜o dos displays na placa de desenvolvimento podemos notar que os segmentos semelhantes de cada um dos 4 displays esta˜o ligados a um mesmo terminal Os displays podem ser ativados/desativados atrave´s das linhas de comando que sa˜o 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 Display de 7 segmentos Multiplexac¸a˜o dos displays Na˜o e´ poss´ıvel apresentar nu´meros diferentes de modo simultaˆneo em cada um dos displays A soluc¸a˜o e´ realizar uma multiplexac¸a˜o temporal E´ ligadoapenas um display de cada vez. O tempo ligado deve ser suficiente para que as ce´lulas oculares sejam sensibilizadas (percepc¸a˜o retiniana) A mudanc¸a deve ser ra´pida o suficiente para evitar flicker ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 20 / 29 Display de 7 segmentos Multiplexac¸a˜o 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 atrave´s da linha de comando 3 esperar um tempo adequado para evitar flicker 4 desligar o display 5 escolher o pro´ximo display (X+1) 6 voltar ao passo 1 ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 21 / 29 Display de 7 segmentos Criac¸a˜o da biblioteca disp7seg Func¸o˜es necessa´rias para a criac¸a˜o de uma biblioteca de acionamento de um conjunto de displays de 7 segmentos multiplexados: Inicializac¸a˜o() Configura os terminais de dados e de controle MudaDigito() Recebe um nu´mero entre 0 e F e uma posic¸a˜o Armazena internamente os 4 nu´meros a serem exibidos AtualizaDisplay() 2 Desliga o display atual, muda o nu´mero e liga o pro´ximo display 2Na˜o e´ recomendado que o tempo de exibic¸a˜o seja feito dentro da func¸a˜o. Isto pode atrapalhar em sistemas maiores, principalmente sistemas que possuem interrupc¸o˜es. ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 22 / 29 Display de 7 segmentos Criac¸a˜o da biblioteca disp7seg Armazenamento de dados dentro de uma biblioteca Usado sempre que for necessa´rio passar valores entre func¸o˜es dentro de um mesmo arquivo ou armazenar valores que na˜o podem ser perdidos ao longo da execuc¸a˜o do programa. Ex: o display que esta´ atualmente ligado E´ feito atrave´s de varia´veis ”globais-locais”3 As varia´veis devem possuir o atributo static Usar sempre o menor tamanho poss´ıvel pois estas varia´veis sa˜o alocadas permanentemente, reduzindo a memo´ria RAM dispon´ıvel. Devem ser inicializadas dentro da func¸a˜o principal da biblioteca 3Global dentro do escopo da biblioteca, local pois na˜o pode ser acessada fora do arquivo ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 23 / 29 Display de 7 segmentos Criac¸a˜o da biblioteca disp7seg 1#i n c l u d e "disp7seg.h" 2// v e t o r para armazenar a c o n v e r s a˜ o 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 q u a l 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 e n v i a d o ao ←↩ d i s p l a y 7 v o i d 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 Display de 7 segmentos Criac¸a˜o da biblioteca disp7seg 1 v o i d InicializaDisplays ( v o i d ) 2{ 3 // c o n f i g u r a c¸ a˜ o dos p i n o s 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 Display de 7 segmentos Criac¸a˜o da biblioteca disp7seg 1 v o i d AtualizaDisplay ( v o i d ) { 2 PORTA = 0x00 ; // d e s l i g a t o d o s os d i s p l a y s 3 PORTE = 0x00 ; 4 PORTD = 0x00 ; // d e s l i g a t o d o s os l e d s 5 s w i t c h ( 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 Display de 7 segmentos Criac¸a˜o da biblioteca disp7seg Header4 1#i f n d e f DISP7SEG H 2 #define DISP7SEG_H 3 v o i d MudaDigito ( char val , char pos ) ; 4 v o i d AtualizaDisplay ( v o i d ) ; 5 v o i d InicializaDisplays ( v o i d ) ; 6#e n d i f 4E´ interessante notar que as varia´veis foram declaradas apenas no arquivo .c, portanto na˜o sa˜o acess´ıveis fora do disp7seg.c. A u´nica maneira de mudar o valor delas e´ atrave´s da func¸a˜o MudaDigito() e AtualizaDisplay(). ELT024 Display de 7 segmentos rodrigomax@unifei.edu.br 27 / 29 Display de 7 segmentos Utilizac¸a˜o da biblioteca disp7seg Utilizac¸a˜o da biblioteca A func¸a˜o AtualizaDisplay() deve ser chamada em intervalos regulares dentro do programa principal Ela deve ser repetida indefinidamente ate´ o termino da execuc¸a˜o do programa 1// i n i c i o do programa 2 v o i d main ( v o i d ) 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¸ a˜o do c o´ d i g o 6 // mudanc¸a dos v a l o r e s dos d i s p l a y s 7 f o r ( ; ; ) // l o o p 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 Display de 7 segmentos Utilizac¸a˜o 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 7 v o i d main ( v o i d ) 8{ 9 uns igned 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 // g a s t a 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