GESTIONE ASCENSORE - EasyPic4 - 16F887

Si gestisca un ascensore a 3 piani. Per ogni piano gestire il pulsante di chiamata e il display a 7 segmenti che mostra il piano dove si trova l'ascensore. All'interno della cabina gestire una pulsantiera a 3 bottoni per chiamare il piano dove si vuole andare. Sempre all'interno della cabina un display a 7 segmenti deve mostrare il piano dove si trova l'ascensore. Quindi i 4 display a 7 segmenti (uno per ogni piano e quello all'interno della cabina) devono sempre mostrare lo stesso numero corrispondente al piano attivo.

Soluzione:
Sviluppiamo il progetto utilizzando la Development Board EasyPic4 con micro PIC16F887.

Iniziamo quindi ad associare i pulsanti di chiamata ai piani con i pin sulla porta C seguendo questo schema:

Porta al ... Pulsante di chiamata Display a 7 Segmenti
1° PIANO pin 0 porta C DIS1
2° PIANO pin 1 porta C DIS2
3° PIANO pin 2 porta C DIS3

Associamo i pulsanti di chiamata all'interno della cabina seguendo questo schema:

Chiamata
per il ...
Pulsante di chiamata Display a 7 Segmenti
1° PIANO pin 4 porta C DIS0
2° PIANO pin 5 porta C
3° PIANO pin 6 porta C

Le associazione porte/pulsanti/display indicate nelle precedenti tabelle possono essere riassunte graficamente nella figura sottostante

Il programma che verrā caricato sul PIC č il seguente

#define FALSE 0
#define TRUE 1
// 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};
unsigned char Scelta;
void main()
{
     // Dichiarazione variabili
     int PianoDoveSono=1;
     int PianoDoveVado;
     int i;
     TRISA=0x00;        // Setto la porta A come output
     TRISD=0x00;        // Setto la porta C come output
     TRISC=0b01110111;  // Setto la porta B come input
     // INIZIALIZZAZIONE DELLE PORTE
     PORTC=0;
     PORTA=0b00001111;
     PORTD=DISPLAY[PianoDoveSono];
     while (1)
     {
        // ------------------------------------
        // SCELTA DEL PIANO
        // ------------------------------------
        Scelta=PORTC;
        PianoDoveVado=0;
        if (Scelta & 0b01110111)
        {
          if (Scelta & 0b00010001)
             PianoDoveVado=1;
          else if (Scelta & 0b00100010)
             PianoDoveVado=2;
          else if (Scelta & 0b01000100)
             PianoDoveVado=3;
        }
        // ------------------------------------
        // SIMULO LA SALITA/DISCESA AL PIANO
        // ------------------------------------
        if ( (PianoDoveVado!=PianoDoveSono) && (PianoDoveVado!=0) )
        {
            if (PianoDoveSono<PianoDoveVado) // Salgo
               for (i=PianoDoveSono;i<=PianoDoveVado;i++)
               {
                   PORTD=DISPLAY[i];
                   Delay_ms(1000);
               }
            else if (PianoDoveSono>PianoDoveVado)
               for (i=PianoDoveSono;i>=PianoDoveVado;i--) // Scendo
               {
                   PORTD=DISPLAY[i];
                   Delay_ms(1000);
               }
            PianoDoveSono=PianoDoveVado;
        }
        else
           PORTD=DISPLAY[PianoDoveSono];
     }
}

Per disabilitare il Watchdog Timer possiamo modificare le impostazioni del progetto come indicato nella figura sottostante.