# Secuencias de encendido de leds



## mario morales (Mar 12, 2011)

Que tal queridos amigos!!!

me estoy inciando en lo que a pic se refiere, he empezado desde abajito, encendiendo un led, el preoyecto "hola mundo", encender y apagar un led con pulsador etc.. Pero en estos momentos estoy estancado con una secuencia de encendidos de led y no puedo hacer que la secuencia se mantenga encendida despues de haber presionado un pulsador.
La secuencia inicia pero se apaga al terminar (la secuencia), y yo necesito que se quede encendida como si yo estuviera presionando el boton.

Les pido de favor si me pueden ayudar en esto. ya que estoy iniciando desde cero y me gustaria aprender un poco mas de esto!!!

el codigo que tengo es el siguiente y esta hecho con pic c :

#include <16f84A.h>
#use delay (clock=4000000)
#define puerto_b
#define puerto_a


void main()
{

set_tris_b(0x00);

while (true)
{ 
output_b(0x00);
    if (input(pin_a0)==1)   
   {output_high(pin_a2);
   delay_ms(500);
   output_low(pin_a2);
   delay_ms(50);
   output_b(0b00000001);
   delay_ms(500);
   output_b(0b00000010);
   delay_ms(500);
   output_b(0b00000100);
   delay_ms(500);
   output_b(0b00001000);
   delay_ms(500);
   output_b(0b00010000);
   delay_ms(500);
   output_b(0b00100000);
   delay_ms(500);

}
}
}

de paso si encuentran algun error en el codigo me avisan y asi aprendo un poco.


gracias!!!!!


----------



## Rigeliano (Mar 13, 2011)

Que es lo quieres que siga haciendo la secuencia indefinidamente después de presionar el botón?
Si es eso lo que quieres  ponle otro while después de la entrada del pin_a0 de esta forma cuando preciones el botón ara la secuencia indefinidamente.
algo asi:


while (true)
{ 
	output_b(0x00);
	if (input(pin_a0)==1) 
	{
		While(true)
		{
		output_high(pin_a2);
		delay_ms(500);
		output_low(pin_a2);
		delay_ms(50);
		output_b(0b00000001);
		delay_ms(500);
		output_b(0b00000010);
		delay_ms(500);
		output_b(0b00000100);
		delay_ms(500);
		output_b(0b00001000);
		delay_ms(500);
		output_b(0b00010000);
		delay_ms(500);
		output_b(0b00100000);
		delay_ms(500);
		}

	}
}
pero ten en cuenta que después de precionar el botón ya no terminara la secuencia hasta apagar la alimentación.


----------



## mario morales (Mar 13, 2011)

Excelente!!!!

eso necesitaba gracias!!!!


----------



## guillermovasben1 (May 13, 2012)

Saludos tengo un problema con la programación del pic16f877a ya escribi un programa que hace lo que necesito, encender unos leds en secuencias,(soy nuevo programando) pero aun no logro establecer el tiempo de espera de un segundo ya coloque dos subrutinas seguidas cargadas con .255d en un registro de propósito general pero aun así el tiempo es demasiado corto. si alguien pudiera indicarme como hacerlo se lo agradeceria.


----------



## VEGATRONICA (May 14, 2012)

Hlo guillermo que lenguaje estas usando??? y podrias poner el codigo que utilizas saludos


----------



## guillermovasben1 (May 15, 2012)

Hola soma el lenguaje que utilizo es assembler y el código es el siguiente


