Saltar al contenido

Secuencia de Leds con PIC (Instrucciones de Rotación)

Hola Controleros y Controleras, en esta entrada vamos a aprender paso a paso como hacer una secuencia de Leds con PIC utilizando el compilador CCS C. En esta entrada veremos un código de implementación de ejemplo, acompañado de su video en YouTube. Dicho código se encuentra al final de esta pagina y lo puedes descargar totalmente GRATIS.

Antes de empezar, te invito a que le des un vistazo a nuestro 👉 CURSO GRATUITO DE MICROCONTROLADORES PIC 👈 donde aprenderás a programar diferentes perifericos de este dispositivo.

También te puedes suscribir al canal de YouTube si deseas aprender más sobre microcontroladores PIC.

Secuencia de Luces con PIC

En C existen dos instrucciones de Rotación, una a la izquierda y otra a la derecha, que nos pueden servir para hacer una Secuencia de leds con PIC o secuencia de luces con PIC

>> 1: Rotación a la derecha, la cantidad de rotaciones es especificada por él número que tiene enseguida.

<< 1: Rotación a la izquierda, la cantidad de rotaciones es especificada por el número que tiene enseguida.
Al rotar el registro el bit es ocupado con un cero.

PORTB = PORTB<<1; //Rota el puerto B a la izquierda una vez
PORTB = PORTB>>1; //Rota el puerto B a la derecha una vez
Rotación de Leds

Con estas instrucciones podemos obtener el efecto de la secuencia de leds usando un PIC igual a la del Auto Fantástico. También puede ser usada para hacer proyectos de luces, luces rítmicas con LED usando PIC.

Algunas Tiras de LEDS de varios colores (RGB) pueden ser encontrados en Amazon las cuales pueden ser controladas directamente con nuestro celular:

Secuencia de Leds con PIC 16F877A – 16F887 – 18F4550

Encender uno a uno los bits del puerto B (0.5seg) desde RB0 hasta RB7 y luego encenderlos en sentido contrario desde RB7 hasta RB0.

Secuencia de Leds con PIC
Secuencia de Leds con PIC

Explicación del código y sumulación

El código de implementación de las luces ritmicas con LED usando microcontrolador PIC, puede ser implementado en cualquier microcontrolador, en este ejemplo se usa el PIC16F887, pero puedes usar cualquiera, por ejemplo usar el 16F877A (desactivando el NOWDT de los fuses y colocando el pin 1 a +5V), o por ejemplo el 18F4550 colocando en el encabezado:

#include <18f4550.h>
#byte porta = 0xf80 // Identificador para el puerto A. 
#byte portb = 0xf81 // Identificador para el puerto B. 
#byte portc = 0xf82 // Identificador para el puerto C. 
#byte portd = 0xf83 // Identificador para el puerto D. 
#byte porte = 0xf84 // Identificador para el puerto E.

Ademas de poder hacer secuencia de luces y de leds con PIC, estas instrucciones de rotación van a servir para hacer otro tipo de programas y de secuencias lógicas que podamos usar, especialmente cuando empecemos a realizar logicas binarias.

Implementación práctica del Código de Luces Rítmicas de LEDs

El siguiente video, muestra la implementación del circuito de la secuencia de leds o de las luces rítmicas de leds con microcontrolador PIC, mira como quedó el secuenciador de luces programables y desarrolla tu propio proyecto de luces.

A continuación te dejo el código de implementación de la secuencia de luces con PIC para que la descargues e implementes en tu propio computador, para acceder al código solo basta compartir el contenido de esta entrada con alguno de los tres botones abajo.

#INCLUDE<16F887.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP

#BYTE PORTB=6
MAIN()
{
   SET_TRIS_B(0B00000000);          //Configura el Puerto B Como salidas
   PORTB=0;                         //Comienza con todos los Leds Apagados
   WHILE(TRUE)                      //Haga por siempre ....
   {
      PORTB=0B00000001;             //Prendo unicamente el led de RB0
      DELAY_MS(500);                //Retardo de 500 milisegundos
      WHILE (!BIT_TEST(PORTB,7))    //Haga mientras el LED RB7 se encuentre apagado
      {
         PORTB=PORTB<<1;            //Rote hacia la izquierda una unidad
         DELAY_MS(500);             //Retardo de 500 milisegundos
      }
      DELAY_MS(500);                //Retardo de 500 milisegundos
      WHILE (!BIT_TEST(PORTB,0))    //Haga mientras el LED RB0 se encuentre apagado
      {
         PORTB=PORTB>>1;            //Rote hacia la derecha una unidad
         DELAY_MS(500);             //Retardo de 500 milisegundos
      }
   }
}

