Gestione di un display a 7 segmenti con un PIC

Un microcontrollore PIC si presta molto bene a controllare un display a 7 segmenti, visto che puo' fornire direttamente la corrente necessaria al suo funzionamento. Ad esempio si puo' utilizzare la PORTB di un PIC16F84 per accendere o spegnere selettivamente i LED del display per visualizzare numeri e alcune lettere o simboli. Configurando i pin della PORTB come uscite digitali mediante il registro TRISB, e' poi possibile impostare su ciascun pin il livello logico alto (circa 5 V) o il livello logico basso (circa 0 V). Ciascun LED andra' collegato al microcontrollore attraverso un resistore che limiti la corrente. Essa non deve superare il valore massimo ammesso, pena la distruzione dei LED, ma e' opportuno rinunciare alla massima luminosita', prevedendo una corrente inferiore. Un altro limite e' determinato dalla massima corrente che puo' erogare o assorbire la PORTB del microcontrollore scelto. Ciascun pin puo' erogare al massimo 20 mA o assorbire 25 mA, ma la PORTB complessivamente puo' erogare 100 mA o assorbire 150 mA. Da questi dati segue che per utilizzare un display con correnti prossime ai 20 mA e ottenere la massima luminosita', si dovra' sceglierne uno del tipo ad anodo comune.

I successivi esempi fanno riferimento ad un display a catodo comune con LED verdi, denominato TDSG3160.
I pin 3 e 8 vanno collegati a massa (catodo comune). Assumendo che la caduta di tensione su ciascun LED sia 2,4 V e che la corrente sia circa 10mA, il valore di resistenza necessariosiottienedalseguentecalcolo:R=(5-2,4)/0,01=260 ohm. Si potranno scegliere resistori da 270 o 330 ohm.
Si noti che la caduta di tensione su un LED dipende dal suo colore, percio' si deve rifare il calcolo se il display ha LED rossi o arancioni, anziche' verdi.

Nel data sheet del TDSG3160 e' riportata la funzione di ciascun pin.

Pin

Funzione

Pin

Funzione

1

LED g (anodo)

6

LED d.p. (anodo)

2

LED f (anodo)

7

LED c (anodo)

3

catodo comune

8

catodo comune

4

LED e (anodo)

9

LED b (anodo)

5

LED d (anodo)

10

LED a (anodo)

Questo display viene definito di tipo standard, ma altri (e sono molto comuni) non seguono questa convenzione e si deve controllare sul data sheet la funzione di ciascun pin, oppure eseguire un test manualmente.

La seguente tabella indica quali LED devono essere accesi e quali spenti per vedere su un display a 7 segmenti i numeri da 0 a 9 e ha validita' generale.

Cifra

LED accesi

LED spenti

0

a,b,c,d,e,f

g,d.p.

1

b,c

a,d,e,f,g,d.p.

2

a,b,g,e,d

c,f,d.p.

3

a,b,c,d,g

e,f,d.p.

4

b,c,f,g

a,d,e,d.p.

5

a,f,g,c,d

b,e,d.p.

6

a,f,e,d,c,g

b,d.p.

7

a,b,c

d,e,f,g,d.p.

8

a,b,c,d,e,f,g

d.p.

9

a,b,c,d,f,g

e,d.p.

A questo punto si deve assegnare ciasun LED del display ad un pin della PORTB del PIC16F84A. Come esempio si scelgano i seguenti collegamenti:

RB0->LED 'a'; RB1->LED 'b'; RB2->LED 'c'; RB3->LED 'd'

RB4->LED 'e'; RB5->LED 'f'; RB6->LED 'g'; RB7->LED 'd.p.'

Allora, per vedere il numero "2" la PORTB deve presentare questi valori logici: 01011011 (il primo bit a sinistra corrisponde a RB7 e l'ultimo a RB0). La notazione decimale pemette una scrittura piu' compatta, anche se non e' di immediata interpretazione: il codice corrispondente e' 91.

Ripetendo questo procedimento per tutte le dieci cifre si ottiene la codifica riportata nella seguente tabella.

Cifra

Codice binario (RB7.......RB0)

Codice esadecimale

Codice decimale

0

00111111

0x3F

63

1

00000110

0x06

6

2

01011011

0x5B

91

3

01001111

0x4F

79

4

01100110

0x66

102

5

01101101

0x6D

109

6

01111101

0x7D

125

7

00000111

0x07

7

8

01111111

0x7F

127

9

01101111

0x6F

111

E' comodo creare un vettore che contenga tutti i codici in formato decimale. Ad esempio, in linguaggio C si scrive:

unsigned char DISPLAY[10] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111};

Per visulizzare una cifra sul display bastera' l'assegnamento:

PORTB = DISPLAY[num]; // num e' la cifra da visualizzare

Il circuito presentato nella successiva figura e' un contatore che visualizza sul display i numeri da 0 a 9, incrementando il valore ogni secondo. Quando arriva a 9, riparte da 0. Il firmware per il microcontrollore e' stato scritto in linguaggio C e si basa su un ciclo infinito, all'interno del quale avviene l'incremento della variabile di conteggio. La funzione Delay_ms(int t) genera un ritardo di t millesecondi. In alternativa e' possibile usare gli interrupt.


//
//  PIC16F84A @ 4 Mhz
//
     

unsigned char num;     // numero da visualizzare

//array con la codifica per i display
unsigned char DISPLAY[10] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111};

void main(){
     TRISA=0;
     TRISB=0;
     num=0;
     for(;;){
           if(num==10)
                  num=0;
     PORTB=DISPLAY[num];
     num++;
     Delay_ms(1000);
     }
}

I resistori R0,...,R7 sono da 270 ohm e garantiscono una buona luminosita' dei LED. Il quarzo X1 e' da 4 MHz e i condensatori C1 e C2 sono da 22 pF. Il resistore R8 e' da 4700 ohm.

IMPORTANTE: la codifica delle cifre dipende dal tipo di display e dai collegamenti con il microcontrollore e va riscritta per configurazioni diverse. E' opportuno scegliere pirma i collegamenti, con valutazioni sul lay-out ottimale dei componenti, e poi scrivere la codifica.

Se si sceglie un display ad anodo comune il terminale comune (solitamente collegato ai pin 3 e 8) va collegato all'alimentazione positiva; di conseguenza un LED e' acceso se il corrispondente pin della PORTB si trova a 0 V, dualmente rispetto al display a catodo comune.

Valutare la sostituzione del PIC16F84A con un dispositivo piu' recente, ad esempio il PIC16F628A.


Data sheet

  • display a 7 segmenti verdi a catodo comune, TDSG3160
  • microcontrollori PIC di Microchip

 

Visita la sezione Multiplex dei display a 7 segmenti. >> vai 

 
 

 

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.