En aquest exemple farem que cada cop que es premi el polsador els LED comencin a girar en sentit contrari al que ho feien fins al moment. Farem servir la variable Premut per recordar l'estat previ del polsador i la variable Adreta per recordar el sentit de gir actual. El programa serà el següent:
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include <xc.h> // Carrega el fitxer de funcions necessari per al compilador XC8 #define Polsador RA3 // Li assigna un nom a l'adreça del polsador #define flipbit(var, bit) ((var) ^= (1<<(bit)))
unsigned char Valor; // Variable de 8 bits sense signe (0 a 255) char NoPremut; // Estat del polsador char Adreta; // Sentit de gir
void main (void){
// Inicialització de variables
Adreta = 0; // Iniciem girant a l'esquerra
NoPremut = 1; // Suposem el polsador no premut
Valor = 1; // Inicialment posem 1 (activem LED 0)
// Configuració d'entrades i sortides
TRISC = 0b00000000; // Posa el port C com a sortida
TRISA = 0b00001000; // Posa RA3 com a entrada
while (1){ // Inici del bucle de programa
PORTC = Valor; // Copiem el valor al port (als LED)
if (Adreta == 0) {
Valor = (unsigned char) ((Valor << 1)|(Valor >> 7)); // Desplacem els bits a l'esquerra
if (Valor == 16) // Si ja estem al LED 5,
Valor = 1; // tornem al LED 0
}
if (Adreta == 1) {
Valor = (unsigned char) ((Valor >> 1)|(Valor << 7)); // Desplacem els bits a la dreta
if (Valor == 128) // Ja hem sortit fora,
Valor = 8; // tornem al LED 4
}
if (Polsador == 0 && Polsador != NoPremut) // Si el polsador ha canviat d'estat i està premut
flipbit(Adreta, 0); // Invertim el sentit de gir
NoPremut = Polsador; // Guardem el nou valor
_delay(200000); // Retard per permetre la visualització
}
}
Ara no cal eliminar els rebots del polsador ja que mirarem el polsador en moments molt separats en el temps.

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