Pergunta

Barrido de led

L
@lupita
430 visualizações
1 comentários

Es un barrido de leds en una tablilla protoboard donde tienen que prender los led de izquierda a derecha y de derecha a izquierda

Arduino (C++)
1#include <xc.h>
2
3#define _XTAL_FREQ 4000000
4
5// CONFIG
6#pragma config FOSC = INTRC_NOCLKOUT
7#pragma config WDTE = OFF
8#pragma config PWRTE = ON
9#pragma config MCLRE = ON
10#pragma config CP = OFF
11#pragma config CPD = OFF
12#pragma config BOREN = ON
13#pragma config IESO = OFF
14#pragma config FCMEN = OFF
15#pragma config LVP = OFF
16
17void main(void)
18{
19    // Oscilador interno a 4 MHz
20    OSCCON = 0x61;
21
22    // PORTD como salida
23    TRISD = 0x00;
24
25    // Apagar todos los LEDs al comenzar
26    PORTD = 0x00;
27
28    while(1)
29    {
30        // ===== IZQUIERDA A DERECHA =====
31
32        PORTD = 0b00000001;   // LED 1 - RD0
33        __delay_ms(500);
34
35        PORTD = 0b00000010;   // LED 2 - RD1
36        __delay_ms(500);
37
38        PORTD = 0b00000100;   // LED 3 - RD2
39        __delay_ms(500);
40
41        PORTD = 0b00001000;   // LED 4 - RD3
42        __delay_ms(500);
43
44        PORTD = 0b00010000;   // LED 5 - RD4
45        __delay_ms(500);
46
47        PORTD = 0b00100000;   // LED 6 - RD5
48        __delay_ms(500);
49
50        PORTD = 0b01000000;   // LED 7 - RD6
51        __delay_ms(500);
52
53        PORTD = 0b10000000;   // LED 8 - RD7
54        __delay_ms(500);
55
56
57        // ===== DERECHA A IZQUIERDA =====
58
59        PORTD = 0b01000000;   // LED 7
60        __delay_ms(500);
61
62        PORTD = 0b00100000;   // LED 6
63        __delay_ms(500);
64
65        PORTD = 0b00010000;   // LED 5
66        __delay_ms(500);
67
68        PORTD = 0b00001000;   // LED 4
69        __delay_ms(500);
70
71        PORTD = 0b00000100;   // LED 3
72        __delay_ms(500);
73
74        PORTD = 0b00000010;   // LED 2
75        __delay_ms(500);
76
77        PORTD = 0b00000001;   // LED 1
78        __delay_ms(500);
79    }
80}

1 comentários

Entre para comentar.

ohmi
@ohmi

¡Hola Bridget! Soy Ohmi. Tu barrido funciona: en el PIC con OSCCON = 0x61 el oscilador interno queda a 4 MHz, igual que _XTAL_FREQ, así que los 500 ms son reales. Para acortarlo, la ida y la vuelta caben en dos bucles con desplazamiento de bits (código abajo). El primero enciende RD0 → RD7 y el segundo vuelve de RD6 a RD1, así los extremos no se repiten. No olvides una resistencia de 220–330 Ω por LED. Y si algún día lo quieres en Arduino, ESP32 o Raspberry Pi Pico, en BlueGrays están «Luz secuencial LED» y el escáner «Knight Rider» con circuito y código. ¡El coche fantástico estaría orgulloso!

Arduino (C++)
1unsigned char i;
2
3while (1)
4{
5    for (i = 0; i < 8; i++)   // izquierda a derecha
6    {
7        PORTD = 1 << i;
8        __delay_ms(500);
9    }
10    for (i = 6; i > 0; i--)   // derecha a izquierda
11    {
12        PORTD = 1 << i;
13        __delay_ms(500);
14    }
15}