El siguiente código muestra la lógica inversa, donde todos los leds están encendidos y unicamente un led está apagado, y la rotación se hace con el led apagado. Para eso, nos vamos a valer de la operación complemento (~) y una variable auxiliar (AUX). La función complemento lo que hace es complementar cada bit de la variable auxiliar, es decir si el bit es 1 lo convierte en 0 y viceversa.

#INCLUDE<16F887.h>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP

#BYTE PORTB=6
int AUX;
MAIN()
{
   SET_TRIS_B(0B00000000);          //Configura el Puerto B Como salidas
   PORTB=0;                         //Comienza con todos los Leds Apagados
   WHILE(TRUE)                      //Haga por siempre ....
   {
      PORTB=0B11111110;             //Prendo unicamente el led de RB0
      AUX=0B00000001; 
      DELAY_MS(500);                //Retardo de 500 milisegundos
      WHILE (BIT_TEST(PORTB,7))    //Haga mientras el LED RB7 se encuentre encendido
      {
         AUX=AUX<<1;                 //Rote hacia la izquierda una unidad
         PORTB=~(AUX);             //Complementar la variable AUX
         DELAY_MS(500);             //Retardo de 500 milisegundos
      }
      DELAY_MS(500);                //Retardo de 500 milisegundos
      WHILE (BIT_TEST(PORTB,0))    //Haga mientras el LED RB0 se encuentre encendido
      {
          AUX=AUX>>1;                 //Rote hacia la izquierda una unidad
         PORTB=~(AUX);             //Complementar la variable AUX
         DELAY_MS(500);             //Retardo de 500 milisegundos
      }
   }
}

Suscríbete a este sitio WEB para estar enterado de las nuevas entradas!

Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:

👉 Invitar a Sergio a un Café ☕️

Que esten muy bien, nos vemos en la siguiente entrada.

Entradas relacionadas

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Comentarios (16)

Hola buenas…. Debo realizar un programa con el pic16f877.
Tengo que conectar un LCD y un teclado 4×4, la función que debe realizar el la secuencia 3 gatos hidráulicos … En la LCD me debe mostrar la secuencia y con el teclado seleccióno que secuencia quiero activar.

Gracias espero encontrar ayudas.

Responder

Buen día una pregunta como sería el arreglo del programa si quisiera agregarle un Dip-Switch y que solo inicie la secuencia de leds si lo presionó

Responder

Hola Josué, debes crear un condicional usando por ejemplo: IF(BIT_TEST(PORTA,0)), cuando la condición se cumpla puedes comenzar la secuencia. Dale un vistazo a la primera entrada donde se explica este comando: https://controlautomaticoeducacion.com/microcontroladores-pic/programar-pic/

Responder

Gracias por compartir valiosa información, el curso muy bien explicado. Mi objetivo es llegar hacer con micro procesador Pic y CCS, transmisión de radio frecuencia con el modulo Lora SX1278 A 1 km de distancia.

Responder

puedes ayudarme realizar una interfaz desde matalb para poder controlar leds

Responder

Josmar aquí en el sitio web ya hicimos algo parecido que puede servirte como base, usando Matlab y el PIC para controlar leds, dale un vistazo. Click aquí.

Responder

Hola, muy buena explicacion, creen que podrian hacer uno como este pero donde el LED en vez de encender se apage, me serviria mucho, gracias.

Responder

disculpen pero quiero saber como hacer un programa para que 8 leds tengan efecto de desplazamiento a derecha y efecto ping pong
a través del pic 16F88 sin usar las entradas especiales y osciladores

Responder

Las instrucciones de rotación vistas aquí también sirven para el pic16f88 es solo cambiar el encabezado por tu pic #include<16f88.h>

Responder

Saludos, por mas que lo intento, no funciona en proteus y no se cual es el error. saludos desde México.

Responder

Hola Jaggen. Lo has hecho igual que en el video? Que error te sale?

Responder

Gracias por responder Sergio C.
He copiado y pegado el código, pero en proteus solo enciende y se apaga el bit 0 de puerto b, despues de eso no hace mas, tal vez es la configuración de CCS o la versión de proteus

Responder

Saludos Sergio, solucione mi error, fue por usar una barra de leds en proteus, por alguna razón genera algún error, lo mas extraño es que si uso assembler funciona, ahora ya arme el circuito con leds independientes y todo perfecto.
Gracias!

Responder

Perfecto Jaggen que bueno que se haya solucionado el problema. Éxitos

Responder

exelente

Responder

Muy instructivo muchas gracias por la información atte. Pablo Quintana desde La Paz – Bolivia

Responder