Corso di C per Pic (Parte III)
Proseguiamo il nostro corso con un nuovo programmino di esempio (Esempio3.c)
/* Solito commento
che si estende su piu' righe
perche' vi ricordo che termina con -> */
#include <pic.h>
#include "delay.c"
#define ATTESA 250
main()
{
TRISB=0;
while(1)
{
PORTB=255;
DelayMs(ATTESA);
PORTB=0;
DelayMs(ATTESA);
}
}
Rispetto al programma della lezione 2 cambiano solo poche cose, vediamo quali.
#define ATTESA 250
Compare un nuovo pragma di pre-compilazione: #define.
Questo pragma permette di associare ad un'etichetta un valore, nel nostro caso abbiamo associato all'etichetta ATTESA il valore 250, quindi nelle righe successive possiamo chiamare la funzione DelayMs passando ATTESA anziche' 250.
Vi ricordo che la sostituzione avviene a livello di pre-compilazione... quindi per il compilatore e' come se ci fosse scritto DelayMs(250).
Il primo vantaggio che deriva dall'uso delle define e' che si possono cambiare dei valori in tutto il programma con una sola modifica.
es.
se al posto di
#define ATTESA 250
scriviamo
#define ATTESA 100
tutte e due le righe con il ritardo cambieranno e se in un programma complesso e lungo avessimo usato piu' volte il ritardo avremmo in un solo colpo cambiato il valore.
esempi di define
#define BAUD 9600
#define AREA (lato * lato)
Attenzione: in questo secondo esempio non ho messo un valore fisso, ma una formula. Tuttavia non fatevi ingannare, il pre-compilatore sostituira' in tutto il programma l'etichetta AREA con la sequenza "(lato * lato)" senza effettuare alcun calcolo. Quindi scrivere:
PORTB = AREA;
equivale a
PORTB = (lato * lato);
Normalmente le etichette delle define vengono scritte tutte maiuscole, cosi' nel sorgente sono piu' evidenti.
Ma allora TRISB, PORTB ecc. sono delle define? Esatto... e vengono definite nei file di include.
Una define puo' contenere un'altra define ad esempio:
#define LATO 10
#define AREA (LATO * LATO)
se nel codice scrivo :
PORTB = AREA;
il pre-compilatore sostituira' con
PORTB = (10 * 10);
ESERCIZI
1) provare a variare l'esempio in modo che accenda tre sequenze di led con ritardi differenti partendo da un ritardo base.