Multiplex dei display a 7 segmenti

Il circuito rappresentato nella seguente figura usa la tecnica del multiplex con tre display a catodo comune per visualizzare numeri di tre cifre (da 0 a 999). Ciascun display resta acceso per un breve intervallo di tempo e se questo e' sufficientemente piccolo l'occhio umano non e' in grado di distinguere cambiamenti cosi' rapidi e percepisce che tutti i display sono accesi contemporanemente.

I pin corrispondenti dei tre display, eccetto il catodo comune (pin 3 e 8), sono collegati tra loro e alla PORTB, a modo di bus. Il catodo comune di ciascun display non e' collegato a massa, ma al collettore di un transistor bipolare che funziona da switch. Il controllo dei tre transistor e' affidato ad altrettanti pin della PORTA del PIC. Uno solo dei transistor deve essere attivo, iterativamente. Ad esempio, se al pin 2 del microcontrollore, che corrisponde al bit 3 della PORTA (RA3), e' presente il livello logico alto, allora il transistor T1 e' portato in conduzione. Contemporaneamente T1 e T2 devono essere spenti, cioe' i rispettivi segnali di controllo della PORTA devono essere a livello logico basso; inoltre la PORTB deve presentare il codice della cifra delle centinaia, che in questo esempio e' 1. Dopo qualche istante si attiva il transistor T2 e gli altri due sono interdetti; sulla PORTB deve presentarsi il codice della cifra delle decine, cioe' 4. Successivamente si attiva T3 e gli altri due sono interdetti; sulla PORTB deve presentarsi il codice della cifra delle unita', cioe' 8.

Visualizzazione del numero 148 con la tecnica del multiplex:

RA1

RA2

RA3

T1

T2

T3

Cifra

PORTB

"0"

"0"

"1"

on

off

off

centinaia (1)

00000110

"0"

"1"

"0"

off

on

off

decine (4)

01100110

"1"

"0"

"0"

off

off

on

unita' (8)

01111111

Codice in linguaggio C che realizza il multiplex dei tre display:

//  PIC16F84A @ 4 MHz (XT)
//  MCLR enabled, WDT disabled
//
//  compilatore:  MikroC 6.2
unsigned char uni, dec, cen;  // unita',decine,centinaia
unsigned int num;  // numero da visualizzare
unsigned int tmp;
//array con la codifica per i display:
unsigned char DISPLAY[10] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111};
        
void main(){
     TRISA=0b10001;
     TRISB= 0;
     num=0;
    
     // ciclo infinito
     for(;;){

         // QUI ELABORARE IL NUMERO DA VISUALIZZARE
         // CONTENUTO NELLA VARIABILE num

 
         // centinaia
         PORTB=0;
         PORTA.f1=0;
         PORTA.f2=0;
         PORTA.f3=1;
         cen=(num/100)%10;
         PORTB=DISPLAY[cen];
         for(tmp= 0;tmp<400; tmp++); // circa 5 ms
       
  // decine
  PORTB=0;
         PORTA.f1=0;
         PORTA.f3=0;
         PORTA.f2=1;
         dec=(num/10)%10;
         PORTB=DISPLAY[dec];
         for(tmp= 0;tmp<400; tmp++); // circa 5 ms
         // unita'
         PORTB=0;
         PORTA.f2=0;
         PORTA.f3=0;
         PORTA.f1=1;
         uni=num%10;
         PORTB=DISPLAY[uni];
         for(tmp=0; tmp<400; tmp++); // circa 5 ms
         }
}

Il programma si basa su un ciclo for infinito all'interno del quale vengono abilitati i segnali di controllo sulla PORTA e viene presentata la codifica delle cifre sulla PORTB. All'inizio del ciclo la variabile num, che contiene il numero da visualizzare, deve essere elaborata opportunamente: puo' essere incrementata o decrementata di una o piu' unita' e questo puo' avvenire in corrispondenza di eventi temporali o esterni (ad esempio si puo' aggiungere un pulsante o applicare un segnale esterno).

Ciascun display viene mantenuto acceso per 5 ms circa.

Per ottenere le tre cifre delle centinaia, delle decine e delle unita' si usa l'operatore "resto" della divisione per 10.

Per la codifica delle cifre vedere la sezione Gestione di un display a 7 segmenti con un PIC. >> vai


Lista dei componenti:

Componente

Valore o tipo

Componente

Valore o tipo

R0, ..., R7

220 ohm

D1, D2, D3

TDSG3160

R8

4700 ohm

T1, T2, T3

BC337

R9, R10, R11

1000 ohm

quarzo

4 MHz

C1, C2

22 pF

microcontrollore

-

Alcune considerazioni:

  • se i display sono a catodo comune si usano transistor di tipo npn, con l'emettitore a massa, attivati da un livello logico alto alla PORTA; con i display ad anodo comune si usano transistor di tipo pnp, con l'emettitore verso l'alimentazione positiva, attivati da un livello logico basso alla PORTA. Sono adatti i tipi BC337 e BC327 che sopportano ampiamente la corrente di otto LED. Vedi un esempio con display ad anodo comune. >> vai
  • se il punto decimale dei display non e' mai usato, come in questo circuito, una uscita della PORTB e' disponibile per altre funzioni. Inoltre e' possibile estendere la funzione di multiplex con un chip esterno, come il 74HC138 o il 74HC238: permettono di controllare fino a 8 display con solo tre segnali di controllo dalla PORTA. Nota: la corrente erogata/assorbita dalle uscite di questi integrati non e' sufficiente per pilotare direttamente un display e vanno aggiunti dei transistor su ciascuna uscita (con resistenza sulla base).
  • il calcolo delle resistenze va effettuato considerando il colore dei LED (la caduta di potenziale cambia se il display e' rosso, verde, ecc.) e la corrente desiderata; questa a sua volta dipende dall'intensita' luminosa che si vuole ottenere, dal numero dei display e dalla loro efficienza. Un limite e' imposto dalla capacita' del PIC di erogare/assorbire corrente per ciascun pin e complessivamente sulla PORTB (o altra).
  • valutare l'eventuale sostituzione del PIC16F84 con un altro dispositivo, ad esempio il PIC16F628A.  Il PIC16F88  dispone di convertitori A/D interni a 10 bit, con i quali e' possibile acquisire tensioni tra 0 e 5 V e visualizzarle con i display, dopo opportuna elaborazione. Si possono realizzare un voltmetro digitale, un termometro, ecc.
  • Valutare la possibilita' di usare un display a cristalli liquidi (LCD), che puo' visualizzare numeri e caratteri su piu' linee, lavora con basse correnti e richiede solo sei pin del microcontrollore.

 

Data sheet

 

 

 
 

Si declina ogni responsabilita' per errori ed inesattezze contenute in questa documentazione e per danni di qualsiasi natura derivanti dall'uso dei circuiti e dei programmi descritti. Nomi e marchi citati appartengono ai rispettivi proprietari.