bitwurschtel.c


1
#include <stdint.h>
2
#include <avr/pgmspace.h>
3
4
static const uint8_t mapping[] PROGMEM =
5
{
6
    /*
7
     *  31......23......15.......7......0
8
     *   d4     d3      d2      d1
9
     *   7...3..07...3..07...3..07...3..0
10
     */
11
    /* 0b00000000000000000000000100000000ul, /* 1A */
12
    8,
13
    /* 0b00000000000000000000001000000000ul, */
14
    9,
15
    /* 0b00000000000000001000000000000000ul, */
16
    15,
17
    /* 0b00000000000000010000000000000000ul, */
18
    16,
19
    /* 0b00000000000000100000000000000000ul, */
20
    17,
21
    /* 0b00000000000000000000000010000000ul, */
22
    7,
23
    /* 0b00000000000000000000000001000000ul, /* 1G */
24
    6,
25
    /* 0b00000000000000000000000000001000ul, /* 2A */
26
    3,
27
    /* 0b00000000000000000000000000010000ul, */
28
    4,
29
    /* 0b10000000000000000000000000000000ul, */
30
    31,
31
    /* 0b00000000000000000001000000000000ul, */
32
    12,
33
    /* 0b00000000000000000100000000000000ul, */
34
    14,
35
    /* 0b00000000000000000000000000000100ul, */
36
    2,
37
    /* 0b00000000000000000010000000000000ul, /* 2G */
38
    13,
39
    /* 0b00000000000100000000000000000000ul, /* 3A */
40
    20,
41
    /* 0b00000001000000000000000000000000ul, */
42
    24,
43
    /* 0b00000010000000000000000000000000ul, */
44
    25,
45
    /* 0b00000100000000000000000000000000ul, */
46
    26,
47
    /* 0b00001000000000000000000000000000ul, */
48
    27,
49
    /* 0b00000000001000000000000000000000ul, */
50
    21,
51
    /* 0b00000000000000000000000000100000ul, /* 3G */
52
    5,
53
};
54
55
extern uint8_t lcd[8];
56
57
void SetDigit(uint8_t digit, uint8_t value)
58
{
59
    uint8_t *lcdptr = (digit & 1)? lcd + 1: lcd;
60
61
    digit >>= 1;
62
    if (digit-- == 0)
63
    {
64
        if (value & 1)
65
            lcdptr[2] |= 0b01000000;
66
        return;
67
    }
68
69
    const uint8_t *romptr = mapping;
70
    if (digit == 1) romptr += 7;
71
    else romptr += 14;
72
73
    for (uint8_t i = 0; i < 7; i++)
74
    {
75
        uint32_t bits = 1 << pgm_read_byte(romptr + i);
76
        if (value & 1)
77
            *(uint32_t *)lcdptr |= bits;
78
        value >>= 1;
79
    }
80
}