```
LIST P=16F877a
 #INCLUDE <P16F877A.INC>

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF
TESP     EQU 20h

 ORG 0X0000


 BCF     STATUS,RP0
 BCF     STATUS,RP0 ;ACCEDE AL BANCO 0
 CLRF    PORTA      ;INICIALIZA EL
                    ;PUERTO1


 


 BSF     STATUS,RP0 ;ACCEDE AL BANCO 1
 MOVLW   0X06      ;ESCRIBE UN 6 EN W
 MOVWF   ADCON1    ;CONFIGURA PINES 
                    ;DIGITALES

 MOVLW   0X01       ;ESCRIBE UN 1 EN W
 MOVWF   TRISA      ;CONFIGURA ENTRADAS 
                    ;Y SALIDAS
                    ;RA0 ENTRADA
                    ;RA1 A RA5 SALIDAS
 BSF     STATUS,RP0 ;ACCEDE AL BANCO 1
 MOVLW   0X00       ;ESCRIBE 0 EN W
 MOVWF   TRISB      ;TODOS LOS PINES 
                    ;SALIDA 
 BCF     STATUS,RP0 ;VUELVE AL BANCO 0
 

INICIO

 BCF     PORTA,1    ;ASEGURA OFF PIN1
 BCF     PORTA,2    ;ASEGURA OFF PIN2
 BCF     PORTA,3    ;ASEGURA OFF PIN3
 BCF     PORTA,4    ;ASEGURA OFF PIN4
 BCF     PORTA,5    ;ASEGURA OFF PIN5

 BCF     PORTB,0    ;ASEGURA OFF PIN0
 BCF     PORTB,1    ;ASEGURA OFF PIN1
 BCF     PORTB,2    ;ASEGURA OFF PIN2


 BTFSS   PORTA,0    ;PREGUNTA BIT 0 ES
                    ;1
 GOTO    INICIO     ;VA A INICIO
 MOVLW   0X02       ;ESCRIBE UN 2
 MOVWF   PORTA      ;PONE EL 2 EN 
                    ;PORTA
 CALL    UJU       ; LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW   0X06       ;ESCRIBE UN 6 EN
 MOVWF   PORTA      ;PORTA

 CALL    UJU       ; LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW   0XE          ;ESCRIBE UN 14
 MOVWF   PORTA        ;EN PORTA       

 
 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW   0X1E          ;ESCRIBE UN 1E
 MOVWF   PORTA        ;EN PORTA 

 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA

 

 MOVLW   0X3E       ;ESCRIBE UN  0 EN W
 MOVWF   PORTA      ;ESCRIBE EL 0 EN 
                    ;EL PUERTO A
 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA


 MOVLW   0X01        ;ESCRIBE UN 80 HEX
 MOVWF  PORTB       ;PONE EL 1 HEX EN
                    ;PORTB

 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA


 MOVLW   0X3          ;ESCRIBE UN 3H
 MOVWF   PORTB        ;EN PORTAB
 
 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW   0X7         ;ESCRIBE UN 7H
 MOVWF   PORTB        ;EN PORTB 
  
 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA


 MOVLW   0X3          ;ESCRIBE UN 3H
 MOVWF   PORTB        ;EN PORTAB 

 CALL    UJU      ;LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW   0X1          ;ESCRIBE UN 1
 MOVWF   PORTB        ;EN PORTB

 CALL    UJU      ;LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW   0X00       ;ESCRIBE UN 0 A W
 MOVWF   PORTB      ;PONE EL 0 A PORTB

 CALL    UJU      ;LLAMA TIEMPO DE
                    ;ESPERA
 

 MOVLW    0X1E       ;ESCRIBE UN 1Eh 
 MOVWF   PORTA       ;ESCRIBE UN 1Eh
                     ;PORTA

 CALL    UJU      ;LLAMA TIEMPO DE
                    ;ESPERA


 MOVLW    0XE       ;ESCRIBE UN Eh 
 MOVWF   PORTA       ;ESCRIBE UN Eh EN
                     ;PORTA
 

 CALL    UJU      ;LLAMA TIEMPO DE
                    ;ESPERA


 MOVLW    0X6       ;ESCRIBE UN 6h 
 MOVWF   PORTA       ;ESCRIBE UN 6h EN
                     ;PORTA

 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA

 
 MOVLW    0X2       ;ESCRIBE UN 2h 
 MOVWF   PORTA       ;ESCRIBE UN 2h EN
                     ;PORTA


 CALL    UJU       ;LLAMA TIEMPO DE
                    ;ESPERA

 MOVLW   0X00       ;ESCRIBE UN 0
 MOVWF   PORTA      ;LO MUEVE AL PUERTO A

UJU
 
 MOVLW  0XEE       ;ESCRIBE UN 255 EN W
 MOVWF TESP         ; Y LO PONE EN TESP
REP                    ;PARA DEJAR LISTO PROXIMO CALL
 DECFSZ TESP,1      ;DECREMENTA EN UNO
                    ;Y PREGUNTA SI ES 0
 GOTO REP           ;SI NO ES 0 VA A REP


 MOVLW .255
 MOVWF TESP

REP2
 DECFSZ TESP,1      ;DECREMENTA EN UNO
                    ;Y PREGUNTA SI ES 0
 GOTO REP2           ;SI NO ES 0 VA A REP
 BTFSS   PORTA,0    ;SI SI ES O PREGUNTA SI
                     ;EL BIT 0 EN PUERTO A
 GOTO INICIO
                    ;ES IGUAL A 1
 RETURN             ;RETORNA
                   
 END
```


