CONTATORE CON UN 7SEGMENT DISPLAY

Costruire un prg che mostri su un display a 7 segmenti un numero progressivo da 0 a 9.

Iniziamo a configurare la Development Board EasyPic4 con micro PIC16F887.
Spostiamo gli interruttori dello dip switch SW2 in modo che vengano abilitati i led associati alla porta A e porta D (interruttori 1 e 4 posti ad ON)

La porta A viene utilizzata per selezionare quale display a 7 segmenti utilizzare. Se pongo a 1 il primo bit a destra della porta A (PORTA=0b00000001) verrà utilizzato il primo display a destra,  se invece pongo a 1 il secondo bit a destra della porta A (PORTA=0b00000010) verrà utilizzato il secondo display  e cosi via ... I segmenti del display sono collegati alla porta D secondo lo schema sottostante.

Spostiamo l'interuttore 8 su ON del dip switch SW2 in modo che venga abilitato il primo display a 7 segmenti a destra. Ecco il codice del nostro programma:

unsigned char num;
// array con la codifica per i DISPLAY a 7 segmenti
// ------------------------------------------------
//
//  Valore in  Segmenti  deci-     Valore in   Segmenti  deci-
//  display    .GFEDCBA  male      display     .GFEDCBA  male
//   ----------------------------    ----------------------------
//      0        00111111   63         5         01101101  109
//      1        00000110    6         6         01111101  125 
//      2        01011011   91         7         00000111    7
//      3        01001111   79         8         01111111  127
//      4        01100110  102         9         01101111  111
//
// ------------------------------------------------
unsigned char DISPLAY[10] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111};
void main()
{
     TRISA = 0; // tutti i bit della porta A sono di output
     TRISD = 0; // tutti i bit della porta D sono di output
     // Abilito il primo display
     PORTA = 0b00000001;
     num = 0;
     while (1)
     {
         PORTD=DISPLAY[num % 10];
         num=num+1;
         Delay_ms(1000);
     }
}

Attenzione affinchè il programma funzioni correttamente è necessario disabilitare durante la fase di caricamento del programma il Watchdog Timer. Quando il Watchdog Timer (abbreviato WDT) è abilitato un contatore viene posto a 0 ed incrementato di 1 ad ogni clock . Quando il contatore arriva al valore FF il PIC viene resettato, il nostro programma viene riavviato dall'inizio e il contatore riportato a zero. Quindi il WDT resetta periodicamente il PIC. L'unico modo per evitare questo riavvio è quello di resettare a 0 il WDT mediante un'opportuna istruzione all'interno del nostro programma.