bitwurschtel.c


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