----------



## VEGATRONICA (May 15, 2012)

Mmm, lastima no poder ayudarte, no manejo assembler solo C, tal vez otro compañero pueda ayudarte saludos


----------



## D@rkbytes (May 16, 2012)

guillermovasben1 dijo:


> Saludos tengo un problema con la programación del pic16f877a ya escribi un programa que hace lo que necesito, encender unos leds en secuencias,(soy nuevo programando) pero aun no logro establecer el tiempo de espera de un segundo ya coloque dos subrutinas seguidas cargadas con .255d en un registro de propósito general pero aun así el tiempo es demasiado corto. si alguien pudiera indicarme como hacerlo se lo agradeceria.


Saludos gullermovasben1
Unos detalles acerca de tu código...
Para no repetir las rutinas de tu programa, puedes usar las instrucciones RRF y RLF
para ir rotando los bits de los puertos sin necesidad de tanto código.

Después de esta parte del código te hace falta un goto

CALL    UJU       ;LLAMA TIEMPO DE ESPERA

 MOVLW   0X00       ;ESCRIBE UN 0
 MOVWF   PORTA      ;LO MUEVE AL PUERTO A
 GOTO INICIO     ; <-- Ponerlo aquí

 Para ahorrarte el cálculo de los tiempos de retardo, puedes usar el programa PIC DELAYER
Más conocido como PDEL, PicDel o Pic Delay.
Te dará un código como este...

```
;-------------------------------------------------------------
; Generado con PDEL ver SP  r 1.0  el 16/05/2012 Hs 12:09:37 a.m.
; Descripcion: Delay 1000000 ciclos
;-------------------------------------------------------------
DEMORA  movlw     .14       ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .72       ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .247      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;-------------------------------------------------------------

Requerimientos   
-----------------
- Declaracion de PDel0 (registro)
- Declaracion de PDel1 (registro)
- Declaracion de PDel2 (registro)
- 1 nivel Stack

Ejemplo de uso
--------------
call DEMORA      ; Delay 1000000 ciclos (incluyen  call+return)
```
Este código genera un retardo de 1 segundo con un oscilador a 4MHz.

PD. Estas usando el puerto A para encender LED's, pero recuerda que RA4 es Open Drain.
En ese Bit no podrás encender un LED con cátodo a tierra, a menos que inviertas la lógica y los LED.
Te recomiendo usar otro puerto o poner un transistor
con sus respectivas resistencias para controlar el encendido del LED por RA4

Suerte y hasta luego.


----------



## guillermovasben1 (May 16, 2012)

Gracias sin embargo la instruccion RLF y RRF no me permite mantener encendidos los leds lo intentare con el programa para el retardo gracias de nuevo Darkbytes



Gracia de igula forma Soma


----------



## andbrs (Mar 16, 2013)

hola como dice el titulo necesito hacer 3 secuencias de led con un microcontrolador pues yo tengo ya 2 secuencias lo que no puedo hacer es integrar la tercera secuencia como sabrán existen solo dos estados para electrónica digital y esos dos estado son para mi el case1 y el case2 (utilice un SWITCH)entonces si alguien pues ayudarme con este problema para integrar ese tercer estado mi profesor me había hablado de hacer una bandera (no se que significa) 
GRACIAS DE ANTEMANO 
esta claro que utilizo proteus para simular le dejo la programación

