Programació en C del PIC 16F690 amb PICkit 2

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

Exemple RD - Registre de desplaçament

Anem a provar el funcionament d'un registre de desplaçament. Agafarem l'entrada analògica on hi ha connectat el potenciòmetre i mostrarem els vuit bits de més pes sobre vuit LED connectats a un registre de desplaçament.

En el següent diagrama es mostra com s'ha connectat el registre per controlar vuit LED.

Connexió del registre

El programa que emprarem serà:

#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF, CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
#include "pic16f690.h"				// Carrega el fitxer d'adreces i paràmetres del PIC 16F690
#include <xc.h>					// Carrega el fitxer de funcions
char Sortida;					//Valors a enviar al registre de desplaçament
						// Definició de les funcions que farem servir 
void EnviaR8(char Valor);			// Envia un valor
void main (void) {
	TRISC = 0;				// Tot el port C és de sortida
	TRISB = 0;				// Tot el port B és de sortida
	TRISA = 0xFF;				// Tot el port A és d'entrada
	ADCON1 = 0b00010000;			// Posa el conversor a 1/8 de la freqüència
	ANSEL = 0b00000001;			// Configura AN0  com entrada analògica
	ANSELH = 0;				// Desactiva les altres entrades analògiques
	ADCON0 = 0b00000001;			// Activa el conversor A/D connectat a AN0
						// amb el resultat justificat per l'esquerra
	PORTB = 0;				// Inicialitza a 0 el port B
	while (1) {
		ADCON0bits.GO = 1;		// Posa en marxa el conversor
		while (ADCON0bits.GO == 1)	// Mentre no acabi
			;    			// ens esperem
		Sortida = ADRESH;		// Agafa els vuit bits superiors del valor llegit
		EnviaR8(Sortida);		// Ho envia al registre
		_delay(200000);	    		// Retard per permetre la visualització
	}
}
void EnviaR8(char Valor) {
	char Port = 0;				// Variable on guardem l'estat del port B
	char Temp;				// Variable temporal
	for (int k = 1; k < 9; k++){
		Temp = Valor & 0b10000000;	// Agafa el bit de més a l'esquerra
						// Temp només podrà valer 0 o 128
		if (Temp == 0) {		// Si val 0
			Port = Port & 0b11101111;		// Desactiva Data (bit 4)
		} else {			// Si val 128
			Port = Port | 0b00010000;		// Activa Data (bit 4)
		}
		Valor = Valor << 1;		// Rodem els bits per situar el següent
		PORTB = Port;			// Ho posa al port B
		Port = Port | 0b00100000;	// Activa Clock (bit 5) i força lectura
		PORTB = Port;			// Ho posa al port B
		Port = Port & 0b11011111;	// Desactiva Clock (bit 5)
		PORTB = Port;			// Ho posa al port B
	}
	Port = Port | 0b01000000;		// Activa Latch (bit 6) per copiar a les sortides
	PORTB = Port;				// Ho posa al port B
}

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.