Programació en C del PIC 18F45K20

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Exemple RB - Rotació de LED bidireccional

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 = 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
#include <xc.h>					// Carrega el fitxer de funcions
#define Polsador PORTBbits.RB0			// Li assigna un nom a l'adreça del polsador
unsigned char Valor;  				// Variable de 8 bits sense signe (0 a 255)
bit NoPremut;					// Estat del polsador
bit 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
	TRISD = 0b00000000;     		// El port D és de sortida
	ANSELH = 0x00;             		// Les entrades AN8-12 són digitals (AN12 coincideix amb RB0)
	INTCON2bits.RBPU = 0;			// Habilita el control de resistències de pull-up al port B
	WPUBbits.WPUB0 = 1;			// Activa la resistència de pull-up a RB0
	TRISBbits.TRISB0 = 1;       		// RB0 és entrada
	while (1)				// Inici del bucle de programa
	{
		LATD = Valor;			// Copiem el valor al port (als LED)
		if (Adreta == 0)
			Valor = (Valor << 1)|(Valor >> 7);	// Desplacem els bits a l'esquerra
		if (Adreta == 1)
			Valor = (Valor >> 1)|(Valor << 7);	// Desplacem els bits a la dreta
		if (Polsador == 0 && Polsador != NoPremut)	// Si el polsador ha canviat d'estat i està premut
			Adreta = ~Adreta;	// Invertim el sentit de gir
		NoPremut = Polsador;		// Guardem el nou valor
		_delay(50000);			// Retard de 50000 cicles
	}
}

Ara no cal eliminar els rebots del polsador ja que mirarem el polsador en moments molt separats en el temps.

 

 

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