```
#include <main.h>


void main()
{
   int16 i;
   int16 a;
   int16 b;
   int16 c;
   int16 d;
   int16 e;
   int16 f;
   int16 g;
   int16 h;
   int16 j;
   set_tris_b(0x00);
   set_tris_a(0x01);
   set_tris_c(0x00);
  
   while(TRUE)
   {
      
      i=100;
      a=100;
      b=100;
      c=100;
      d=100;
      e=100;
      f=100;
      g=100;
      h=100;
      j=100;
    
    switch(input(PIN_A0),input(PIN_C0))
      {
   
   //para cambiar de secuencia
     case 0:
     output_high(PIN_C1);
      delay_ms(h);
      output_low(PIN_C1);
      delay_ms(h);
      output_high(PIN_B7);
      delay_ms(j);
      output_low(PIN_B7);
      delay_ms(j);
      output_high(PIN_C2);
      delay_ms(i);
      output_low(PIN_C2);
      delay_ms(i);
      output_high(PIN_B6);
      delay_ms(a);
      output_low(PIN_B6);
      delay_ms(a);
      output_high(PIN_B0);
      delay_ms(b);
      output_low(PIN_B0);
      delay_ms(b);
      output_high(PIN_B5);
      delay_ms(c);
      output_low(PIN_B5);
      delay_ms(c);
      output_high(PIN_B1);
      delay_ms(d);
      output_low(PIN_B1);
      delay_ms(d);
      output_high(PIN_B4);
      delay_ms(e);
      output_low(PIN_B4);
      delay_ms(e);
      output_high(PIN_B2);
      delay_ms(f);
      output_low(PIN_B2);
      delay_ms(f);
      output_high(PIN_B3);
      delay_ms(g);
      output_low(PIN_B3);
      delay_ms(g);
      break;
     
     case 1:
        output_high(PIN_C1);
      delay_ms(h);
      output_low(PIN_C1);
      delay_ms(h);
      output_high(PIN_C2);
      delay_ms(j);
      output_low(PIN_C2);
      delay_ms(j);
      
     output_high(PIN_B0);
      delay_ms(i);
      output_low(PIN_B0);
      delay_ms(i);
      output_high(PIN_B1);
      delay_ms(a);
      output_low(PIN_B1);
      delay_ms(a);
      output_high(PIN_B2);
      delay_ms(b);
      output_low(PIN_B2);
      delay_ms(b);
      output_high(PIN_B3);
      delay_ms(c);
      output_low(PIN_B3);
      delay_ms(c);
      output_high(PIN_B4);
      delay_ms(d);
      output_low(PIN_B4);
      delay_ms(d);
      output_high(PIN_B5);
      delay_ms(e);
      output_low(PIN_B5);
      delay_ms(e);
      output_high(PIN_B6);
      delay_ms(f);
      output_low(PIN_B6);
      delay_ms(f);
      output_high(PIN_B7);
      delay_ms(g);
      output_low(PIN_B7);
      delay_ms(g);
      break;
    
     
      
   }
   }

}
```


----------



## D@rkbytes (Mar 16, 2013)

Así no lo hagas, incrementa un contador y entonces podrás seleccionar varios cases no solo 1 ó 0


----------



## andbrs (Mar 16, 2013)

hey amigo primero gracias por responder si me pudieras dar alguno indicacion o un pequeña ayuda te la agardeceria mucho
yo se que incrementrlos es con dos mas pero que estructura utilizo 
GRACIAS


----------



## D@rkbytes (Mar 17, 2013)

Viene siendo algo así...

Si botón = (presionado)
Contador++

Switch (Contador)
Case 1:
Secuencia1
Case 2:
Secuencia2
Case 3:
Secuencia3

Nota:
Para cambiar de secuencia tienes que esperar a que termine y así poder pasar a la otra.

Mira el ejemplo que adjunto, es sencillo pero te dará una idea de como hacerlo.

Suerte.


----------



## juan jose perich (Mar 25, 2013)

Hola a todos  soy Juan José.
Tengo un secuenciador con efectos pero no se como agregarle control de velocidad con potenciómetro o con 2 botones de suma y baja. Mi correo es 


*Como no cumplo las Políticas del Foro. Me editaron el mensaje.*​


 Estoy usando Pic Simulator Ide.

