| |
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.
Vai al forum per discutere
di questo argomento. >> vai

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.
Vai al forum per discutere di questo
argomento. >> vai
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
|
|