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.
El programa que emprarem serà:
#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
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 (signed char 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 }
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.