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.