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 | }
|