Els noms de les variables poden estar formats per lletres, números i el signe _. Es distingeix entre majúscules i minúscules. El primer caràcter del nom d'una variable no pot ser un número. No podem fer servir les paraules reservades del C com a noms de variables.
Les variables s'han de declarar. Per declarar una variable s'escriu el seu tipus seguit del nom de la variable. Els tipus de variables s'indiquen amb una o més paraules que ens diuen la mida de la variable i com emmagatzema la informació. En alguns casos, per compatibilitat amb diverses versions de C, el mateix tipus pot tenir noms diferents. Les variables poden ser dels següents tipus:
| Tipus | Utilització | Valor mínim | Valor màxim | Bits |
| char | Enter sense signe | 0 | 255 | 8 |
| unsigned char | ||||
| signed char | Enter amb signe | -128 | 127 | |
| short | Enter amb signe | -32768 | 32767 | 16 |
| int | ||||
| signed short | ||||
| signed int | ||||
| unsigned short | Enter sense signe | 0 | 65535 | |
| unsigned int | ||||
| short long | Enter amb signe | -8 388 608 | 8 388 607 | 24 |
| signed short long | ||||
| unsigned short long | Enter sense signe | 0 | 16 777 215 | |
| long | Enter amb signe | -2 147 483 648 | 2 147 483 647 | 32 |
| long long | ||||
| signed long | ||||
| signed long long | ||||
| unsigned long | Enter sense signe | 0 | 4 294 967 295 | |
| unsigned long long | ||||
| float | Real | aprox. -1·1038 | aprox. 1·1038 | 24 |
| double | ||||
| long double |
A l'hora de guardar els valors de més de 8 bits a la memòria del microcontrolador, sempre es guarden de forma que a la primera posició de memòria hi ha els bits de menys pes.
En els tipus amb signe, els nombres negatius s'emmagatzemen en complement a dos. El complement a 2 d'un nombre binari s'obté complementant tots els bits i sumant 1 al resultat. Vegem un exemple amb el nombre -39 (decimal) expressat en 8 bits:
| Decimal | 0010 0111 | 39 | ||||
| Complementem | 1101 1000 | 216 | ||||
| Sumem 1 | 1101 1001 | 217 = 256 - 39 |
Si aquests 8 bits corresponguessin a valors sense signe podrien guardar valors de 0 a 255, per a 256 caldria ja un bit més. El número -39 es guarda amb signe de la mateixa manera que sense signe es guardaria 217 que és 256 (el següent al màxim) - 39.
Les variables reals són, en principi, de 24 bits però canviant la configuració del compilador poden ser de 32 bits. El rang de valors és el mateix amb 24 o amb 32 bits, la diferència és la precisió amb la que guarda els valors. Per triar-lo, picarem amb el botó dret sobre el nom del projecte i marcarem Properties. Se'ns obrirà una finestra nova on podrem triar-lo:

Les variables reals es guarden en un format de mantissa i exponent, és a dir un número multiplicat per una potència de 10. Això pot portar problemes en alguns casos. Per exemple, segons el contingut d'una variable quan li sumem 1 pot no canviar de valor. De la mateixa manera, en comparar números diferents però propers el microcontrolador es pot comportar com si fossin iguals.
Per fer una operació entre dues variables cal que aquestes siguin del mateix tipus. Si no ho són, la de tipus inferior serà convertida al tipus superior; llavors es farà l'operació. La taula anterior està ordenada de les de tipus inferior a les de tipus superior. També es canvia el tipus de variable quan el resultat de l'operació es guarda en una variable de tipus superior, però això es fa després d'operar. Per exemple:
int a, b;
long c = a * b;
En aquest cas, a i b són int i l'operació es fara en int. Després el resultat es convertirà a long i es guardarà a c. Però, si els valors d'a i b són grans, pot passar que el resultat no càpiga en un int i, per tant, el valor de c no sigui correcte (encara que si el resultat hagués estat long sí hi hauria cabut.
Podem demanar explícitament que el valor d'una variable sigui canviat de tipus abans de fer una operació o assignació. Això es fa posant el tipus desitjat, entre parèntesi, davant de la variable. Per exemple:
int a, b;
long c = (long) a * b;
Hauria de donar sempre el valor correcte ja que a es converteix a long abans d'operar amb b i això força a que el resultat sigui long.
La funció round dona la part entera d'un nombre real, però el resultat és un altre valor real. Si volem guardar-lo en una variable entera cal fer, a més, un canvi de tipus.
int Enter; float numReal;
Enter = (int)round(numReal);
Podem definir vectors o llistes posant entre els signes [ i ] el nombre d'elements. Cal tenir present que a l'hora de llegir un element concret la primera posició és la 0.
Podem fer sevir matrius indicant dos índexs on el primer serien les fileres i el segon les columnes. També hi pot haver més dimensions.
Alguns exemples de declaració de variables:
unsigned char LED; // Variable de 8 bits sense signe (0 a 255) char Sortida; char Llista[8]; // Tenim una llista amb 8 valors char fig[3][8]; // Tenim una matriu de tres fileres i vuit columnes long Valor; // Variable entera de 32 bits amb signe float Mida; // Variable real
A la definició podem posar contingut als vectors i matrius.
char fig[3][8] = { {0b00111100, 0b01111110, 0b11111111, 0b11111111,
0b11111111, 0b11111111, 0b01111110, 0b00111100},
{0b00000000, 0b00000000, 0b00000000, 0b01111110,
0b01111110, 0b00000000, 0b00000000, 0b00000000},
{0b00000000, 0b00000000, 0b00000000, 0b01111110,
0b01111110, 0b00000000, 0b00000000, 0b00000000} };
Els vectors i les matrius els podem fer servir així:
...
PORTC = Llista[LED]; // Busquem a la llista el valor que enviem al port
Sortida = fig1[i][j]; // On i va de 0 a 2 i j va de 0 a 7
...
Cal tenir present que En C no podem tractar les llistes completes (tampoc les fileres o columnes de les matrius). Haurem de treballar element per element fent servir bucles.
Les variables poden ser declarades amb especificacions. Segons les especificacions d'una variable, el compilador la guardarà de forma diferent. A continuació tenim una llista d'especificacions:
| Especificació | Significat |
| const | El valor es manté constant indefinidament Es pot guardar a la memòria de programa |
| persistent | La variable manté el valor quan es reinicia el microcontrolador |
| static | La variable només té sentit dins de la funció on es defineix L'espai de memòria pot ser usat per altres variables static en altres funcions |
Si, per exemple, la variable Llista és constant ens caldrà definir els valors i el compilador la pot guardar a la memòria de programa. Si volem, podem especificar l'adreça on l'ha de guardar emprant la indicació __at.
const char Llista[8] __at(0x180) = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
Les variables globals (les que definim abans de main) es guarden en la memòria de dades i són accessibles des de qualsevol posició del programa. També podem definir variables locals dins d'una funció; aquestes es crearan a la pila i desapareixeran quan el programa surti de la funció.
També podeu consultar el manual del MPLAB XC8 al web de Microchip.

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