Manejo de bits en C

En ésto se incluye el LED que parpadea o varios LEDs que se encienden y se apagan con distintos tiempos. Todo depende de cómo se programe. Lo que voy a hacer va a ser escribir un programa y sus posibles variantes y explicarlo, así vamos a dar juego a todas las funciones que nos interesan. Como dije en la introducción vamos a seguir un orden preestablecido. Usaremos en ésta ocasión el micro más sencillo y que se usa para prácticas, el PIC16F84.

// Declaración de librerias, constantes y fuses

#include <16f84.h> //Hacemos saber que vamos a usar éste uC
#FUSES XT,NOWDT    //Utilizaremos un osc. de 4Mhz y sin el WD timer
#use delay(clock=4000000) //El tiempo de delay se hará según el osc. de 4Mhz

// Declaramos los bytes del puerto B y su estado(TRIS)

#byte portb=0x06
#byte trisb=getenv("SFR:TRISB")

//Declaramos los bits del puerto B que vamos a manejar uno a uno

#bit b0=0x06.0
#bit b1=0x06.1
//etc. si queremos más

// Pasamos a programar el principal //
// Ejemplo encendido y apagado de un pin
void main(){
  trisb=0x00; //Declaramos como salidas todo el puerto
  while(1){   //Ponemos el programa en bucle infinito
    b0=1; //encendemos el pin b0
    delay_ms(1000); //esperamos un segundo
    b0=0; //apagamos b0
    delay_ms(1000); //volvemos a esperar
  }  //Cerramos while
} //Cerramos main
// Con éste ejemplo podemos hacer parpadear una luz o controlar un
// motor por modulación de ancho de pulso si son tiempos pequeños

// Ahora vamos a hacer que parpadeen 2 pines a distinto tiempo
void main(){
  trisb=0x00;
  while(1){
    b0=1; b1=0;
    delay_ms(500);
    b0=0; b1=1;
    delay_ms(500);
  }
}
// Es muy sencillo gracias a las funciones por defecto en C

//Ahora os voy a enseñar a hacer que los pines roten, es decir que
// se enciendan y se apaguen cada vez uno de los 8, 
// sin tener que escribirlo todo a mano

int i,c; //Declaramos una variable de apoyo que será un byte y otra

void main(){
  trisb=0x00;
  portb=0x00;
  while(1){
    i=0b00000001;
    portb=i; //pasamos el byte i al puerto b encendiendo b0
    c=0; //Inicializamos c a 0
    while(c<7){  //mientras c no sea mayor que 7 vas a hacer...
      delay_ms(500);
      rotate_left(&i,1); //rotas el byte i a la izquierda
      portb=i; //y lo pasas a port b encendiendo el siguiente pin
      c++; //sumas uno a c
    }
    delay_ms(500);
  }
}

//Si la funcion rotate_left no os la compila es porque debe estar en
// la libreria <string.h> que se debe declarar al principio como
// #include <string.h>
//También podéis hacer que al final del puerto se de la vuelta y
// rote en el sentido contrario con rotate_right
//Pero éso os lo dejo a vosotros para que os calentéis la cabeza 

Y éste es el fin del programa, espero que os haya resultado interesante y hayáis aprendido un poco de él

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *