summaryrefslogtreecommitdiff
path: root/tests/enable-leds.c
blob: 315f665999963b5a38104bcd99bfdecd4f098978 (plain)
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
 * File:   enable_digit.c
 * Author: Peter Wu
 */

/**
 * Determines the bitmask necessary for enabling LED segments on a LED
 * @param number The number to be displayed
 * @return The segment bits to be enabled
 */
static int segment_mask(int number) {
    switch (number) {
        case 0:
            return 0x7e;// 01111110
        case 1:
            return 0x30;// 00110000
        case 2:
            return 0x6d;// 01101101
        case 3:
            return 0x79;// 01111001
        case 4:
            return 0x33;// 00110011
        case 5:
            return 0x5b;// 01011011
        case 6:
            return 0x5f;// 01011111
        case 7:
            return 0x70;// 01110000
        case 8:
            return 0x7f;// 01111111
        case 9:
            return 0x7b;// 01111011
    }
    // in case you do not pass the right arguments, turn everything on
    return 0xff;
}

/**
 * Displays a digit at a certain index
 * @param digit The digit to be displayed (between 0 and 9 inclusive)
 * @param index The number of the LED segment to be enabled, counting from the
 * right side. index 0 means that all LEDS are disabled. The n-th LED can be
 * selected with index n with 1 <= n <= 6
 */
void enable_digit(int digit, int index) {
    int *digitp = (int*)-7;
    int *segmentp = (int*)-8;

    // first set the segments to be enabled
    *segmentp = segment_mask(digit);
    // enable bit "index" if index > 0
    *digitp = index ? 1 << (index - 1) : 0;
}
int main() {
    enable_digit(0, 0);
    return 0;
}