El C és un llenguatge de nivell força alt, per tant quan programem no ens preocupem de l'estructura de la memòria ni de si el processador té més o menys instruccions. En el programa diem què volem que el microcontrolador faci i sera el compilador qui s'encarregui de traduir el programa a les instruccions del microcontrolador.
En aquest web tenim un resum breu de les opcions disponibles. Per a informació completa, podeu consultar qualsevol manual de llenguatge C; per exemple aquest.
Normalment també donem noms a les variables i el compilador decideix les adreces més adequades on guardar-les. Addicionalment, podem afegir comentaris per deixar clar què fa cada instrucció o tros de programa.
Els valors els introduïm en el format que ens vagi millor (binari, decimal, etc.). El compilador s'encarregarà de traduir mnemònics, adreces, variables i valors al codi màquina corresponent.
A continuació tenim un tros de programa en el que es comenten els principals elements:

Els comentaris es poden definir de dues maneres. Els comentaris s'una línia es poden posar després de dues barres //; s'entén que el comentari ha acabat quan saltem a la línia següent. En canvi, els comentaris que ocupen diverses línies comencen amb /* i acaben amb */. Cal vigilar amb això ja que si hi ha instruccions dins, aquestes no es faran.
A les variables del programa els podem donar el nom que vulguem mentre no sigui un dels noms reservats. Per exemple TRISD és un registre del microcontrolador i, per tant, no podem emprar aquest nom com a variable.
Per fer que el programa prengui decisions, fem servir les sentències; n'hi ha de repetició, condicionals, etc.
Les operacions s'indiquen amb un signe igual. Després de l'operació, la variable o el registre que hi ha a l'esquerra del signe igual passarà a contenir el resultat de l'operació que hi ha a la dreta del signe igual.
També podem emprar funcions, que són trossos de programa que estan definits a un altre lloc. Les funcions les podem definir nosaltres o agafar altres funcions que ja estan definides, com és el cas de la funció _delay().
El programa principal és el que es comença a executar quan posem en marxa el microcontrolador. El programa principal sempre s'anomena main, no dóna cap resultat en forma de variable (void) i no admet que li passem cap variable directament; per això té un void dins del parèntesi.
Hi ha alguns altres elements que també han d'estar en un programa complet. Anem a veure-ho a partir del programa següent.
#pragma config FOSC = INTIO67, FCMEN = OFF, IESO = OFF // CONFIG1H #pragma config PWRT = OFF, BOREN = SBORDIS, BORV = 30 // CONFIG2L #pragma config WDTEN = OFF, WDTPS = 32768 // CONFIG2H #pragma config MCLRE = OFF, LPT1OSC = OFF, PBADEN = ON, CCP2MX = PORTC // CONFIG3H #pragma config STVREN = ON, LVP = OFF, XINST = OFF // CONFIG4L #pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF // CONFIG5L #pragma config CPB = OFF, CPD = OFF // CONFIG5H #pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF // CONFIG6L #pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF // CONFIG6H #pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF // CONFIG7L #pragma config EBTRB = OFF // CONFIG7H #include "p18f45k20.h" // Carrega el fitxer d'adreces i paràmetres del PIC 18F45K20
unsigned char Valor; // Variable de 8 bits sense signe (0 a 255)
void main (void)
{
TRISD = 0b00000000; // El port D és de sortida
Valor = 1; // Inicialment posem 1 (activem LED 0)
while (1) // Bucle infinit
{
LATD = Valor; // Copiem el valor al port (als LED)
Valor = (Valor << 1) | (Valor >> 7); // Desplacem els bits
_delay(50000); // Retard per permetre la visualització
}
}
A la primera part (fons groc) fem la configuració general. Les primeres línia li diuen la configuració general del processador; són uns registres que només poden ser modificats en el moment de programar i que especifíquen la configuració que volem. En aquest cas hem posat la configuració bàsica, amb totes les funcions especials desactivades.
La darrera línia li diu al compilador que inclogui el fitxer de característiques del PIC 18F45K20. En aquest fitxer hi ha, per exemple, les adreces dels registres específics del processador; així quan nosaltres indiquem TRISD, el compilador sap quina adreça li correspon.
El segon bloc (fons blau) és la definició de les variables globals. En aquest cas només hi ha una variable (anomenada Valor) que és un nombre enter sense signe. Les variables globals (les que definim en aquesta posició) es guarden en la memòria de dades i són accessibles des de qualsevol posició del programa.
Al darrer bloc (fons vermell) hi ha el programa pròpiament dit. A la primera línia hi ha l'inici del programa principal. Com aquest té diverses línies cal delimitar-lo entre els signes { i }. A les línies següents assignem valors a un registre (en aquest cas un valor binari) i a una variable (en aquest cas un valor decimal).
Després hi ha una sentència de bucle que inclou diverses línies. Fixem-nos que les línies de dins el bucle estan una mica més a la dreta. Això no és necessari però ens ajuda a seguir el programa.

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.