Mi programación es esta:


```
TRISA.4 = 1  'Configuramos el pin 3 (PORTA.4) como entrada
TRISB = 0  'Configuramos todo el puerto B (PORTB) como salida
Symbol boton = PORTA.4  'Nombramos boton al pin 3
Dim contador As Byte  'Definimos una variable para a medida que mantengamos apretado el boton vaya incrementandose y asi seleccionar el efecto correspondiente
contador = 0  'Inicializamos el contador
empieza:  'Etiqueta para saber donde empieza el programa, aqui retornaremos una vez seleccionado el efecto
If boton = 1 Then  'Si el boton es presionado hacer lo siguiente,1(positivo) 2(negativo),boton
contador = contador + 1
If contador = 50 Then contador = 50  'El numero puede variar dependiendo de los efectos

Endif

If contador = 0 Then  '1er efecto
efecto1:

Endif

If contador = 5 Then  '2do efecto
efecto2:

Endif

If contador = 10 Then  '3er efecto
efecto3:

Endif

If contador = 15 Then  '4to efecto
efecto4:

Endif

If contador = 20 Then  '5to efecto
efecto5:

Endif

If contador = 25 Then  '6to efecto
efecto6:

Endif

If contador = 30 Then  '7to efecto
efecto7:

Endif

If contador = 35 Then  '8to efecto
efecto8:

Endif

If contador = 40 Then  ' 9to efecto
efecto9:

Endif

If contador = 45 Then 10mo efecto
efecto 10:


Endif

Goto empieza  'volvemos a empezar de nuevo el ciclo
```
-------------------------------------------------------------

Como ven, no están incluidos los efectos pero los tengo en block de notas,
solo hay que copiar y pegar el efecto¿?:

Si hay alguien que pueda ayudarme lo agradecería mucho.


----------



## Ruben_00 (Mar 21, 2020)

Hola. Soy nuevo en la programación de PIC. Necesito volver repetitiva la siguiente secuencia:

```
#bit led=0x06.5

//#define pin_A0 2

void main(void)
{
trisa=0xff;

portb=0; // Configuración de puertos
trisb=0;
trisc=0;
portc=1;
portb=1;
cont=0;
contu=1;

for (cont=1;cont<=8;cont++)
{
   delay_ms(200);
   portb=portb<<contu;
}
}
```

Se prenden secuencialmente los 8 led pero quiero que quede en un bucle infinito.
¿Dónde pongo el while? Me sale error con el compilador.

Gracias.


----------



## capitanp (Mar 21, 2020)

```
void loop()
```


----------



## Ruben_00 (Mar 21, 2020)

gracias, lo voy a probar


----------



## D@rkbytes (Mar 22, 2020)

Ruben_00 dijo:


> Se prenden secuencialmente los 8 led pero quiero que quede en un bucle infinito.
> ¿Dónde pongo el while? Me sale error con el compilador.




```
#include <16F877A.h>
#use delay (CRYSTAL = 4 MHz)

#byte portb = getenv("SFR:PORTB")

void main (void)
{
    int i;
    
    set_tris_b(0x00);
    
    portb = 1;
    delay_ms(250);
    
    while (TRUE)
    {
        for(i = 1; i < 8; i++)
        {    // Desplazamiento hacia la izquierda.
            portb <<= 1;
            delay_ms(250);
        }
        
        for(i = 1; i < 8; i++)
        {    // Desplazamiento hacia la derecha.
            portb >>= 1;
            delay_ms(250);
        }
    }
}
```


----------



## Ruben_00 (Mar 22, 2020)

Desplazamiento!! voy a chequearlo, gracias


----------



## Eduardo (Mar 22, 2020)

En lugar del FOR

```
for (cont=1;cont<=8;cont++)
{
   delay_ms(200);
   portb=portb<<contu;
}
```

Usas un WHILE con ROTATE_LEFT     (CCS)

```
portb=1;
    while(1){
        delay_ms(200) ;
        rotate_left(&portb,1) ;     // o rotate_right
    }
```


----------



## Ruben_00 (Mar 22, 2020)

Me han funcionado sus recomendaciones


----------

