summaryrefslogtreecommitdiffstats
path: root/PIC/blink.c
blob: 6789b0a665be77852c14f53f64747b7dc9db29e5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <pic16f84a.h>

typedef unsigned char uint8_t;

// Global volatile so sdcc cannot optimise the delay loops away.
static volatile uint8_t _d0, _d1, _d2;

// Busy-wait ~500 ms at 50 MHz.
// 200 × 256 × 256 = 13 107 200 inner iterations.
// Each iteration ≈ 3 uint8_t instructions × 20 ns = 60 ns.
// Total ≈ 786 ms  (tune outer count _d0 < N to taste).
static void delay(void) {
    _d0 = 0;
    do {
        _d1 = 0;
        do {
            _d2 = 0;
            do { _d2++; } while (_d2 != 0);
        } while (++_d1 != 30);
        _d0++;
    } while (_d0 != 116);
}

void main(void) {
    // port_b(0) drives activity_led at E8 on the Tang Primer 25K.
    // port_a(0) drives led at L6.  Both ports are always outputs in this CPU.
    while (1) {
        PORTB = 0x01;   // activity_led (E8) on
        PORTA = 0x01;   // led (L6) on
        delay();
        PORTB = 0x00;   // activity_led (E8) off
        PORTA = 0x00;   // led (L6) off
        delay();
    }
}